private async Task ProcessBlockHeader( BlockHeaderMessage message, CancellationToken cancellationToken = default(CancellationToken)) { if (!(message.Remote is BoundPeer peer)) { _logger.Information( "BlockHeaderMessage was sent from invalid peer " + "{PeerAddress}; ignored.", message.Remote.Address ); return; } BlockHeaderReceived.Set(); BlockHeader header = message.Header; _logger.Debug( $"Received a {nameof(BlockHeader)} #{{BlockIndex}} {{BlockHash}}.", header.Index, ByteUtil.Hex(header.Hash) ); try { header.Validate(DateTimeOffset.UtcNow); } catch (InvalidBlockException ibe) { _logger.Information( ibe, "A received header #{BlockIndex} {BlockHash} seems invalid; ignored.", header.Index, ByteUtil.Hex(header.Hash) ); return; } using (await _blockSyncMutex.LockAsync(cancellationToken)) { if (IsDemandNeeded(header)) { _demandBlockHash = new BlockHashDemand(header, peer); } else { _logger.Debug( "No blocks are required " + "(current: {Current}, demand: {Demand}, received: {Received});" + $" {nameof(BlockHeaderMessage)} is ignored.", BlockChain.Tip.Index, _demandBlockHash?.Header.Index, header.Index); } } }
public void BlockHeaderMessage() { var privateKey = new PrivateKey(); var peer = new Peer(privateKey.PublicKey); var appProtocolVersion = new AppProtocolVersion( 1, new Bencodex.Types.Integer(0), ImmutableArray <byte> .Empty, default(Address)); var dateTimeOffset = DateTimeOffset.UtcNow; var genesis = TestUtils.MineGenesis <DumbAction>(); var message = new BlockHeaderMessage(genesis.Hash, genesis.Header); NetMQMessage raw = message.ToNetMQMessage(privateKey, peer, dateTimeOffset, appProtocolVersion); var parsed = Message.Parse(raw, true, appProtocolVersion, null, null, null); Assert.Equal(peer, parsed.Remote); }
public void BlockHeaderMessage() { var privateKey = new PrivateKey(); var peer = new Peer(privateKey.PublicKey); var apv = new AppProtocolVersion( 1, new Bencodex.Types.Integer(0), ImmutableArray <byte> .Empty, default(Address)); var dateTimeOffset = DateTimeOffset.UtcNow; Block <DumbAction> genesis = MineGenesisBlock <DumbAction>( _ => HashAlgorithmType.Of <SHA256>(), GenesisMiner ); var message = new BlockHeaderMessage(genesis.Hash, genesis.Header); var codec = new NetMQMessageCodec(appProtocolVersion: apv); NetMQMessage raw = codec.Encode(message, privateKey, peer, dateTimeOffset); var parsed = codec.Decode(raw, true); Assert.Equal(peer, parsed.Remote); }
private void ProcessBlockHeader(BlockHeaderMessage message) { if (!(message.Remote is BoundPeer peer)) { _logger.Debug( "BlockHeaderMessage was sent from invalid peer " + "{PeerAddress}; ignored.", message.Remote.Address ); return; } if (!message.GenesisHash.Equals(BlockChain.Genesis.Hash)) { _logger.Debug( "BlockHeaderMessage was sent from the peer " + "{PeerAddress} with different genesis block {hash}; ignored.", message.Remote.Address, message.GenesisHash ); return; } BlockHeaderReceived.Set(); BlockHeader header; try { header = message.GetHeader(BlockChain.Policy.GetHashAlgorithm); } catch (InvalidBlockException ibe) { _logger.Debug( ibe, "Received header #{BlockIndex} {BlockHash} seems invalid; ignored.", message.HeaderHash, message.HeaderIndex ); return; } try { header.ValidateTimestamp(); } catch (InvalidBlockTimestampException e) { _logger.Debug( e, "Received #{BlockIndex} {BlockHash}'s timestamp is invalid: {Timestamp}.", header.Index, header.Hash, header.Timestamp ); return; } _logger.Information( "Received " + nameof(BlockHeader) + " #{BlockIndex} {BlockHash}.", header.Index, header.Hash ); if (!IsBlockNeeded(header)) { _logger.Debug( "Received header #{BlockIndex} {BlockHash} from peer {Peer} is not needed " + "for the current chain with tip #{TipIndex} {TipHash}.", header.Index, header.Hash, peer, BlockChain.Tip, BlockChain.Tip.Hash); return; } _logger.Information( "Adding received header #{BlockIndex} {BlockHash} from peer {Peer} to " + $"{nameof(BlockDemandTable)}...", header.Index, header.Hash, peer); BlockDemandTable.Add( BlockChain, IsBlockNeeded, new BlockDemand(header, peer, DateTimeOffset.UtcNow)); }
private void ProcessBlockHeader(BlockHeaderMessage message) { if (!(message.Remote is BoundPeer peer)) { _logger.Debug( "{MessageType} message was sent from an invalid peer {Peer}.", nameof(Messages.BlockHeaderMessage), message.Remote ); return; } if (!message.GenesisHash.Equals(BlockChain.Genesis.Hash)) { _logger.Debug( "{MessageType} message was sent from a peer {Peer} with " + "a different genesis block {Hash}.", nameof(Messages.BlockHeaderMessage), message.Remote, message.GenesisHash ); return; } BlockHeaderReceived.Set(); BlockHeader header; try { header = message.GetHeader(BlockChain.Policy.GetHashAlgorithm); } catch (InvalidBlockException ibe) { _logger.Debug( ibe, "Received header #{BlockIndex} {BlockHash} is invalid.", message.HeaderHash, message.HeaderIndex ); return; } try { header.ValidateTimestamp(); } catch (InvalidBlockTimestampException e) { _logger.Debug( e, "Received header #{BlockIndex} {BlockHash} has invalid timestamp: {Timestamp}.", header.Index, header.Hash, header.Timestamp ); return; } var stopwatch = new Stopwatch(); stopwatch.Start(); bool needed = IsBlockNeeded(header); TimeSpan elapsed = stopwatch.Elapsed; stopwatch.Stop(); _logger.Information( "Received " + nameof(BlockHeader) + " #{BlockIndex} {BlockHash}; " + "Needed? {Needed}; Elapsed: {Elapsed}", header.Index, header.Hash, needed, elapsed ); if (!needed) { _logger.Debug( "Received header #{BlockIndex} {BlockHash} from peer {Peer} is not needed " + "for the current chain with tip #{TipIndex} {TipHash}.", header.Index, header.Hash, peer, BlockChain.Tip.Index, BlockChain.Tip.Hash); return; } _logger.Information( "Adding received header #{BlockIndex} {BlockHash} from peer {Peer} to " + nameof(BlockDemandTable) + "...", header.Index, header.Hash, peer); BlockDemandTable.Add( BlockChain, IsBlockNeeded, new BlockDemand(header, peer, DateTimeOffset.UtcNow)); }