cfx_estimateGasAndCollatory 行为
cfx_estimateGasAndCollateral
接口是 Conflux 区块链中的一个关键组成部分,该接口允许用户可在发起交易前,估算交互所需交易费用和存储抵押费用 本文档旨在清晰地概述 cfx_estimateGasAndCollateral
接口的功能,特别强调其对各种参数配置的响应。
以下描述的行为是由 conflux-rust 实现的,这是Conflux协议的官方Rust实现。
参数缺失或默认情况下的行为
接口的响应取决于输入中特定字段是否存在:
- 如果
from
字段缺失:接口将不会执行与余额
相关的检查。 (然而,因为from
字段缺失,执行可能会失败)。 - 如果
gas_price
缺失:则跳过与gas相关的交易费用检查和代付gas上限检查。 - 如果
nonce
缺失:接口自动填充当前正确的nonce。 相反,如果提供了nonce
,交易将使用指定的nonce进行,避免由于与nonce相关的错误而失败。 - 如果
value
缺失:默认设置为0。 - 如果
data
缺失:默认为空。 - 如果
to
缺失:接口默认为合约创建。
通常,Conflux SDK(例如,js-conflux-sdk、java-conflux-sdk等)会自动调用 cfx_estimateGasAndCollateral
, 若要发起交易。 如果你没有直接调用 cfx_estimateGasAndCollateral
,上述参数的存在与否将取决于你使用的SDK的行为。
处理多余的参数
虽然 cfx_estimate
的主要功能是用于估算gas和存储抵押,但它也接受由用户输入这些参数。 本节概述了在这些情况下应用的逻辑:
指定gas
- 交易使用指定的
gas
执行。 这是除了gas
消耗超过1500万限制之外,唯一可能出现OutOfGas
错误的情况。 - 如果同时指定了
from
和gas_price
,在估算过程中将扣除交易费用。 否则,费用将在执行后重新检查。
指定存储限制
- 在交易执行估算期间,指定的
storage_limit
会被忽略。 估算后,将评估所指定的存储限制是否足够。
其他考量
存储代付:在存储被代付的情况下,不执行 storage_limit
检查,遵循Conflux的内在逻辑。
错误
Estimation isn't accurate: transaction is reverted
{
"code": -32015,
"message": "Estimation isn't accurate: transaction is reverted. Innermost error is at CFX:TYPE.CONTRACT:ACDUZTJBPM9PPP9F0K5VT3PJU0EJUDNHP2ZM7WS35N: Vm reverted. .",
"data": "CFX:TYPE.CONTRACT:ACDUZTJBPM9PPP9F0K5VT3PJU0EJUDNHP2ZM7WS35N: Vm reverted. \nCFX:TYPE.CONTRACT:ACD5E6SPRGMDVG15FDXF2B8AH7DAN7GMZAGXA10EPZ: Vm reverted. "
}
遇到此错误意味着接口未能返回估算结果,因为交易被回滚(合约方法代码未能执行)。 这个错误可能有多种原因,例如:相关ERC-20代币或NFT的余额不足;合约方法的参数错误;缺乏权限或授权等。
如果在合约执行期间抛出错误消息,可以在RPC错误消息中看到合约执行失败的具体原因。 例如,当转移NFT(1155)时出现以下错误,表示余额不足:Estimation isn't accurate: transaction is reverted: ERC1155: insufficient balance for transfer. Innermost error is at xxxx: Vm reverted. ERC1155: insufficient balance for transfer
.
解决方案:你应该根据错误提示检查合约的逻辑。 在特定场景下(例如当抛出solidity自定义错误时),错误可能不会在错误字符串中显示。 在这种情况下,使用 cfx_call
与相同的参数将返回对应的十六进制错误字符串。 建议参考Solidity或特定语言的SDK中的自定义错误 ,了解如何解决十六进制错误字符串。