创建区块上下文
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 源码。