我知道如何使用CALL或DELEGATECALL来检查当前合同的函数是否被调用(通过将address(this)与以前必须保存为不可变变量的契约地址进行比较)。
但是,我想知道是否有可能检查DELEGATECALL是否在交易的任何点发生过,例如:
用户->合同A -> (委托代理) ->合同B -> (呼叫) ->合同C
据我所知,从合同的C角度来看,它正在接到来自合同A的电话,我并不认为合同C能够“检测”合同A和B之间发生的DELEGATECALL。
发布于 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检查执行跟踪,就像每个人使用的一样。
https://ethereum.stackexchange.com/questions/142370
复制相似问题