private static StatusMessage Deserialize(RlpStream rlpStream) { StatusMessage statusMessage = new StatusMessage(); (int prefixLength, int contentLength) = rlpStream.PeekPrefixAndContentLength(); var totalLength = contentLength; rlpStream.Position += prefixLength; var readLength = prefixLength; while (totalLength > readLength) { (prefixLength, contentLength) = rlpStream.PeekPrefixAndContentLength(); readLength += prefixLength + contentLength; rlpStream.Position += prefixLength; string key = rlpStream.DecodeString(); switch (key) { case StatusMessage.KeyNames.ProtocolVersion: statusMessage.ProtocolVersion = rlpStream.DecodeByte(); break; case StatusMessage.KeyNames.ChainId: statusMessage.ChainId = rlpStream.DecodeUInt256(); break; case StatusMessage.KeyNames.TotalDifficulty: statusMessage.TotalDifficulty = rlpStream.DecodeUInt256(); break; case StatusMessage.KeyNames.BestHash: statusMessage.BestHash = rlpStream.DecodeKeccak(); break; case StatusMessage.KeyNames.HeadBlockNo: statusMessage.HeadBlockNo = rlpStream.DecodeLong(); break; case StatusMessage.KeyNames.GenesisHash: statusMessage.GenesisHash = rlpStream.DecodeKeccak(); break; case StatusMessage.KeyNames.AnnounceType: statusMessage.AnnounceType = rlpStream.DecodeByte(); break; default: // Ignore unknown keys - forwards compatibility rlpStream.Position = readLength; break; } } return(statusMessage); }
public HelloMessage Deserialize(byte[] bytes) { RlpStream rlpStream = bytes.AsRlpStream(); rlpStream.ReadSequenceLength(); HelloMessage helloMessage = new HelloMessage(); helloMessage.P2PVersion = rlpStream.DecodeByte(); helloMessage.ClientId = string.Intern(rlpStream.DecodeString()); helloMessage.Capabilities = rlpStream.DecodeArray(ctx => { ctx.ReadSequenceLength(); string protocolCode = string.Intern(ctx.DecodeString()); int version = ctx.DecodeByte(); return(new Capability(protocolCode, version)); }).ToList(); helloMessage.ListenPort = rlpStream.DecodeInt(); byte[] publicKeyBytes = rlpStream.DecodeByteArray(); if (publicKeyBytes.Length != PublicKey.LengthInBytes && publicKeyBytes.Length != PublicKey.PrefixedLengthInBytes) { throw new NetworkingException($"Client {helloMessage.ClientId} sent an invalid public key format (length was {publicKeyBytes.Length})", NetworkExceptionType.HandshakeOrInit); } else { helloMessage.NodeId = new PublicKey(publicKeyBytes); } return(helloMessage); }
public AddCapabilityMessage Deserialize(byte[] msgBytes) { RlpStream context = msgBytes.AsRlpStream(); context.ReadSequenceLength(); string protocolCode = context.DecodeString(); byte version = context.DecodeByte(); return(new AddCapabilityMessage(new Capability(protocolCode, version))); }
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(); return(statusMessage); }
private static HiMessage Deserialize(RlpStream rlpStream) { rlpStream.ReadSequenceLength(); var protocolVersion = rlpStream.DecodeByte(); var providerAddress = rlpStream.DecodeAddress(); var consumerAddress = rlpStream.DecodeAddress(); var nodeId = new PublicKey(rlpStream.DecodeByteArray()); var signature = SignatureDecoder.DecodeSignature(rlpStream); return(new HiMessage(protocolVersion, providerAddress, consumerAddress, nodeId, signature)); }
public static GetBlockHeadersMessage Deserialize(RlpStream rlpStream) { GetBlockHeadersMessage message = new(); rlpStream.ReadSequenceLength(); byte[] startingBytes = rlpStream.DecodeByteArray(); if (startingBytes.Length == 32) { message.StartBlockHash = new Keccak(startingBytes); } else { message.StartBlockNumber = (long)new UInt256(startingBytes, true); } message.MaxHeaders = rlpStream.DecodeInt(); message.Skip = rlpStream.DecodeInt(); message.Reverse = rlpStream.DecodeByte(); return(message); }
private static GetBlockHeadersMessage Deserialize(RlpStream rlpStream) { GetBlockHeadersMessage message = new GetBlockHeadersMessage(); rlpStream.ReadSequenceLength(); byte[] startingBytes = rlpStream.DecodeByteArray(); if (startingBytes.Length == 32) { message.StartingBlockHash = new Keccak(startingBytes); } else { UInt256.CreateFromBigEndian(out UInt256 result, startingBytes); message.StartingBlockNumber = (long)result; } message.MaxHeaders = rlpStream.DecodeInt(); message.Skip = rlpStream.DecodeInt(); message.Reverse = rlpStream.DecodeByte(); return(message); }
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(forkHash, next); statusMessage.ForkId = forkId; } return(statusMessage); }
public HelloMessage Deserialize(byte[] bytes) { RlpStream rlpStream = bytes.AsRlpStream(); rlpStream.ReadSequenceLength(); HelloMessage helloMessage = new HelloMessage(); helloMessage.P2PVersion = rlpStream.DecodeByte(); helloMessage.ClientId = string.Intern(rlpStream.DecodeString()); helloMessage.Capabilities = rlpStream.DecodeArray(ctx => { ctx.ReadSequenceLength(); string protocolCode = string.Intern(ctx.DecodeString()); int version = ctx.DecodeByte(); return(new Capability(protocolCode, version)); }).ToList(); helloMessage.ListenPort = rlpStream.DecodeInt(); helloMessage.NodeId = new PublicKey(rlpStream.DecodeByteArray()); return(helloMessage); }
private static StatusMessage Deserialize(RlpStream rlpStream) { StatusMessage statusMessage = new StatusMessage(); (int prefixLength, int contentLength) = rlpStream.PeekPrefixAndContentLength(); var totalLength = contentLength; rlpStream.Position += prefixLength; var readLength = prefixLength; while (totalLength > readLength) { (prefixLength, contentLength) = rlpStream.PeekPrefixAndContentLength(); readLength += prefixLength + contentLength; rlpStream.Position += prefixLength; string key = rlpStream.DecodeString(); switch (key) { case StatusMessage.KeyNames.ProtocolVersion: statusMessage.ProtocolVersion = rlpStream.DecodeByte(); break; case StatusMessage.KeyNames.ChainId: statusMessage.ChainId = rlpStream.DecodeUInt256(); break; case StatusMessage.KeyNames.TotalDifficulty: statusMessage.TotalDifficulty = rlpStream.DecodeUInt256(); break; case StatusMessage.KeyNames.BestHash: statusMessage.BestHash = rlpStream.DecodeKeccak(); break; case StatusMessage.KeyNames.HeadBlockNo: statusMessage.HeadBlockNo = rlpStream.DecodeLong(); break; case StatusMessage.KeyNames.GenesisHash: statusMessage.GenesisHash = rlpStream.DecodeKeccak(); break; case StatusMessage.KeyNames.AnnounceType: statusMessage.AnnounceType = rlpStream.DecodeByte(); break; case StatusMessage.KeyNames.ServeHeaders: statusMessage.ServeHeaders = true; rlpStream.SkipItem(); break; case StatusMessage.KeyNames.ServeChainSince: statusMessage.ServeChainSince = rlpStream.DecodeLong(); break; case StatusMessage.KeyNames.ServeRecentChain: statusMessage.ServeRecentChain = rlpStream.DecodeLong(); break; case StatusMessage.KeyNames.ServeStateSince: statusMessage.ServeStateSince = rlpStream.DecodeLong(); break; case StatusMessage.KeyNames.ServeRecentState: statusMessage.ServeRecentState = rlpStream.DecodeLong(); break; case StatusMessage.KeyNames.TxRelay: statusMessage.TxRelay = true; rlpStream.SkipItem(); break; case StatusMessage.KeyNames.BufferLimit: statusMessage.BufferLimit = rlpStream.DecodeInt(); break; case StatusMessage.KeyNames.MaximumRechargeRate: statusMessage.MaximumRechargeRate = rlpStream.DecodeInt(); break; case StatusMessage.KeyNames.MaximumRequestCosts: // todo default: // Ignore unknown keys rlpStream.Position = readLength; break; } } return(statusMessage); }