/// <inheritdoc/> public override BlockTemplate Build(ChainedHeader chainTip, Script scriptPubKeyIn) { this.logger.LogTrace("()"); GetSenderUtil.GetSenderResult getSenderResult = GetSenderUtil.GetAddressFromScript(scriptPubKeyIn); if (!getSenderResult.Success) { throw new ConsensusErrorException(new ConsensusError("sc-block-assembler-createnewblock", getSenderResult.Error)); } this.coinbaseAddress = getSenderResult.Sender; this.stateSnapshot = this.stateRoot.GetSnapshotTo(((SmartContractBlockHeader)this.ConsensusLoop.Tip.Header).HashStateRoot.ToBytes()); this.refundOutputs.Clear(); this.receipts.Clear(); base.OnBuild(chainTip, scriptPubKeyIn); this.coinbase.Outputs.AddRange(this.refundOutputs); this.logger.LogTrace("(-)"); return(this.BlockTemplate); }
/// <summary> /// Retrieves the context object to be given to the contract executor. /// </summary> private ISmartContractTransactionContext GetSmartContractTransactionContext(RuleContext context, Transaction transaction) { ulong blockHeight = Convert.ToUInt64(context.ValidationContext.ChainedHeader.Height); GetSenderUtil.GetSenderResult getSenderResult = GetSenderUtil.GetSender(transaction, ((PowConsensusRules)this.Parent).UtxoSet, this.blockTxsProcessed); if (!getSenderResult.Success) { throw new ConsensusErrorException(new ConsensusError("sc-consensusvalidator-executecontracttransaction-sender", getSenderResult.Error)); } Script coinbaseScriptPubKey = context.ValidationContext.Block.Transactions[0].Outputs[0].ScriptPubKey; GetSenderUtil.GetSenderResult getCoinbaseResult = GetSenderUtil.GetAddressFromScript(coinbaseScriptPubKey); if (!getCoinbaseResult.Success) { throw new ConsensusErrorException(new ConsensusError("sc-consensusvalidator-executecontracttransaction-coinbase", getCoinbaseResult.Error)); } Money mempoolFee = transaction.GetFee(((UtxoRuleContext)context).UnspentOutputSet); return(new SmartContractTransactionContext(blockHeight, getCoinbaseResult.Sender, mempoolFee, getSenderResult.Sender, transaction)); }