コード例 #1
0
        private static void Sign(UnsignedTransaction unsignedTransaction, string privateKey, bool isHex, bool addPubKey,
                                 bool forceCompressed = false)
        {
            bool compressed = false;
            var  bytes      = isHex ? privateKey.FromHexString() : GetBytesFromBase58Key(privateKey);

            if (bytes.Length == 33 && bytes[32] == 1)
            {
                compressed = true;
                bytes      = bytes.Take(32).ToArray();
            }

            var privKeyB       = new BigInteger(1, bytes);
            var parms          = SecNamedCurves.GetByName("secp256k1");
            var curve          = new ECDomainParameters(parms.Curve, parms.G, parms.N, parms.H);
            var halfCurveOrder = parms.N.ShiftRight(1);

            var point = curve.G.Multiply(privKeyB);

            if (compressed || forceCompressed)
            {
                point = new FpPoint(curve.Curve, point.X, point.Y, true);
            }

            var publicKey = point.GetEncoded();
            var signer    = new ECDsaSigner();
            var privKey   = new ECPrivateKeyParameters(privKeyB, curve);

            signer.Init(true, privKey);

            foreach (string toSign in unsignedTransaction.ToSign)
            {
                if (addPubKey)
                {
                    unsignedTransaction.PubKeys.Add(publicKey.ToHexString());
                }

                var components = signer.GenerateSignature(toSign.FromHexString());
                var r          = components[0];
                var s          = components[1];

                if (s.CompareTo(halfCurveOrder) > 0)
                {
                    s = curve.N.Subtract(s);
                }

                using (var ms = new MemoryStream())
                    using (var asn = new Asn1OutputStream(ms)) {
                        var seq = new DerSequenceGenerator(asn);
                        seq.AddObject(new DerInteger(r));
                        seq.AddObject(new DerInteger(s));

                        seq.Close();

                        string signedString = ms.ToArray().ToHexString();

                        unsignedTransaction.Signatures.Add(signedString);
                    }
            }
        }
コード例 #2
0
        private Task <UnsignedTransaction> processSend(UnsignedTransaction unsignedTx, string fromPrivate)
        {
            try
            {
                if (unsignedTx.IsError)
                {
                    return(Task.FromResult(unsignedTx));
                }

                // NOTE: Quickfix - API was failing without this field being initialized
                unsignedTx.Transactions.Confirmed = DateTime.UtcNow;

                // SIGN

                unsignedTx.Signatures = new List <string>();
                unsignedTx.PubKeys    = new List <string>();

                Sign(unsignedTx, fromPrivate, true, true, true);

                return(PostAsync <UnsignedTransaction>("txs/send", unsignedTx));
            }
            catch (Exception ex)
            {
                throw new Exception();
            }
        }
コード例 #3
0
        public static string EncodeHex(this UnsignedTransaction unsigned)
        {
            var hex = unsigned.Payload.EncodeHex();

            hex += unsigned.Nonce.EncodeHex();
            hex += unsigned.Fee.EncodeHex();
            hex += unsigned.Attributes.EncodeHex();

            return(hex);
        }
コード例 #4
0
        public async Task <string> BuildTransactionAsync(
            string from,
            string to,
            BigInteger amount,
            BigInteger gasAmount,
            BigInteger gasPrice,
            BigInteger?nonce)
        {
            var transaction = new UnsignedTransaction
            {
                Amount    = amount,
                GasAmount = gasAmount,
                GasPrice  = gasPrice,
                Nonce     = nonce ?? await GetNextNonceAsync(from),
                To        = to
            };

            return(MessagePackSerializer
                   .Serialize(transaction)
                   .ToHex(prefix: true));
        }
コード例 #5
0
        public static Transaction MakeTransaction(
            Account account,
            Payload payload,
            long nonce,
            long fee          = 0,
            string attributes = "")
        {
            var unsigned = new UnsignedTransaction
            {
                Payload    = payload,
                Nonce      = (ulong)nonce,
                Fee        = fee,
                Attributes = attributes.FromHexString()
            };

            var transaction = new Transaction
            {
                UnsignedTransaction = unsigned
            };

            TransactionFactory.SignTransaction(account, transaction);

            return(transaction);
        }