我正在查看一个事务的输入,它调用了一个智能契约,但我无法理解它。这个具体的样本是在FTM上的,但是我假设对ETH的行为没有什么不同?
考虑一下这个事务:https://ftmscan.com/tx/0x6f9df515d75e9f0444ec2388d4c880b668d71c37ddd673a82941cdae39cac0a9
输入是0x42d8669300000000000000000000000088367cd6c890fc38ee3ec5a7b9baf71ef8ab6972,这意味着方法签名是0x42d86693。
现在,查看已发布的用于此事务交互的Smart契约的ABI on ftmscan,我可以看到它的源代码被标记为已验证,它提供了ABI,复制如下
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum Tangle.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct Tangle.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"_init","type":"address"},{"indexed":false,"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"DiamondCut","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum Tangle.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct Tangle.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_functionSelector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct Tangle.Facet[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]0x42d86693).中的签名匹配。
事实上,如果我使用https://lab.miguelmota.com/ethereum-input-data-decoder/example/来用ABI解码输入,它就无法被解码。根据https://4byte.directory的说法,这种方法是withdrawRewards(address),似乎很有意义,但是合同中没有这样的功能?
我还使用web3.eth.getCode获得了字节码的副本,并使用https://ethervm.io/对其进行了解压缩,看起来在ftmscan上发布的ABI确实与字节码相匹配。
有人能帮我们弄清楚这里发生了什么吗?带签名的0x42d86693函数是如何在似乎没有该签名功能的合同上调用的?
谢谢!
发布于 2022-03-10 05:53:25
在您的契约中,没有任何withdrawRewards(地址)函数,但是您调用的是不存在的函数,那么回退函数将是executed.In,该契约回退函数将调用其他契约,因此您无法解码输入,因为输入解码器无法知道其他契约的ABI。
https://ethereum.stackexchange.com/questions/123489
复制相似问题