首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查事务期间是否发生了DELEGATECALL事件

检查事务期间是否发生了DELEGATECALL事件
EN

Ethereum用户
提问于 2023-01-05 15:26:00
回答 1查看 53关注 0票数 2

我知道如何使用CALL或DELEGATECALL来检查当前合同的函数是否被调用(通过将address(this)与以前必须保存为不可变变量的契约地址进行比较)。

但是,我想知道是否有可能检查DELEGATECALL是否在交易的任何点发生过,例如:

用户->合同A -> (委托代理) ->合同B -> (呼叫) ->合同C

据我所知,从合同的C角度来看,它正在接到来自合同A的电话,我并不认为合同C能够“检测”合同A和B之间发生的DELEGATECALL。

EN

回答 1

Ethereum用户

发布于 2023-01-05 16:51:20

我认为你是对的,考虑到你不能控制或写出A和B的逻辑,这似乎是不可能的。

但是,如果我们只考虑您的3个合同的例子,可能会有一种昂贵的方法来检测A是代理还是A在智能契约C中的代码中有DELEGATECALL。当A(调用方)有DELEGATECALL或字节码类似于一些流行的代理模式时,A可能使用DELEGATECALL调用C。执行契约C时,通过将A的字节码复制到内存中并对其进行分析,可以完成非常昂贵的任务。我想您可能会发现这个EXTCODECOPY操作码很有趣:链接。如果您可以编写逻辑来分析从EXTCODECOPY (msg.sender)获得的所有字节码,以检查其字节码是否与代理类似,您可能有机会说“它可能是委托调用”。

但是回到“任意点”的问题,意味着它可能是一个长调用链,DELEGATECALL可能在目标合同C之前在链中发生5-10次调用。我认为智能契约是不可能的。唯一的方法是使用evm跟踪tx检查执行跟踪,就像每个人使用的一样。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/142370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档