如何读取一个合约方法执行后(赋值类方法)的返回值

比如说 cita-java-sdk 例子中的 Token.sol:

    function transfer(address _to, uint256 _value) public returns (bool success) {
        if (balances[msg.sender] >= _value && _value > 0) {
            balances[msg.sender] -= _value;
            balances[_to] += _value;
            Transfer(msg.sender, _to, _value);
            return true;
        } else { 
            return false; 
        }
    }

这个 transfer 方法执行完毕后会返回一个 bool,但是从示例中看到对该方法的调用最终拿到的是一个 TransactionReceipt 里面只有交易 hash 、errormsg 等信息,并没有函数执行的返回值,请问从哪可以读到这个返回值呢?

@baojun 回复一下这个问题吧

交易中这个返回值是无法获取到的,如果需要获取监听或者返回值,可以注册event事件,比如

    event TransferResult(bool success)

然后交易结束发送出事件

   emit TransferResult(true/false)

之后可以在前端创建event监听

var transferEvent = tokenContract.TransferResult({}, {fromBlock: 0, toBlock: 'latest'});

transferEvent.watch(function(error, result){
//处理
})

也可以把想要的数据状态存起来,然后设计一个 call 方法来获取吧?

顺便再问下,比如说条件校验 require(a > 1, "some thing is wrong"); 当第一个参数条件不满足时,合约执行会中断,那么这里面第二个参数 msg 可以在哪里读取到?TransactionReceipt 里面似乎也没有?

参考一下下面这个 talk:

汗,那能不能认为 require 这个语句很鸡肋?或者说它的第二个参数很鸡肋。。。