题目
你在做「发送前模拟」,需要选择一个区块参数来执行只读调用。
同事说用最新区块就行,你更倾向于使用待处理状态。请说明两者的差别,以及选择不同参数会对模拟结果产生什么影响。
考察目标
- 能否说明各区块参数的语义差别。
- 是否理解模拟结果与真实执行之间仍然存在差距。
- 能否指出这种差距无法通过选择参数消除。
考察区块参数的语义差别,以及模拟在哪种状态下最接近即将上链的情形。
你在做「发送前模拟」,需要选择一个区块参数来执行只读调用。
同事说用最新区块就行,你更倾向于使用待处理状态。请说明两者的差别,以及选择不同参数会对模拟结果产生什么影响。
eth_call 可以指定 latest 或 pending 等区块标识。latest 基于最新已出块状态;pending 请求节点的待处理状态,但它包含哪些交易取决于节点实现与本地交易池,不能保证覆盖全部待打包交易,也不能保证更接近最终执行。应把两种模拟结果都视为当前节点的预测。
eth_call、eth_getBalance、eth_getCode、eth_getTransactionCount 等方法把区块标识作为参数,取值包括区块号、latest、earliest、pending 与区块标识对象(依据:EIP-1474 §Block Identifier 的说明与方法列表)。eth_call 表示立即执行一次消息调用而不提交交易,返回执行结果;该结果不落链(依据:EIP-1474 §eth_call)。pending 是节点提供的待处理视图;节点可能计入本地已知交易,也可能将其近似为最新已出块状态,因此不同端点结果可能不同(依据:EIP-1474 §Block Identifier;具体内容取决于节点实现)。pending 模拟可能提前暴露额度或库存冲突;交易池不完整、排序变化及私有交易仍会使预测失准(依据:工程经验,无规范依据)。eth_call 的结果不落链,依据:EIP-1474 §eth_call)。pending 视图在各节点上一致。pending 视图在不同节点上可能不同?这对实现有什么影响?latest 不包含未打包交易,pending 是否计入相关待处理交易取决于节点。pending 可能更接近某些待处理状态,也可能与最终执行偏离,并指出它是节点本地视角。发现这道题有问题? 反馈此题