private int GetRequestLength(HelperTrieRequest request) { return (Rlp.LengthOf((int)request.SubType) + Rlp.LengthOf(request.SectionIndex) + Rlp.LengthOf(request.Key) + Rlp.LengthOf(request.FromLevel) + Rlp.LengthOf(request.AuxiliaryData)); }
public static GetHelperTrieProofsMessage Deserialize(RlpStream rlpStream) { GetHelperTrieProofsMessage message = new GetHelperTrieProofsMessage(); rlpStream.ReadSequenceLength(); message.RequestId = rlpStream.DecodeLong(); message.Requests = rlpStream.DecodeArray(stream => { HelperTrieRequest request = new HelperTrieRequest(); stream.ReadSequenceLength(); request.SubType = (HelperTrieType)stream.DecodeInt(); request.SectionIndex = stream.DecodeLong(); request.Key = stream.DecodeByteArray(); request.FromLevel = stream.DecodeLong(); request.AuxiliaryData = stream.DecodeInt(); return(request); }); return(message); }
public void GetCHTData(HelperTrieRequest request, List <byte[]> proofNodes, List <byte[]> auxData) { var cht = SyncServer.GetCHT(); // todo - enum? if (request.AuxiliaryData == 1) { auxData.Add(cht.RootHash.Bytes); return; } else if (request.AuxiliaryData == 2) { (Keccak hash, _) = cht.Get(request.Key); var headerResult = SyncServer.FindHeaders(hash, 1, 0, false); if (headerResult.Length != 1) { throw new SubprotocolException($"Unable to find header for block {request.Key.WithoutLeadingZeros().ToArray().ToLongFromBigEndianByteArrayWithoutLeadingZeros()} for GetHelperProofs response."); } auxData.Add(Rlp.Encode(headerResult[0]).Bytes); } proofNodes.AddRange(cht.BuildProof(request.Key, request.SectionIndex, request.FromLevel)); }