public static byte[] EncodeTransaction(UInt32 Version, ImmutableArray<TxInput> Inputs, ImmutableArray<TxOutput> Outputs, UInt32 LockTime) { var stream = new MemoryStream(); using (var writer = new BinaryWriter(stream)) { writer.Write4Bytes(Version); writer.WriteVarInt((UInt64)Inputs.Length); foreach (var input in Inputs) { writer.Write32Bytes(input.PreviousTxOutputKey.TxHash); writer.Write4Bytes(input.PreviousTxOutputKey.TxOutputIndex); writer.WriteVarBytes(input.ScriptSignature.ToArray()); writer.Write4Bytes(input.Sequence); } writer.WriteVarInt((UInt64)Outputs.Length); foreach (var output in Outputs) { writer.Write8Bytes(output.Value); writer.WriteVarBytes(output.ScriptPublicKey.ToArray()); } writer.Write4Bytes(LockTime); return stream.ToArray(); } }
public static void EncodeTxOutput(Stream stream, TxOutput txOutput) { using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true)) { writer.Write8Bytes(txOutput.Value); writer.WriteVarBytes(txOutput.ScriptPublicKey.ToArray()); } }
public static void EncodeVersionPayload(Stream stream, VersionPayload versionPayload, bool withRelay) { using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true)) { writer.Write4Bytes(versionPayload.ProtocolVersion); writer.Write8Bytes(versionPayload.ServicesBitfield); writer.Write8Bytes(versionPayload.UnixTime); EncodeNetworkAddress(stream, versionPayload.RemoteAddress); EncodeNetworkAddress(stream, versionPayload.LocalAddress); writer.Write8Bytes(versionPayload.Nonce); writer.WriteVarString(versionPayload.UserAgent); writer.Write4Bytes(versionPayload.StartBlockHeight); if (withRelay) writer.WriteBool(versionPayload.Relay); } }
public static void EncodeNetworkAddress(Stream stream, NetworkAddress networkAddress) { using (var writer = new BinaryWriter(stream, Encoding.ASCII, leaveOpen: true)) { writer.Write8Bytes(networkAddress.Services); writer.WriteBytes(16, networkAddress.IPv6Address.ToArray()); writer.Write2BytesBE(networkAddress.Port); } }