public static void EncodeVersionPayload(BinaryWriter writer, VersionPayload versionPayload, bool withRelay) { writer.WriteUInt32(versionPayload.ProtocolVersion); writer.WriteUInt64(versionPayload.ServicesBitfield); writer.WriteUInt64((ulong)versionPayload.Time.ToUnixTimeSeconds()); EncodeNetworkAddress(writer, versionPayload.RemoteAddress); EncodeNetworkAddress(writer, versionPayload.LocalAddress); writer.WriteUInt64(versionPayload.Nonce); writer.WriteVarString(versionPayload.UserAgent); writer.WriteUInt32(versionPayload.StartBlockHeight); if (withRelay) writer.WriteBool(versionPayload.Relay); }
public static byte[] EncodeVersionPayload(VersionPayload versionPayload, bool withRelay) { using (var stream = new MemoryStream()) using (var writer = new BinaryWriter(stream)) { EncodeVersionPayload(writer, versionPayload, withRelay); return stream.ToArray(); } }
public static VersionPayload DecodeVersionPayload(BinaryReader reader, int payloadLength) { var position = reader.BaseStream.Position; var versionPayload = new VersionPayload ( ProtocolVersion: reader.ReadUInt32(), ServicesBitfield: reader.ReadUInt64(), Time: DateTimeOffset.FromUnixTimeSeconds((long)reader.ReadUInt64()), RemoteAddress: DecodeNetworkAddress(reader), LocalAddress: DecodeNetworkAddress(reader), Nonce: reader.ReadUInt64(), UserAgent: reader.ReadVarString(), StartBlockHeight: reader.ReadUInt32(), Relay: false ); var readCount = reader.BaseStream.Position - position; if (versionPayload.ProtocolVersion >= VersionPayload.RELAY_VERSION && payloadLength - readCount == 1) versionPayload = versionPayload.With(Relay: reader.ReadBool()); return versionPayload; }