public async Task <ResultWrapper <BlockRequestResult?> > HandleAsync(AssembleBlockRequest request) { BlockHeader?parentHeader = _blockTree.FindHeader(request.ParentHash); if (parentHeader is null) { if (_logger.IsWarn) { _logger.Warn($"Parent block {request.ParentHash} cannot be found. New block will not be produced."); } return(ResultWrapper <BlockRequestResult?> .Success(null)); } _timestamper.Set(DateTimeOffset.FromUnixTimeSeconds((long)request.Timestamp).UtcDateTime); using CancellationTokenSource cts = new(_timeout); Block?block = await _blockProductionTrigger.BuildBlock(parentHeader, cts.Token); if (block == null) { if (_logger.IsWarn) { _logger.Warn($"Block production on parent {request.ParentHash} with timestamp {request.Timestamp} failed."); } return(ResultWrapper <BlockRequestResult?> .Success(null)); } else { return(ResultWrapper <BlockRequestResult?> .Success(new BlockRequestResult(block))); } }
public BlockImprovementContext( Block currentBestBlock, IManualBlockProductionTrigger blockProductionTrigger, TimeSpan timeout, BlockHeader parentHeader, PayloadAttributes payloadAttributes) { _cancellationTokenSource = new CancellationTokenSource(timeout); CurrentBestBlock = currentBestBlock; ImprovementTask = blockProductionTrigger .BuildBlock(parentHeader, _cancellationTokenSource.Token, NullBlockTracer.Instance, payloadAttributes) .ContinueWith(SetCurrentBestBlock, _cancellationTokenSource.Token); }
private async Task <Block?> BuildBlock( IManualBlockProductionTrigger blockProductionTrigger, BlockHeader parentHeader, PayloadAttributes payloadAttributes, int delay, CancellationToken cancellationToken) { Block?block = await blockProductionTrigger.BuildBlock(parentHeader, cancellationToken, NullBlockTracer.Instance, payloadAttributes); await Task.Delay(delay, cancellationToken); if (block is not null) { CurrentBestBlock = block; } return(CurrentBestBlock); }
private async Task <Block?> StartImprovingBlock( IManualBlockProductionTrigger blockProductionTrigger, BlockHeader parentHeader, PayloadAttributes payloadAttributes, CancellationToken cancellationToken) { payloadAttributes = await _boostRelay.GetPayloadAttributes(payloadAttributes, cancellationToken); UInt256 balanceBefore = _stateReader.GetAccount(parentHeader.StateRoot !, payloadAttributes.SuggestedFeeRecipient)?.Balance ?? UInt256.Zero; Block? block = await blockProductionTrigger.BuildBlock(parentHeader, cancellationToken, NullBlockTracer.Instance, payloadAttributes); if (block is not null) { CurrentBestBlock = block; UInt256 balanceAfter = _stateReader.GetAccount(block.StateRoot !, payloadAttributes.SuggestedFeeRecipient)?.Balance ?? UInt256.Zero; await _boostRelay.SendPayload(new BoostExecutionPayloadV1 { Block = new ExecutionPayloadV1(block), Profit = balanceAfter - balanceBefore }, cancellationToken); } return(CurrentBestBlock); }
public ResultWrapper <bool> evm_mine() { _trigger.BuildBlock(); return(ResultWrapper <bool> .Success(true)); }