protected override void OnSerialize(BinaryWriter writer) { writer.Write((byte)Kind); if (Kind.HasFlag(RequestKind.Peers)) { writer.Write((byte)_peers.Length); foreach (var peer in _peers) { peer.Serialize(writer); } } if (Kind.HasFlag(RequestKind.Chains)) { writer.Write((ushort)_chains.Length); foreach (var chain in _chains) { chain.Serialize(writer); } } if (Kind.HasFlag(RequestKind.Mempool)) { writer.Write((ushort)_mempool.Length); foreach (var tx in _mempool) { writer.WriteVarString(tx); } } if (Kind.HasFlag(RequestKind.Blocks)) { writer.Write((ushort)_blockRanges.Count); foreach (var entry in _blockRanges) { var range = entry.Value; writer.WriteVarString(entry.Key); writer.WriteVarInt(range.blocks.Length); foreach (var block in range.blocks) { var bytes = block.ToByteArray(true); writer.WriteByteArray(bytes); foreach (var txHash in block.TransactionHashes) { var tx = range.transactions[txHash]; bytes = tx.ToByteArray(true); writer.WriteByteArray(bytes); } } } } }
protected override void OnSerialize(BinaryWriter writer) { writer.Write((byte)Kind); if (Kind.HasFlag(RequestKind.Peers)) { writer.Write((byte)_peers.Length); foreach (var peer in _peers) { peer.Serialize(writer); } } if (Kind.HasFlag(RequestKind.Chains)) { writer.Write((ushort)_chains.Length); foreach (var chain in _chains) { chain.Serialize(writer); } } if (Kind.HasFlag(RequestKind.Mempool)) { writer.Write((ushort)_mempool.Length); foreach (var tx in _mempool) { writer.WriteVarString(tx); } } if (Kind.HasFlag(RequestKind.Blocks)) { writer.Write((ushort)_blockRanges.Count); foreach (var entry in _blockRanges) { writer.WriteVarString(entry.Key); writer.Write((uint)entry.Value.startHeight); writer.Write((ushort)entry.Value.rawBlocks.Length); foreach (var rawBlock in entry.Value.rawBlocks) { writer.WriteVarString(rawBlock); } } } }
protected override void OnSerialize(BinaryWriter writer) { writer.Write((byte)Kind); writer.WriteVarString(NexusName); if (Kind.HasFlag(RequestKind.Blocks)) { Throw.IfNull(_blockFetches, nameof(_blockFetches)); Throw.If(_blockFetches.Count > 1024, "max chain block fetches per request reached"); writer.WriteVarInt(_blockFetches.Count); foreach (var entry in _blockFetches) { writer.WriteVarString(entry.Key); writer.WriteBigInteger(entry.Value); } } }