首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >abi.encodeWithSignature不起作用

abi.encodeWithSignature不起作用
EN

Ethereum用户
提问于 2019-02-25 07:51:20
回答 3查看 5.1K关注 0票数 3
代码语言:javascript
复制
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"));
    }
}

操作如下.

  • 步骤1.部署2份合同;
  • 步骤2.调用callAddlTest,收缩SimpleFallback的地址,事件日志如下所示,这表明调用add()失败,触发了回退函数。
代码语言:javascript
复制
[
    {
        "from": "0x038f160ad632409bfb18582241d9fd88c1a072ba",
        "topic": "0x5cd57a899be814fb3a40e18f9d1ba77420bbd22073d35165511f750aa70538b6",
        "event": "FallbackCalledEvent",
        "args": {
            "0": "0xb89663520000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000003c",
            "data": "0xb89663520000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000003c",
            "length": 1
        }
    }
]
  • 步骤3.调用callDoubleTest,收缩SimpleFallback的地址,事件日志如下所示,这表明调用double()失败,触发了回退函数。
代码语言:javascript
复制
[
    {
        "from": "0x038f160ad632409bfb18582241d9fd88c1a072ba",
        "topic": "0x5cd57a899be814fb3a40e18f9d1ba77420bbd22073d35165511f750aa70538b6",
        "event": "FallbackCalledEvent",
        "args": {
            "0": "0xd524bc570000000000000000000000000000000000000000000000000000000000000064",
            "data": "0xd524bc570000000000000000000000000000000000000000000000000000000000000064",
            "length": 1
        }
    }
]
  • 步骤4.使用收缩SimpleFallback的地址调用callgetNameTest,事件日志如下所示,这表明调用了getName()。
代码语言:javascript
复制
    {
        "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)?

EN

回答 3

Ethereum用户

发布于 2019-02-25 13:01:10

我已经找到了根本原因。它应该使用类型的全名,而不是它们的别名,所以应该是uint256而不是uint

票数 5
EN

Ethereum用户

发布于 2022-05-08 10:22:16

代码语言:javascript
复制
(bool success, bytes memory response) = address(_address).call(abi.encodeWithSignature("transfer(address,address,uint256)", msg.sender, _to, _amount));

第一个参数在encodeWithSignature方法中不应该包含任何空格。

票数 0
EN

Ethereum用户

发布于 2021-03-07 08:30:49

都是关于太空的

代码语言:javascript
复制
other.call(abi.encodeWithSignature("add(uint,uint)", 85, 60));

改为:

代码语言:javascript
复制
other.call(abi.encodeWithSignature("add(uint,uint)",85,60));
票数 -1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/67572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档