如何获取Ethers.js响应数据

2022-04-10 00:00:00 solidity javascript ethers.js

坚固性:

function ping() public view returns ( uint ) {
    return 999999999;
}
function ping2() public returns ( uint ) {
    return 999999999;
}

Java 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也返回[对象对象]?


解决方案

(等待契约.ping()).toString();//->;999999999(正确)

ping()是一个view函数-您只需调用它,而无需创建事务。因此,ethers.js不会创建事务,而只是返回调用的结果。


(等待契约.ping2()).toString();//->;[对象对象](??)

为什么使用sendTransaction也返回[对象对象]?

ping2()是正则public函数。这表明您需要创建一个事务来执行它(尽管在本例中它不会进行任何状态更改,因此它也可以是一个视图函数)。

在创建事务时,Ethers.js返回事务数据,而不是协定函数返回值。

读取事务使用Ethers.js生成的值的方法很少。

  • 在这种情况下,ping2()不会进行任何状态更改,甚至不会读取任何区块链数据,因此它可能是pure函数。如果它在读取区块链数据,它将是一个view函数...在这两种情况下,ethers.js都返回函数调用(而不是tx)的结果。

  • 设置程序和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事件及其值)。

相关文章