以太坊智能合约没有功能返回值

时间:2017-12-24 08:37:43

标签: ethereum smartcontracts

我是智能合约的新手,我已经部署了这个测试合同

contract test {
    function callme(address dest, uint num, bytes data, uint nonce)
        public
        returns (bytes32 myhash)
    {
        myhash = sha3(dest, num, data, nonce);

        return (myhash);
    }
}

然后我调用test.callme(eth.accounts [0],10,0xaaaaa,1234),希望它返回传递参数的sha3哈希,但是没有返回值。

> test.callme(eth.accounts[0], 10, 0xaaaaa, 1234)
INFO [12-24|19:35:40] Submitted transaction                    fullhash=0x694e0e38d0cf8744e62113750339a65f1d5a35cdc634eeb02b93581a926fea1a recipient=0xed712462999f8f68BbF618C3845F4333eDC31cD5
"0x694e0e38d0cf8744e62113750339a65f1d5a35cdc634eeb02b93581a926fea1a"

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您的语法有点偏离 - 您不需要为返回值myhash命名。这样的事情可以解决问题:

contract test {
    function callme(address dest, uint num, bytes data, uint nonce)
        public
        constant
        returns (bytes32)
    {
        bytes32 myhash = sha3(dest, num, data, nonce);
        return myhash;
    }
}

我还提交了一个constant关键字,因为该功能并未计划更改合同存储空间中的任何内容。这是一个很小的改变,但对于你正在尝试做的事情是必要的。

包含常数使您可以获得“返回”。可以这么说,因为它说你不需要修改区块链 - 实质上,你是在阅读'链条,而不是写作'它。

想象一下这样做的合同:

contract test {

    uint example;

    function callme()
        public
        returns (uint)
    {
        example = example + 1;
        return example;
    }
}

我们发送给callme的交易实际上必须在之前执行我们返回值(因为我们正在修改区块链)。因此,我们无法立即返回最终价值(我们会返回有关交易的信息),因为我们必须等待区块链首先更新。