private void RemoteNode_TransactionReceived(object sender, Transaction tx) { if (Blockchain.Default == null) return; if (Blockchain.Default.ContainsTransaction(tx.Hash)) return; if (!Blockchain.Default.AddTransaction(tx)) return; RelayInternalAsync(tx).Void(); if (NewInventory != null) NewInventory(this, tx); }
public Transaction SignTransaction(UnsignedTransaction utx) { const HashType hashType = HashType.SIGHASH_ALL; Transaction tx = new Transaction { Version = utx.Version, Inputs = new TransactionInput[utx.Inputs.Length], Outputs = utx.Outputs, LockTime = utx.LockTime }; for (uint i = 0; i < utx.Inputs.Length; i++) { tx.Inputs[i] = new TransactionInput { PrevHash = utx.Inputs[i].TxId, PrevIndex = utx.Inputs[i].Index, Sequence = uint.MaxValue }; if (utx.Inputs[i].ScriptHash == null) return null; WalletEntry entry = FindEntry(utx.Inputs[i].ScriptHash); if (entry == null) return null; BigInteger[] signature; using (entry.Decrypt()) { ECDsa signer = new ECDsa(entry.PrivateKey, ECCurve.Secp256k1); signature = signer.GenerateSignature(utx.GetHashForSigning(hashType, i)); } byte[] sigEncoded; using (MemoryStream ms = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(ms)) { byte[] r = signature[0].ToByteArray().Reverse().ToArray(); byte[] s = signature[1].ToByteArray().Reverse().ToArray(); writer.Write((byte)0x30); writer.Write((byte)(2 + r.Length + 2 + s.Length)); writer.Write((byte)0x02); writer.Write((byte)r.Length); writer.Write(r); writer.Write((byte)0x02); writer.Write((byte)s.Length); writer.Write(s); writer.Write((byte)hashType); writer.Flush(); sigEncoded = ms.ToArray(); } using (ScriptBuilder sb = new ScriptBuilder()) { sb.Push(sigEncoded); sb.Push(entry.PublicKey.EncodePoint(entry.Compressed)); tx.Inputs[i].Script = sb.ToArray(); } } return tx; }