private void CheckTransaction(Transaction transaction, Money suppliedBudget) { if (!transaction.IsSmartContractExecTransaction()) { return; } TxOut scTxOut = transaction.TryGetSmartContractTxOut(); if (scTxOut == null) { new ConsensusError("no-smart-contract-tx-out", "No smart contract TxOut").Throw(); } ICallDataSerializer serializer = CallDataSerializer.Default; Result <ContractTxData> callDataDeserializationResult = serializer.Deserialize(scTxOut.ScriptPubKey.ToBytes()); if (callDataDeserializationResult.IsFailure) { new ConsensusError("invalid-calldata-format", string.Format("Invalid {0} format", typeof(ContractTxData).Name)).Throw(); } ContractTxData callData = callDataDeserializationResult.Value; if (callData.GasPrice < GasPriceMinimum) { // Supplied gas price is too low. this.ThrowGasPriceLessThanMinimum(); } if (callData.GasPrice > GasPriceMaximum) { // Supplied gas price is too high. this.ThrowGasPriceMoreThanMaximum(); } // TODO: When checking gas limit, if checking for a CREATE, do BaseFee + CreationAndValidationFee if (callData.GasLimit < GasLimitMinimum) { // Supplied gas limit is too low. this.ThrowGasLessThanBaseFee(); } if (callData.GasLimit > GasLimitMaximum) { // Supplied gas limit is too high - at a certain point we deem that a contract is taking up too much time. this.ThrowGasGreaterThanHardLimit(); } // Note carrier.GasCostBudget cannot overflow given values are within constraints above. if (suppliedBudget < new Money(callData.GasCostBudget)) { // Supplied satoshis are less than the budget we said we had for the contract execution this.ThrowGasGreaterThanFee(); } }
public static ContractTxData GetContractTxData(ICallDataSerializer callDataSerializer, TxOut scTxOut) { Result <ContractTxData> callDataDeserializationResult = callDataSerializer.Deserialize(scTxOut.ScriptPubKey.ToBytes()); if (callDataDeserializationResult.IsFailure) { new ConsensusError("invalid-calldata-format", string.Format("Invalid {0} format", typeof(ContractTxData).Name)).Throw(); } ContractTxData txData = callDataDeserializationResult.Value; return(txData); }