【问题标题】:web3 instantly firing callbackweb3 立即触发回调
【发布时间】:2018-05-26 16:01:11
【问题描述】:

不确定我是否应该在 Ethereum SE 上发布此内容,但我觉得它与 JavaScript 更相关,所以我会在这里尝试:

我有一个非常简单的智能合约,它基本上只包含一个 getNum 函数和一个 setNum 函数。智能合约可以在这里查看:https://pastebin.com/ci6mbPDq

我正在尝试构建一个简单的前端来调用它。本质上,我关注这个guide。可以在此处找到我的前端的工作代码笔(演示 janky 功能):https://codepen.io/heh/pen/PeMmKe 正如您在我的代码笔中看到的那样,我将getNum 函数称为:

BasicToken.getNum(0x64319ca297239d8652a0b5f0f12dd6666cb0e05b,

        function(error, result)
        {
            console.log(result.toNumber());
            document.getElementById("target").innerText = result.toNumber();

        }
    );

但是,我一直得到“0”作为结果。另一方面,我的setNum 函数能够将结果发布到 Ropsten 区块链。但是,我注意到两个函数调用似乎都立即触发了它们的回调。

谁能帮我弄清楚为什么函数调用会立即返回?

谢谢!

【问题讨论】:

    标签: javascript callback blockchain ethereum web3


    【解决方案1】:

    回调没有被立即调用,问题是你没有发送一个实际的地址,它应该是一个字符串,你正在发送一个数字:

    0x64319ca297239d8652a0b5f0f12dd6666cb0e05b == 5.720054584403591e+47
    

    您会得到0,因为映射中不存在您发送的无效地址:

    mapping (address=>uint) map23;
    

    如果它不存在,它将返回 uint 的默认值,即零。

    发送一个字符串,它就会起作用:

    BasicToken.getNum('0x64319ca297239d8652a0b5f0f12dd6666cb0e05b', () => {})
    

    此外,如果您只希望当前用户检索他们自己的值,而不让其他用户检索该数据(他们可以,因为它是公开的,但并不那么容易),您应该使用 msg.sender 并删除该功能参数。

    function getNum() public view returns (uint) {
       return map23[msg.sender];
    }
    

    【讨论】:

    • 谢谢!这正是它!感谢您的提示,我会考虑到这一点
    • 不客气:),十六进制数字咬你,因为它是有效的语法:)
    • 是的,是的,我认为 javascript 出于某种原因有一个“地址”类型 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多