public string[] GetSignersAnnotated(Keccak hash) { BlockHeader header = _blockTree.FindHeader(hash, BlockTreeLookupOptions.TotalDifficultyNotNeeded); return(_snapshotManager.GetOrCreateSnapshot(header.Number, header.Hash).Signers .Select(s => string.Concat(s.Key, $" ({KnownAddresses.GetDescription(s.Key)})")).ToArray()); }
public string[] GetSignersAnnotated() { Block header = _blockTree.Head; return(_snapshotManager.GetOrCreateSnapshot(header.Number, header.Hash).Signers .Select(s => string.Concat(s.Key, $" ({KnownAddresses.GetDescription(s.Key)})")).ToArray()); }
private void TimerOnElapsed(object sender, ElapsedEventArgs e) { try { if (_blockTree.Head == null) { _timer.Enabled = true; return; } Block?scheduledBlock = _scheduledBlock; if (scheduledBlock == null) { if (_blockTree.Head.Timestamp + _config.BlockPeriod < _timestamper.UnixTime.Seconds) { _signalsQueue.Add(_blockTree.FindBlock(_blockTree.Head.Hash, BlockTreeLookupOptions.None)); } _timer.Enabled = true; return; } string turnDescription = scheduledBlock.IsInTurn() ? "IN TURN" : "OUT OF TURN"; int wiggle = _wiggle.WiggleFor(scheduledBlock.Header); if (scheduledBlock.Timestamp * 1000 + (UInt256)wiggle < _timestamper.UnixTime.Milliseconds) { if (scheduledBlock.TotalDifficulty > _blockTree.Head.TotalDifficulty) { if (ReferenceEquals(scheduledBlock, _scheduledBlock)) { BlockHeader parent = _blockTree.FindParentHeader(scheduledBlock.Header, BlockTreeLookupOptions.TotalDifficultyNotNeeded); Address parentSigner = _snapshotManager.GetBlockSealer(parent); string parentTurnDescription = parent.IsInTurn() ? "IN TURN" : "OUT OF TURN"; string parentDetails = $"{parentTurnDescription} {parent.TimestampDate:HH:mm:ss} {parent.ToString(BlockHeader.Format.Short)} sealed by {KnownAddresses.GetDescription(parentSigner)}"; if (_logger.IsInfo) { _logger.Info( $"Suggesting own {turnDescription} {_scheduledBlock.TimestampDate:HH:mm:ss} {scheduledBlock.ToString(Block.Format.HashNumberDiffAndTx)} based on {parentDetails} after the delay of {wiggle}"); } _blockTree.SuggestBlock(scheduledBlock); } } else { if (_logger.IsInfo) { _logger.Info( $"Dropping a losing block {scheduledBlock.ToString(Block.Format.HashNumberDiffAndTx)}"); } } if (ReferenceEquals(scheduledBlock, _scheduledBlock)) { _scheduledBlock = null; } } else { if (_logger.IsTrace) { _logger.Trace($"Not yet {scheduledBlock.ToString(Block.Format.HashNumberDiffAndTx)}"); } } _timer.Enabled = true; } catch (Exception exception) { if (_logger.IsError) { _logger.Error("Clique block producer failure", exception); } } }