Пример #1
0
        private static void GenerateAddressFromPrivateKey()
        {
            Console.WriteLine("Random private key --> public key --> address");
            Console.WriteLine("---------------------------------------------");

            AsymmetricCipherKeyPair keyPair = EncryptionUtils.GenerateAsymmetricKeyPair();

            BigInteger privateKey = ((ECPrivateKeyParameters)keyPair.Private).D;

            Console.WriteLine("Private key (64 hex digits):\r\n" + privateKey.ToString(16));
            Console.WriteLine("Private key (BigInteger):\r\n" + privateKey.ToString(10));

            ECPoint publicKey = ((ECPublicKeyParameters)keyPair.Public).Q;

            Console.WriteLine("Public key (2 * BigIntegers):\r\n({0}, {1})",
                              publicKey.XCoord.ToBigInteger(),
                              publicKey.YCoord.ToBigInteger());
            Console.WriteLine("Public key (2 * 64 hex digits):\r\n({0}, {1})",
                              publicKey.XCoord,
                              publicKey.YCoord);

            string publicKeyCompressed = HashUtils.ToHexCompressed(publicKey);

            Console.WriteLine("Public key compressed (65 hex digits):\r\n" +
                              publicKeyCompressed);

            byte[] publicAddress = HashUtils.ComputeRIPEMD160(Utils.GetBytes(publicKeyCompressed));
            Console.WriteLine("Public address (40 hex digits):\r\n" + publicAddress.ToHex());
        }
        private static void Main(string[] args)
        {
            //string key = EncryptionUtils.GetRandomBytes(32).ToHex();
            //string key = "0e549dbcccfbd11e255f6037e1e640efaca0e19966ac77a592fdf06d295952a4";
            string key = "7e4670ae70c98d24f3662c172dc510a085578b9ccc717e6c2f4e547edd960a34";

            EthECKey privateKey = new EthECKey(key);

            byte[] privateKeyBytes = privateKey.GetPrivateKeyAsBytes();
            Console.WriteLine("Private key (64 hex digits):\r\n" + privateKeyBytes.ToHex());

            byte[] publicKeyBytes = privateKey.GetPubKeyNoPrefix();
            Console.WriteLine("Public key uncompressed (2 * 64 hex digits):\r\n" + publicKeyBytes.ToHex());

            ECPublicKeyParameters publicKeyParams = new ECKey(privateKeyBytes, true).GetPublicKeyParameters();
            string publicKeyCompressed            = HashUtils.ToHexCompressed(publicKeyParams.Q);

            Console.WriteLine("Public key compressed (65 hex digits):\r\n" + publicKeyCompressed);

            byte[] publicAddress = HashUtils.ComputeRIPEMD160(Utils.GetBytes(publicKeyCompressed));
            Console.WriteLine("Public address (40 hex digits):\r\n" + publicAddress.ToHex());
        }
Пример #3
0
        private static void SignAndVerifyTransaction(
            string privateKey,
            string recipientAddress,
            string dateCreatedIso8601,
            int value,
            int fee)
        {
            Console.WriteLine("Generate and sign a transaction");
            Console.WriteLine("-------------------------------");

            Console.WriteLine("Sender private key:\r\n" + privateKey);

            BigInteger senderPrivateKey          = new BigInteger(privateKey, 16);
            ECPoint    senderPublicKey           = EncryptionUtils.GetPublicKey(senderPrivateKey);
            string     senderPublicKeyCompressed = HashUtils.ToHexCompressed(senderPublicKey);

            Console.WriteLine("Sender public key compressed (65 hex digits):\r\n" +
                              senderPublicKeyCompressed);

            string senderAddress = HashUtils.ComputeRIPEMD160(
                Utils.GetBytes(senderPublicKeyCompressed)).ToHex();

            Console.WriteLine("Sender address (40 hex digits):\r\n" + senderAddress);

            Transaction transaction = new Transaction
            {
                Sender             = senderAddress,
                Recipient          = recipientAddress,
                SenderPublicKey    = senderPublicKeyCompressed,
                Value              = value,
                Fee                = fee,
                DateCreatedIso8601 = dateCreatedIso8601
            };

            string transactionJsonFormatted = JsonUtils.Serialize(transaction);

            Console.WriteLine("Transaction (JSON, formatted):\r\n" + transactionJsonFormatted);

            string transactionJson = JsonUtils.Serialize(transaction, false);

            Console.WriteLine("Transaction (JSON):\r\n" + transactionJson);

            byte[] transactionHash = HashUtils.ComputeSha256(Utils.GetBytes(transactionJson));
            Console.WriteLine("Transaction hash (SHA256):\r\n" + transactionHash.ToHex());

            ECDSASignature transactionSignature =
                EncryptionUtils.Sign(transactionHash, senderPrivateKey);
            string r = transactionSignature.R.ToString(16);
            string s = transactionSignature.S.ToString(16);

            Console.WriteLine("Transaction signature:\r\n({0}, {1})", r, s);

            transaction.Signature = new Signature
            {
                R = r,
                S = s
            };

            string signedTransactionJson = JsonUtils.Serialize(transaction);

            Console.WriteLine("Signed transaction (JSON):\r\n" + signedTransactionJson);

            ECPublicKeyParameters parameters =
                EncryptionUtils.GetPublicKeyParameters(privateKey);
            bool valid = EncryptionUtils.VerifySignature(
                transactionHash, transactionSignature, parameters);

            Console.WriteLine("Signature valid: " + valid);
        }
        private static CreateTransactionRequest CreateAndSignTransaction(
            string privateKey,
            string recipientAddress,
            string dateCreatedIso8601,
            long value,
            long fee,
            string data)
        {
            Console.WriteLine("Generate and sign a transaction");
            Console.WriteLine("-------------------------------");

            Console.WriteLine("Sender private key:\r\n" + privateKey);

            BigInteger senderPrivateKey          = new BigInteger(privateKey, 16);
            ECPoint    senderPublicKey           = EncryptionUtils.GetPublicKey(senderPrivateKey);
            string     senderPublicKeyCompressed = EncryptionUtils.ToHexCompressed(senderPublicKey);

            Console.WriteLine("Sender public key compressed (65 hex digits):\r\n" +
                              senderPublicKeyCompressed);

            string senderAddress = HashUtils.ComputeRIPEMD160(
                senderPublicKeyCompressed.GetBytes()).ToHex();

            Console.WriteLine("Sender address (40 hex digits):\r\n" + senderAddress);

            TransactionData transaction = new TransactionData
            {
                From         = senderAddress,
                To           = recipientAddress,
                Value        = value,
                Fee          = fee,
                DateCreated  = dateCreatedIso8601,
                Data         = data,
                SenderPubKey = senderPublicKeyCompressed
            };

            string transactionJsonFormatted = JsonUtils.Serialize(transaction);

            Console.WriteLine("Transaction (JSON, formatted):\r\n" + transactionJsonFormatted);

            string transactionJson = JsonUtils.Serialize(transaction, false);

            Console.WriteLine("Transaction (JSON):\r\n" + transactionJson);

            byte[] transactionDataHash = HashUtils.ComputeSha256(transactionJson.GetBytes());
            Console.WriteLine("Transaction data hash (SHA256):\r\n" + transactionDataHash.ToHex());

            BigInteger[] transactionSignature =
                EncryptionUtils.Sign(transactionDataHash, senderPrivateKey);
            string r = transactionSignature[0].ToString(16);
            string s = transactionSignature[1].ToString(16);

            Console.WriteLine("Transaction signature:\r\n({0}, {1})", r, s);

            CreateTransactionRequest request =
                CreateTransactionRequest.FromTransactionData(transaction);

            request.SenderSignature = new string[] { r, s };

            string signedTransactionJson = JsonUtils.Serialize(request);

            Console.WriteLine("Signed transaction (JSON):\r\n" + signedTransactionJson);

            return(request);
        }