当我根据合同运行方法时,如何获得运行结果



我想写一个简单的函数来调用合约上的方法,并获得运行结果

这是合同代码

function _evaluate(uint8[5] _uploads) internal returns (bytes32 resultId){
resultId= keccak256(abi.encodePacked(now,  msg.sender));
addressToid[msg.sender] = resultId;
idToResult[resultId] = Result(msg.sender, r);
}
function upload(uint8[5] _inputs) public returns ( bytes32 resultId) {
return _evaluate(_inputs);
}

前端js代码

// DEE is the contract name
return this.DEE.deployed()
.then((instance) => instance.upload(this.inputs,  {from: base.accounts[0]}))
.then((r) => {
this.message = "Transaction done"
console.log(r);


})
.catch((e) => {
console.error(e)
this.message = "Transaction failed"
})

但事实上,我发现返回的r是一个**交易细节**,比如

{tx: "0xa543fff3c3bac2268c0c94a21f6cf62faa8cf667defcd9fd8dcdbcf7669a4e58",

收据:{…},日志:数组(0(}日志:[]收据:{transactionHash:"0xa543fff3c3bac2268c0c94a21f6cf62faa8cf667defcd9fd8dcdbcf7669a4e58";,transactionIndex:0,blockHash:"0x07d691308724c73025de2f346dc0d6bc4eb7e7d9871e29ea2c4d4e8fb8222bb";,blockNumber:20,gasUsed:56460,…}tx:"0xa543fff3c3bac2268c0c94a21f6cf62faa8cf667defcd9fd8dcdbcf7669a4e58";原型:对象

没有关于应返回的id的信息。

我做错什么了吗?

我想我从这个Ethereum.StackExchange帖子中得到了解决方案:

当前不可能从以下函数返回值修改区块链。要接收返回值,您可以标记只读函数为";常数";。

对于非常数函数;返回";信息由使用Solidity事件,这些事件在以太坊中合并为LOG操作码虚拟机。

来源:Taylor Gerring,2016年4月23日上午7:47

N.B.-答案已在原始位置更新,以反映Solidity的变化

在函数定义中指定"视图":

function upload(uint8[5] _inputs) public view returns ( bytes32 resultId) {
// do something here
// save ad calculate
return "123";
}

最新更新