Ethernaut第24关Puzzle Wallet:浏览器控制台wallet对象指向哪个合约?
解答:Ethernaut Puzzle Wallet 代理合约调用疑惑
首先明确核心事实:你在控制台操作的合约地址是PuzzleProxy的地址,不是PuzzleWallet逻辑合约的地址——Ethernaut关卡展示的目标地址始终是代理合约。
接下来拆解你的疑问:
为什么ABI全是PuzzleWallet的?
这是Ethernaut的默认行为:为了让你方便调用逻辑合约的函数,它自动加载了PuzzleWallet的ABI。但ABI只是用来把函数调用转换成EVM可识别字节码的工具,和你实际调用的合约地址无关——你调用的始终是代理合约的地址。为什么能调用PuzzleProxy的proposeNewAdmin()?
因为proposeNewAdmin()是PuzzleProxy合约自己实现的函数,不属于逻辑合约。当你用这个函数签名调用代理地址时,EVM会直接匹配代理合约内的该函数并执行,不会走delegatecall转发给PuzzleWallet。代理合约的核心逻辑是:仅当调用的函数是自身未实现的,才会通过delegatecall转发给逻辑合约;如果是自身已有的函数,就直接执行自身代码。调用逻辑总结
- 调用PuzzleWallet的函数(如
deposit()、multicall()):代理合约无这些函数,触发fallback函数,通过delegatecall转发给逻辑合约执行代码。 - 调用
proposeNewAdmin():该函数在代理合约内存在,EVM直接执行代理合约内的对应逻辑,与逻辑合约无关。
- 调用PuzzleWallet的函数(如
简言之,ABI只是编码工具,实际执行的合约是你调用的代理地址,代理合约会根据函数是否为自身实现,决定直接执行还是转发给逻辑合约。
内容的提问来源于stack exchange,提问作者WestC
相关产品推荐
相关产品推荐

