如何获取 Ethers.js 响应数据

问题描述

稳定性:

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 事件及其值)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...