繁体   English   中英

关于 Solidity 的问题致电 function

[英]Questions about Solidity call function

我正在研究关于call function 的电话并被卡住了。 下面是我正在处理的代码,我想要的是从Foo in Loo合同中调用bar function。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract Loo {
    Foo foo;

    function callWithInstance(address payable _t, uint a, uint b) public payable returns(uint) {
        foo = Foo(_t);
        return foo.bar(a,b);
    }
    
    function callWithEncodeSignature(address _t, uint a, uint b) public returns(uint) {
       bytes memory data = abi.encodeWithSignature("bar(uint, uint)", a, b);
        (bool success, bytes memory returnData) = _t.call( data);
        require(success);
        uint c = abi.decode(returnData, (uint));
        return c;
    }

    function callWithEncode(address _t, uint a, uint b) public returns(uint) {
        (bool success, bytes memory returnData) = _t.call( bytes4(keccak256("bar(uint, uint)")), a, b);
        require(success);
        uint c = abi.decode(returnData, (uint));
        return c;
    }
    
}

contract Foo {
    function bar(uint a, uint b) public pure returns(uint) {
        return a+b;
    }
}
  1. 我找不到使用call function 而不是直接从合约实例调用 function 的任何优势。 使用它有什么好处?
  2. 我的callWithEncodeSignature未能通过require(success) 我找不到原因。
  3. 我的callWithEncode function 给出“TypeError:function 调用的参数计数错误”。 我错过了什么?

1- 提供调用、调用代码和委托调用函数是为了与没有 ABI 的函数进行交互。 由于对合同的类型安全性和安全性的影响,这些功能使用起来并不安全。

2-你应该这样称呼它:

  _t.call( data)("")

3- call只需要一个参数,但您传递的是 3 arguments

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM