跳转到主要内容
Leafage 按指定链和区块读取链上状态。以下示例在 Chaintable Notebook 中运行,Function 中同样可用;Function 中的使用方式见数据访问。源码提供完整实现。

创建区块上下文

EVM(chain_id, block_id='latest')

账户状态和合约调用都在该区块上读取。需要一致的多次读取时,先确定区块 ID,再复用同一个对象。

区块查询

区块字典包含 id、height、timestamp 等字段;timestamp 为 Unix 秒数。不同链可能包含不同的附加字段。查询其他区块不会改变对象自身的区块。

账户状态

合约调用

evm.call(contract, method, args=None, *, from_addr=None)

单个输出值直接返回,多个输出值返回元组,无输出返回 ();整数为 Python int。调用失败时抛出异常。
这是读取或模拟合约调用,不会向链上发送交易。

批量合约调用

输出为 USDC 6。

Call(contract, method, args=None, *, from_addr=None)

描述一次调用,参数与 evm.call() 相同。构造时在本地校验地址、签名和参数,不合法时抛出 ContractCallInvalidInputError,不发请求。同一个 Call 可以交给不同的 EVM 对象执行。

evm.call_many(calls, *, raise_on_error=True)

按输入顺序返回结果列表,每项的形式与 evm.call() 相同;空列表直接返回 []。默认任一调用执行或解码失败就抛出异常,异常带 call_index 指出是第几个调用。传入 raise_on_error=False 时,失败的调用在对应位置返回 None,其他结果不变;参数错误、区块不存在和服务错误仍会抛出。

状态覆盖

set_block_overrides(value) 和 set_state_overrides(value) 设置模拟调用的区块和账户状态覆盖;对应的 get_*_overrides() 返回当前设置。覆盖只影响合约调用,不影响余额、nonce、代码和存储查询,也不修改链上状态。字段规范与完整示例见 Leafage 源码。