【问题标题】:How to properly use the call (or delegatecall) in solidity如何在solidity中正确使用调用(或delegatecall)
【发布时间】:2023-03-27 08:48:01
【问题描述】:

我正在尝试使用这种方法:

function test(uint amount) public {
        address(0xf5eA38B6b9644224dA1aECbC1219e8543c0689b2).call(abi.encodeWithSignature("deposit(uint)",amount));
    }

但是交易被还原了,这是因为金额没有以某种方式进行哈希处理,我真的不知道该怎么做,我应该如何处理金额?这些是交易:

-失败的使用方法:https://bscscan.com/tx/0x7fdd50cee23295ea866baa8961a2105c58162e77125df852a4fc5bf0fad2f507

这是输入数据:

函数:测试(uint256 tAmount)***

方法ID:0x29e99f07 [0]:000000000000000000000000000000000000000000000000000000000000000001

-直接从站点调用合约而不是在另一个智能合约中使用调用的成功者:https://bscscan.com/tx/0xfd4158766f25761fa5dddb0683c677085a04ea6db05e03794be375a8243d7128

这是输入数据:

函数:存款(uint256 _amount) ***

方法ID:0xb6b55f25 [0]:0000000000000000000000000000000000000000000000000005427aedb41a400

我需要以某种方式计算金额吗?

【问题讨论】:

    标签: call blockchain ethereum solidity binance


    【解决方案1】:

    目标合约将uint定义为参数类型,但它只是一个别名uint256。 ABI 编码方法不会自动转换别名,因此您需要在代码中进行更改。

    // `uint256` instead of `uint`
    abi.encodeWithSignature("deposit(uint256)",amount)
    

    【讨论】:

    • 已经试过了,没有任何改变,交易还是被还原了
    • @CarloParisi Transaction 可能由于多种原因而恢复,包括函数体中失败的 require() 语句(或函数依赖项,例如它调用的其他函数和外部合约)。我的 sn-p 解决了其中一个原因,那就是计算正确的函数签名。不幸的是,解决事务失败的所有可能原因通常超出了 StackOverflow 答案的范围,但我建议您调试执行跟踪,查找可能导致 tx 恢复的 requireassert 语句。跨度>
    • 我正在查看 VM 跟踪,但它是汇编,很难理解,在调用函数之后我应该传递所有要求/修饰符有没有比 VM 跟踪更容易的东西?
    • 我通常的方法是阅读合约源代码并查找requireassert 语句,包括它调用的所有函数(可能在其他合约中)。如果您没有目标合约源代码,那么是的,这会有点复杂,您需要使用 VM 跟踪或类似工具(我最喜欢的是 Panoramix,BscScan 中的included) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2020-03-07
    • 2022-03-29
    • 2013-02-23
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多