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
,签约SimpleFallback的地址,事件日志如下,这表明成功调用了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));
无效?
other.call(abi.encodeWithSignature("getName(string)", "hello"));
起作用了吗? abi.encodeWithSignature
不支持多个参数吗?
并比较2)和3)abi.encodeWithSignature
不支持uint参数吗?答案 0 :(得分:0)
我已经找到了根本原因。它应该使用类型的全名而不是别名,因此应为uint256
而不是uint
。