问题描述
稳定性:
function ping() public view returns ( uint ) {
return 999999999;
}
function ping2() public returns ( uint ) {
return 999999999;
}
Javascript Ethers.js:
(await contract.ping()).toString(); //-> 999999999 ( correct )
(await contract.ping2()).toString(); //-> [object Object] ( ?? )
为什么 ping2 返回 [Object Object] ?如何从ping2获取数据?
还有:
(await contract.sendTransaction(txObj)).toString(); //-> [object Object] ( ?? )
为什么使用 sendTransaction 也会返回 [object Object] ?
解决方法
(await contract.ping()).toString(); //-> 999999999(正确)
ping()
是一个 view
函数 - 您可以直接调用它而无需创建交易。所以 ethers.js 不会创建交易,只会返回调用的结果。
(await contract.ping2()).toString(); //-> [object Object] ( ?? )
为什么使用 sendTransaction 也会返回 [object Object] ?
ping2()
是一个常规的 public
函数。这表明您需要创建一个事务来执行它(即使在这种情况下它不会进行任何状态更改,因此它也可能是一个视图函数)。
当您创建交易时,Ethers.js 返回交易数据而不是合约函数的返回值。
使用 Ethers.js 读取交易产生的值的方法很少。
在这种情况下,
ping2()
不会进行任何状态更改,甚至不会读取任何区块链数据,因此它可能是一个pure
函数。如果它正在读取区块链数据,它将是一个view
函数......在这两种情况下,ethers.js
都返回函数 call(而不是 tx)的结果。>-
与 setter 和 calling a getter 的交易。
contract MyContract { uint256 value; function setValue(uint256 _value) public { value = _value; } function getValue() public view returns (uint256) { return value; } }
首先您创建一个执行
setValue()
函数的事务,然后调用getValue()
(没有事务,因此它返回您的 JS 中的值)。 -
读取您的交易产生的事件日志
event Transfer(address from,address to,uint256 amount); function transfer(address _to,uint256 _amount) public { emit Transfer(msg.sender,_to,_amount); }
您可以获得还包含事件日志的 transaction receipt(在本例中为
Transfer
事件及其值)。