首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >固体abi.encodeWithSignature不适用于不同的参数

固体abi.encodeWithSignature不适用于不同的参数
EN

Stack Overflow用户
提问于 2019-02-25 09:41:32
回答 1查看 736关注 0票数 0
代码语言: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
        }
    }
]

问题: for call(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)比较1)和3),abi.encodeWithSignature不支持多参数吗?abi.encodeWithSignature不支持uint参数吗,比较2)和3)?
EN

回答 1

Stack Overflow用户

发布于 2019-02-25 12:50:27

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54863261

复制
相关文章

相似问题

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