public void NotifyOfNewBlock(Block block, SendBlockMode mode)
 {
     if (mode == SendBlockMode.FullBlock)
     {
         ReceivedBlocks.Push(block);
     }
 }
Esempio n. 2
0
        public void Can_broadcast_a_block([Values(SendBlockMode.HashOnly, SendBlockMode.FullBlock, (SendBlockMode)99)] SendBlockMode mode)
        {
            Block block = Build.A.Block.WithTotalDifficulty(1L).TestObject;
            Type  expectedMessageType = mode == SendBlockMode.FullBlock ? typeof(NewBlockMessage) : typeof(NewBlockHashesMessage);

            _handler.NotifyOfNewBlock(block, mode);
            _session.Received().DeliverMessage(Arg.Is <P2PMessage>(m => m.GetType().IsAssignableFrom(expectedMessageType)));
        }
Esempio n. 3
0
        public void Broadcasts_only_once([Values(SendBlockMode.HashOnly, SendBlockMode.FullBlock)] SendBlockMode mode)
        {
            Block block = Build.A.Block.WithTotalDifficulty(1L).TestObject;

            _handler.NotifyOfNewBlock(block, mode);
            _handler.NotifyOfNewBlock(block, SendBlockMode.HashOnly);
            _handler.NotifyOfNewBlock(block, SendBlockMode.FullBlock);
            _session.Received(1).DeliverMessage(Arg.Is <P2PMessage>(m =>
                                                                    m.GetType().IsAssignableFrom(typeof(NewBlockMessage)) ||
                                                                    m.GetType().IsAssignableFrom(typeof(NewBlockHashesMessage))));
        }
Esempio n. 4
0
        public override void NotifyOfNewBlock(Block block, SendBlockMode mode)
        {
            if (RequestedAnnounceType == LesAnnounceType.None)
            {
                return;
            }
            if (!block.TotalDifficulty.HasValue)
            {
                throw new InvalidOperationException($"Trying to send a block {block.Hash} with null total difficulty");
            }

            if (block.TotalDifficulty <= _lastSentBlock.TotalDifficulty)
            {
                return;
            }

            AnnounceMessage announceMessage = new();

            announceMessage.HeadHash        = block.Hash;
            announceMessage.HeadBlockNo     = block.Number;
            announceMessage.TotalDifficulty = block.TotalDifficulty.Value;
            if (_lastSentBlock == null || block.ParentHash == _lastSentBlock.Hash)
            {
                announceMessage.ReorgDepth = 0;
            }
            else
            {
                BlockHeader firstCommonAncestor = SyncServer.FindLowestCommonAncestor(block.Header, _lastSentBlock);
                if (firstCommonAncestor == null)
                {
                    throw new SubprotocolException($"Unable to send announcment to LES peer - No common ancestor found between {block.Header} and {_lastSentBlock}");
                }
                announceMessage.ReorgDepth = _lastSentBlock.Number - firstCommonAncestor.Number;
            }

            _lastSentBlock = block.Header;

            Send(announceMessage);
        }
 public abstract void NotifyOfNewBlock(Block block, SendBlockMode mode);
Esempio n. 6
0
 public void NotifyOfNewBlock(Block block, SendBlockMode mode)
 {
     throw new NotImplementedException();
 }
 public void NotifyOfNewBlock(Block block, SendBlockMode mode)
 {
 }