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); } } }
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(); } }
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); }
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)); }
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); }