[英]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;
}
}
call
function 而不是直接从合约实例调用 function 的任何优势。 使用它有什么好处?callWithEncodeSignature
未能通过require(success)
。 我找不到原因。callWithEncode
function 给出“TypeError:function 调用的参数计数错误”。 我错过了什么?1- 提供调用、调用代码和委托调用函数是为了与没有 ABI 的函数进行交互。 由于对合同的类型安全性和安全性的影响,这些功能使用起来并不安全。
2-你应该这样称呼它:
_t.call( data)("")
3- call
只需要一个参数,但您传递的是 3 arguments
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.