我是智能合约的新手,我已经部署了该测试合同
contract test {
function callme(address dest, uint num, bytes data, uint nonce)
public
returns (bytes32 myhash)
{
myhash = sha3(dest, num, data, nonce);
return (myhash);
}
}
i然后致电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"
任何帮助都将受到赞赏
您的语法有些关闭 - 您不需要命名返回值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
的事务实际上必须在之前执行我们返回值(因为我们正在修改区块链)。因此,我们不能真正立即返回最终值(而是我们返回有关交易的信息),因为我们必须等待首先更新区块链。