如何将外部智能合约event中的变量存入本合约storage变量
问题解答:链上读取外部合约事件并存入自身Storage的可行性
核心结论
EVM 架构中,事件(Event)属于日志类数据,仅会存储在链的区块收据中,没有任何链上合约可以直接读取任意事件的内容,因此你想要在调用外部合约函数后直接读取其触发的事件并存入自身Storage,不存在原生的直接实现方案。
可行替代方案
- 方案一:改造外部合约增加返回值(最优)
如果有权限修改外部合约代码,直接给foo函数增加对应变量的返回值,调用时直接接收返回值存入Storage即可,示例代码如下:
// 改造后的外部合约foo函数 function foo(bytes calldata boo) external returns (bytes memory desiredVariable) { // 原有业务逻辑 desiredVariable = 你的目标变量; emit Event(desiredVariable); return desiredVariable; } // 你的合约调用逻辑 bytes public savedVariable; function callExternalFoo(bytes calldata boo) external { savedVariable = ExternalContract.foo(boo); }
- 方案二:读取外部合约公开状态变量
如果无法修改外部合约,但外部合约会将你需要的desiredVariable存入自身的Public状态变量,你可以在调用完foo函数后,直接读取该公开变量存入自身Storage。 - 方案三:基于去中心化预言机的事件证明
如果既不能修改外部合约,目标变量也没有对外公开的状态变量存储,可以依赖去中心化预言机网络的事件证明能力:预言机节点会抓取对应区块的事件内容,生成有效性证明后上链提交给你的合约,合约验证证明合法后即可将变量存入Storage,全程不需要你自行维护链下脚本,但依赖预言机网络的安全性。
注意事项
不要尝试在同一个调用事务内读取事件内容,EVM在事务执行过程中不会临时存储可被合约访问的事件数据,事件只有在整个事务执行完成、打包上链后才会写入区块收据,合约没有任何直接访问路径。
内容的提问来源于stack exchange,提问作者OneThunder
相关产品推荐
相关产品推荐

