我们在主网络上部署了一份智能合同,最近的一些交易已经开始失败。你知道我们怎么开始调试合同吗?
合同地址:0x81EAF1fF62B8cca5314287B14e75E04E21b8F2
最近三次0x7ea699902c6a4be61d0037baaabbb8be5269cb2956c2fe617e88b82304aba615 0x1e29f225021bc9f9c886bdcb1a5a69af98ae5b7821773c40f0ad23a82975c8e5 0xbe4853a7d079ef35e88bdb3c5e2f44ced4263d13ced64563143514400a342b1b失败的事务
发布于 2022-03-05 22:24:14
我知道这是个老帖子,但是对于任何发现这个的人来说,希望这能有所帮助。
我一直温柔地使用,因为我有困难阅读geth调试2工具上的扫描站点,目前正在调试一个问题自己。
https://dashboard.tenderly.co/
当我的交易说“失败”时,它给了我一些更清楚的细节,除非它已经立即恢复。
我绝不是专家,但是对于这个问题的前三个话题,他们基本上都是在合同被调用后恢复的。
在许多情况下,这通常意味着在传递契约和/或契约时输入参数不正确,该契约试图进行一些计算,但立即失败。
对于我自己来说,一个非常具体的例子是,当我向我的合同发送字节并对它们进行错误的解码时。
function encodeStuff(
address myAddress,
uint256 amount,
address someAddress,
bytes calldata swapData
) external {
bytes memory data = abi.encode(myAddress, amount, someAddress, swapData);
}然后,在另一个函数中,在解码时,我尝试用所有内容解压缩swapData字节:
(
address myAddress,
uint256 amount,
address someAddress,
address someAddress1,
address someAddress2,
address someAddress3,
address someAddress4,
bytes memory extra_data1,
address token_address,
bytes memory extra_data2
) = abi.decode(swapdata,
(
address
uint256
address
address,
address,
address,
address,
bytes,
address,
bytes
));因为我这样做了,当事务看到没有需要从bytes memory data解码的额外数据时,事务立即恢复。
我真的需要破译两次。
// First decode data to get swapData bytes
(address myAddress, uint256 amount, address someAddress, bytes memory swapData) = abi.decode(data, (address, uint256, address, bytes));
// Now decode swapData
(
address someAddress1,
address someAddress2,
address someAddress3,
address someAddress4,
bytes memory extra_data1,
address token_address,
bytes memory extra_data2
) = abi.decode(swapdata,
(
address,
address,
address,
address,
bytes,
address,
bytes
));这个问题非常具体,但是错误会出现在扫描站点上,就像这个问题中的散列一样,“失败”而没有太多额外的数据。
如果我能深入了解更多不需要手臂或腿的调试方法,我会更新它。
发布于 2022-01-29 21:18:56
尝试在分叉的主板上使用seth debug <txhash>和dapptools!
https://ethereum.stackexchange.com/questions/52157
复制相似问题