コード例 #1
0
        public async Task ShouldRequestBlocksFromAheadFinalizedCheckpoint()
        {
            // Arrange
            IServiceCollection testServiceCollection = TestSystem.BuildTestServiceCollection(useStore: true);
            INetworkPeering    mockNetworkPeering    = Substitute.For <INetworkPeering>();

            testServiceCollection.AddSingleton <INetworkPeering>(mockNetworkPeering);
            ServiceProvider testServiceProvider = testServiceCollection.BuildServiceProvider();

            BeaconState state      = TestState.PrepareTestState(testServiceProvider);
            IForkChoice forkChoice = testServiceProvider.GetService <IForkChoice>();
            // Get genesis store initialise MemoryStoreProvider with the state
            IStore store = testServiceProvider.GetService <IStore>();
            await forkChoice.InitializeForkChoiceStoreAsync(store, state);

            // Act
            PeeringStatus peeringStatus = new PeeringStatus(
                new ForkVersion(new byte[4] {
                0, 0, 0, 0
            }),
                new Root(Enumerable.Repeat((byte)0x34, 32).ToArray()),
                Epoch.One,
                new Root(Enumerable.Repeat((byte)0x56, 32).ToArray()),
                new Slot(2));
            ISynchronizationManager synchronizationManager = testServiceProvider.GetService <ISynchronizationManager>();
            await synchronizationManager.OnStatusResponseReceived("peer", peeringStatus);

            // Assert
            await mockNetworkPeering.Received(1)
            .RequestBlocksAsync("peer", Arg.Any <Root>(), Arg.Any <Slot>(), Arg.Any <Slot>());

            await mockNetworkPeering.DidNotReceive().DisconnectPeerAsync("peer");
        }
コード例 #2
0
        protected override async Task ProcessItemAsync(RpcMessage <PeeringStatus> rpcMessage)
        {
            try
            {
                PeerInfo peerInfo = _peerManager.UpdatePeerStatus(rpcMessage.PeerId, rpcMessage.Content);
                Session  session  = _peerManager.OpenSession(peerInfo);

                // Mothra seems to be raising all incoming RPC (sent as request and as response)
                // with requestResponseFlag 0, so check here if already have the status so we don't go into infinite loop
                // => So use session details instead of the status message
                //if (statusRpcMessage.Direction == RpcDirection.Request)
                if (session.Direction == ConnectionDirection.Out)
                {
                    // If it is a dial out, we must have already sent the status request and this is the response
                    await _synchronizationManager.OnStatusResponseReceived(rpcMessage.PeerId,
                                                                           rpcMessage.Content);
                }
                else
                {
                    await _synchronizationManager.OnStatusRequestReceived(rpcMessage.PeerId,
                                                                          rpcMessage.Content);
                }
            }
            catch (Exception ex)
            {
                if (_logger.IsError())
                {
                    Log.HandleRpcStatusError(_logger, rpcMessage.PeerId, ex.Message, ex);
                }
            }
        }
コード例 #3
0
        public async Task ShouldNotRequestIfHeadBehind()
        {
            // Arrange
            IServiceCollection testServiceCollection = TestSystem.BuildTestServiceCollection(useStore: true);
            INetworkPeering    mockNetworkPeering    = Substitute.For <INetworkPeering>();

            testServiceCollection.AddSingleton <INetworkPeering>(mockNetworkPeering);
            ServiceProvider testServiceProvider = testServiceCollection.BuildServiceProvider();

            BeaconState state      = TestState.PrepareTestState(testServiceProvider);
            IForkChoice forkChoice = testServiceProvider.GetService <IForkChoice>();
            // Get genesis store initialise MemoryStoreProvider with the state
            IStore store = testServiceProvider.GetService <IStore>();
            await forkChoice.InitializeForkChoiceStoreAsync(store, state);

            // Move forward time
            TimeParameters timeParameters = testServiceProvider.GetService <IOptions <TimeParameters> >().Value;
            ulong          targetTime     = 2 * 6; // slot 2

            for (ulong timeSinceGenesis = 1; timeSinceGenesis <= targetTime; timeSinceGenesis++)
            {
                ulong time = state.GenesisTime + timeSinceGenesis;
                await forkChoice.OnTickAsync(store, time);

                if (timeSinceGenesis % timeParameters.SecondsPerSlot == 0)
                {
                    BeaconBlock       block       = TestBlock.BuildEmptyBlockForNextSlot(testServiceProvider, state, BlsSignature.Zero);
                    SignedBeaconBlock signedBlock = TestState.StateTransitionAndSignBlock(testServiceProvider, state, block);
                    await forkChoice.OnBlockAsync(store, signedBlock);
                }
            }

            // Act
            PeeringStatus peeringStatus = new PeeringStatus(
                new ForkVersion(new byte[4] {
                0, 0, 0, 0
            }),
                Root.Zero,
                Epoch.Zero,
                new Root(Enumerable.Repeat((byte)0x56, 32).ToArray()),
                new Slot(1));
            ISynchronizationManager synchronizationManager = testServiceProvider.GetService <ISynchronizationManager>();
            await synchronizationManager.OnStatusResponseReceived("peer", peeringStatus);

            // Assert
            await mockNetworkPeering.DidNotReceive()
            .RequestBlocksAsync("peer", Arg.Any <Root>(), Arg.Any <Slot>(), Arg.Any <Slot>());

            await mockNetworkPeering.DidNotReceive().DisconnectPeerAsync("peer");
        }