pragma solidity ^0.5.3;
contract SimpleFallback{
event FallbackCalledEvent(bytes data);
event AddEvent(uint a, uint b, uint result);
event DoubleEvent(uint a, uint b);
event GetNameEvent(string);
function() external{
emit FallbackCalledEvent(msg.data);
}
function add(uint a, uint b) public returns(uint){
// assert(a >= 0);
// assert(b >= 0);
// assert(a + b > a && a + b > b);
uint _result = a + b;
emit AddEvent(a, b, _result);
return _result;
}
function double(uint a) public returns(uint){
// assert(a >= 0);
// assert(2*a >= 0 && 2*a >= a);
uint _result = 2*a;
emit DoubleEvent(a, _result);
return _result;
}
function getName(string memory name) public returns(string memory){
emit GetNameEvent(name);
return name;
}
}
contract RunTest{
function callAddlTest(address other) public {
// bytes4 messageId = bytes4(keccak256("add(uint, uint)"));
// other.call(messageId, 5, 60);
other.call(abi.encodeWithSignature("add(uint,uint)", 85, 60));
}
function callDoublelTest(address other) public {
// bytes4 messageId = bytes4(keccak256("add(uint, uint)"));
// other.call(messageId, 5, 60);
other.call(abi.encodeWithSignature("double(uint)", 100));
}
function callgetNameTest(address other) public{
other.call(abi.encodeWithSignature("getName(string)", "hello"));
}
}callAddlTest,收缩SimpleFallback的地址,事件日志如下所示,这表明调用add()失败,触发了回退函数。[
{
"from": "0x038f160ad632409bfb18582241d9fd88c1a072ba",
"topic": "0x5cd57a899be814fb3a40e18f9d1ba77420bbd22073d35165511f750aa70538b6",
"event": "FallbackCalledEvent",
"args": {
"0": "0xb89663520000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000003c",
"data": "0xb89663520000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000003c",
"length": 1
}
}
]callDoubleTest,收缩SimpleFallback的地址,事件日志如下所示,这表明调用double()失败,触发了回退函数。[
{
"from": "0x038f160ad632409bfb18582241d9fd88c1a072ba",
"topic": "0x5cd57a899be814fb3a40e18f9d1ba77420bbd22073d35165511f750aa70538b6",
"event": "FallbackCalledEvent",
"args": {
"0": "0xd524bc570000000000000000000000000000000000000000000000000000000000000064",
"data": "0xd524bc570000000000000000000000000000000000000000000000000000000000000064",
"length": 1
}
}
]callgetNameTest,事件日志如下所示,这表明调用了getName()。 {
"from": "0x038f160ad632409bfb18582241d9fd88c1a072ba",
"topic": "0x26c73f7f14382f5db0b9f94dd29ff8938f2e4be69fb13e0825ece287e8e538d5",
"event": "GetNameEvent",
"args": {
"0": "hello",
"length": 1
}
}
]对于调用(abi.encodeWithSignature()),为什么:- 1)other.call(abi.encodeWithSignature("add(uint,uint)", 85, 60));不工作?- 2)other.call(abi.encodeWithSignature("double(uint)", 100));不工作?- 3)other.call(abi.encodeWithSignature("getName(string)", "hello"));工作吗?- 4) encodeWithSignature不支持多个参数,比较1)和3)?encodeWithSignature不支持uint参数吗,比较2)和3)?
发布于 2019-02-25 13:01:10
我已经找到了根本原因。它应该使用类型的全名,而不是它们的别名,所以应该是uint256而不是uint。
发布于 2022-05-08 10:22:16
(bool success, bytes memory response) = address(_address).call(abi.encodeWithSignature("transfer(address,address,uint256)", msg.sender, _to, _amount));第一个参数在encodeWithSignature方法中不应该包含任何空格。
发布于 2021-03-07 08:30:49
都是关于太空的
other.call(abi.encodeWithSignature("add(uint,uint)", 85, 60));改为:
other.call(abi.encodeWithSignature("add(uint,uint)",85,60));https://ethereum.stackexchange.com/questions/67572
复制相似问题