private void Handle(GetBlockHeadersMessage getBlockHeadersMessage) { if (Logger.IsTrace) { Logger.Trace($"GetBlockHeaders.MaxHeaders: {getBlockHeadersMessage.MaxHeaders}"); Logger.Trace($"GetBlockHeaders.Reverse: {getBlockHeadersMessage.Reverse}"); Logger.Trace($"GetBlockHeaders.Skip: {getBlockHeadersMessage.Skip}"); Logger.Trace($"GetBlockHeaders.StartingBlockhash: {getBlockHeadersMessage.StartingBlockHash}"); Logger.Trace($"GetBlockHeaders.StartingBlockNumber: {getBlockHeadersMessage.StartingBlockNumber}"); } Keccak startingHash = getBlockHeadersMessage.StartingBlockHash; if (startingHash == null) { startingHash = SyncServer.Find(getBlockHeadersMessage.StartingBlockNumber)?.Hash; } BlockHeader[] headers = startingHash == null ? new BlockHeader[0] : SyncServer.FindHeaders(startingHash, (int)getBlockHeadersMessage.MaxHeaders, (int)getBlockHeadersMessage.Skip, getBlockHeadersMessage.Reverse == 1); Send(new BlockHeadersMessage(headers)); }
private void Handle(GetBlockHeadersMessage getBlockHeadersMessage) { Stopwatch stopwatch = Stopwatch.StartNew(); if (Logger.IsTrace) { Logger.Trace($"Received headers request from {Session.Node:c}:"); Logger.Trace($" MaxHeaders: {getBlockHeadersMessage.MaxHeaders}"); Logger.Trace($" Reverse: {getBlockHeadersMessage.Reverse}"); Logger.Trace($" Skip: {getBlockHeadersMessage.Skip}"); Logger.Trace($" StartingBlockhash: {getBlockHeadersMessage.StartingBlockHash}"); Logger.Trace($" StartingBlockNumber: {getBlockHeadersMessage.StartingBlockNumber}"); } Interlocked.Increment(ref Counter); // to clearly state that this client is an ETH client and not ETC (and avoid disconnections on reversed sync) // also to improve performance as this is the most common request // if (getBlockHeadersMessage.StartingBlockNumber == 1920000 && getBlockHeadersMessage.MaxHeaders == 1) // { // // hardcoded response // Packet packet = new Packet(ProtocolCode, Eth62MessageCode.BlockHeaders, Bytes.FromHexString("f90210f9020da0a218e2c611f21232d857e3c8cecdcdf1f65f25a4477f98f6f47e4063807f2308a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794bcdfc35b86bedf72f0cda046a3c16829a2ef41d1a0c5e389416116e3696cce82ec4533cce33efccb24ce245ae9546a4b8f0d5e9a75a07701df8e07169452554d14aadd7bfa256d4a1d0355c1d174ab373e3e2d0a3743a026cf9d9422e9dd95aedc7914db690b92bab6902f5221d62694a2fa5d065f534bb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008638c3bf2616aa831d4c008347e7c08301482084578f7aa88d64616f2d686172642d666f726ba05b5acbf4bf305f948bd7be176047b20623e1417f75597341a059729165b9239788bede87201de42426")); // Session.DeliverMessage(packet); // if (Logger.IsTrace) Logger.Trace($"OUT {_counter:D5} hardcoded 1920000 BlockHeaders to {Node:c}"); // return; // } Keccak startingHash = getBlockHeadersMessage.StartingBlockHash; if (startingHash == null) { startingHash = SyncServer.FindHash(getBlockHeadersMessage.StartingBlockNumber); } BlockHeader[] headers = startingHash == null ? Array.Empty <BlockHeader>() : SyncServer.FindHeaders(startingHash, (int)getBlockHeadersMessage.MaxHeaders, (int)getBlockHeadersMessage.Skip, getBlockHeadersMessage.Reverse == 1); headers = FixHeadersForGeth(headers); Send(new BlockHeadersMessage(headers)); stopwatch.Stop(); if (Logger.IsTrace) { Logger.Trace($"OUT {Counter:D5} BlockHeaders to {Node:c} in {stopwatch.Elapsed.TotalMilliseconds}ms"); } }
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)); }
protected BlockHeadersMessage FulfillBlockHeadersRequest(GetBlockHeadersMessage msg) { if (msg.MaxHeaders > 1024) { throw new EthSyncException("Incoming headers request for more than 1024 headers"); } Keccak startingHash = msg.StartBlockHash; if (startingHash == null) { startingHash = SyncServer.FindHash(msg.StartBlockNumber); } BlockHeader[] headers = startingHash == null ? Array.Empty <BlockHeader>() : SyncServer.FindHeaders(startingHash, (int)msg.MaxHeaders, (int)msg.Skip, msg.Reverse == 1); headers = FixHeadersForGeth(headers); return(new BlockHeadersMessage(headers)); }