我是智能合约的新手,我已经部署了这个测试合同
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"
感谢任何帮助
答案 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
的交易实际上必须在之前执行我们返回值(因为我们正在修改区块链)。因此,我们无法立即返回最终价值(我们会返回有关交易的信息),因为我们必须等待区块链首先更新。