public void Serialize(IByteBuffer byteBuffer, StatusMessage message) { int forkIdContentLength = 0; if (message.ForkId.HasValue) { ForkId forkId = message.ForkId.Value; forkIdContentLength = Rlp.LengthOf(forkId.ForkHash) + Rlp.LengthOf(forkId.Next); } NettyRlpStream rlpStream = new(byteBuffer); int totalLength = GetLength(message, out int contentLength); byteBuffer.EnsureWritable(totalLength); rlpStream.StartSequence(contentLength); rlpStream.Encode(message.ProtocolVersion); rlpStream.Encode(message.ChainId); rlpStream.Encode(message.TotalDifficulty); rlpStream.Encode(message.BestHash); rlpStream.Encode(message.GenesisHash); if (message.ForkId != null) { ForkId forkId = message.ForkId.Value; rlpStream.StartSequence(forkIdContentLength); rlpStream.Encode(forkId.ForkHash); rlpStream.Encode(forkId.Next); } }
private static void Test(long head, Keccak genesisHash, string forkHashHex, long next, string description, ISpecProvider specProvider) { byte[] expectedForkHash = Bytes.FromHexString(forkHashHex); byte[] forkHash = ForkInfo.CalculateForkHash(specProvider, head, genesisHash); forkHash.Should().BeEquivalentTo(expectedForkHash, description); ForkId forkId = ForkInfo.CalculateForkId(specProvider, head, genesisHash); forkId.Next.Should().Be(next); forkId.ForkHash.Should().BeEquivalentTo(expectedForkHash); }
private static StatusMessage Deserialize(RlpStream rlpStream) { StatusMessage statusMessage = new StatusMessage(); rlpStream.ReadSequenceLength(); statusMessage.ProtocolVersion = rlpStream.DecodeByte(); statusMessage.ChainId = rlpStream.DecodeUInt256(); statusMessage.TotalDifficulty = rlpStream.DecodeUInt256(); statusMessage.BestHash = rlpStream.DecodeKeccak(); statusMessage.GenesisHash = rlpStream.DecodeKeccak(); if (rlpStream.Position < rlpStream.Length) { rlpStream.ReadSequenceLength(); byte[] forkHash = rlpStream.DecodeByteArray(); long next = (long)rlpStream.DecodeUlong(); ForkId forkId = new ForkId(forkHash, next); statusMessage.ForkId = forkId; } return(statusMessage); }
public int GetLength(StatusMessage message, out int contentLength) { int forkIdSequenceLength = 0; if (message.ForkId.HasValue) { ForkId forkId = message.ForkId.Value; int forkIdContentLength = Rlp.LengthOf(forkId.ForkHash) + Rlp.LengthOf(forkId.Next); forkIdSequenceLength = Rlp.LengthOfSequence(forkIdContentLength); } contentLength = Rlp.LengthOf(message.ProtocolVersion) + Rlp.LengthOf(message.ChainId) + Rlp.LengthOf(message.TotalDifficulty) + Rlp.LengthOf(message.BestHash) + Rlp.LengthOf(message.GenesisHash) + forkIdSequenceLength; return(Rlp.LengthOfSequence(contentLength)); }