Esempio n. 1
0
        public void _When_finding_hash_it_does_not_load_headers()
        {
            _blockTree.FindHash(123).Returns(TestItem.KeccakA);
            Keccak result = _syncServer.FindHash(123);

            _blockTree.DidNotReceive().FindHeader(Arg.Any <long>(), Arg.Any <BlockTreeLookupOptions>());
            _blockTree.DidNotReceive().FindHeader(Arg.Any <Keccak>(), Arg.Any <BlockTreeLookupOptions>());
            _blockTree.DidNotReceive().FindBlock(Arg.Any <Keccak>(), Arg.Any <BlockTreeLookupOptions>());
            Assert.AreEqual(TestItem.KeccakA, result);
        }
Esempio n. 2
0
        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");
            }
        }
        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));
        }