public async Task ProcessProposalDutiesAsync(Slot slot, CancellationToken cancellationToken) { // If proposer, get block, sign block, return to node // Retry if not successful; need to queue this up to send immediately if connection issue. (or broadcast?) BlsPublicKey?blsPublicKey = _validatorState.GetProposalDutyForSlot(slot); if (!(blsPublicKey is null)) { if (_logger.IsInfo()) { Log.ProposalDutyFor(_logger, slot, blsPublicKey, null); } BlsSignature randaoReveal = GetEpochSignature(slot, blsPublicKey); if (_logger.IsDebug()) { LogDebug.RequestingBlock(_logger, slot, blsPublicKey.ToShortString(), randaoReveal.ToString().Substring(0, 10), null); } BeaconBlock unsignedBlock = await _beaconNodeApi.NewBlockAsync(slot, randaoReveal, cancellationToken).ConfigureAwait(false); BeaconBlock signedBlock = SignBlock(unsignedBlock, blsPublicKey); if (_logger.IsDebug()) { LogDebug.PublishingSignedBlock(_logger, slot, blsPublicKey.ToShortString(), randaoReveal.ToString().Substring(0, 10), signedBlock, signedBlock.Signature.ToString().Substring(0, 10), null); } bool nodeAccepted = await _beaconNodeApi.PublishBlockAsync(signedBlock, cancellationToken).ConfigureAwait(false); _validatorState.ClearProposalDutyForSlot(slot); } }
public async Task ProcessProposalDutiesAsync(Slot slot, CancellationToken cancellationToken) { // If proposer, get block, sign block, return to node // Retry if not successful; need to queue this up to send immediately if connection issue. (or broadcast?) BlsPublicKey?blsPublicKey = _validatorState.GetProposalDutyForSlot(slot); if (!(blsPublicKey is null)) { Activity activity = new Activity("process-proposal-duty"); activity.Start(); try { if (_logger.IsInfo()) { Log.ProposalDutyFor(_logger, slot, _beaconChainInformation.Time, blsPublicKey, null); } BlsSignature randaoReveal = GetEpochSignature(slot, blsPublicKey); if (_logger.IsDebug()) { LogDebug.RequestingBlock(_logger, slot, blsPublicKey.ToShortString(), randaoReveal.ToString().Substring(0, 10), null); } ApiResponse <BeaconBlock> newBlockResponse = await _beaconNodeApi .NewBlockAsync(slot, randaoReveal, cancellationToken).ConfigureAwait(false); if (newBlockResponse.StatusCode == StatusCode.Success) { BeaconBlock unsignedBlock = newBlockResponse.Content; BlsSignature blockSignature = GetBlockSignature(unsignedBlock, blsPublicKey); SignedBeaconBlock signedBlock = new SignedBeaconBlock(unsignedBlock, blockSignature); if (_logger.IsDebug()) { LogDebug.PublishingSignedBlock(_logger, slot, blsPublicKey.ToShortString(), randaoReveal.ToString().Substring(0, 10), signedBlock.Message, signedBlock.Signature.ToString().Substring(0, 10), null); } ApiResponse publishBlockResponse = await _beaconNodeApi .PublishBlockAsync(signedBlock, cancellationToken) .ConfigureAwait(false); if (publishBlockResponse.StatusCode != StatusCode.Success && publishBlockResponse.StatusCode != StatusCode.BroadcastButFailedValidation) { throw new Exception( $"Error response from publish: {(int) publishBlockResponse.StatusCode} {publishBlockResponse.StatusCode}."); } bool nodeAccepted = publishBlockResponse.StatusCode == StatusCode.Success; // TODO: Log warning if not accepted? Not sure what else we could do. _validatorState.ClearProposalDutyForSlot(slot); } } catch (Exception ex) { Log.ExceptionProcessingProposalDuty(_logger, slot, blsPublicKey, ex.Message, ex); } finally { activity.Stop(); } } }