如何获取 Ethers.js 响应数据

Om *_*ari 9 javascript solidity ethers.js

坚固性:

function ping() public view returns ( uint ) {
    return 999999999;
}
function ping2() public returns ( uint ) {
    return 999999999;
}
Run Code Online (Sandbox Code Playgroud)

JavaScript Ethers.js:

(await contract.ping()).toString();  //-> 999999999  ( correct ) 
(await contract.ping2()).toString(); //-> [object Object] ( ?? )
Run Code Online (Sandbox Code Playgroud)

为什么 ping2 返回 [Object Object] ?如何获取 ping2 的数据?

还:

(await contract.sendTransaction(txObj)).toString(); //-> [object Object] ( ?? )
Run Code Online (Sandbox Code Playgroud)

为什么使用 sendTransaction 还返回 [object Object] ?

小智 8

这是Force Hero使用事件的一个很好的解决方案。

简而言之:

const tx = await contract.transfer(...args); // 100ms
const rc = await tx.wait(); // 0ms, as tx is already confirmed
const event = rc.events.find(event => event.event === 'Transfer');
const [from, to, value] = event.args;
console.log(from, to, value);
Run Code Online (Sandbox Code Playgroud)


Pet*_*jda 7

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

ping()是一个view函数 - 您可以直接调用它而无需创建交易。所以 ethers.js 不会创建交易,只是返回调用结果。


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

为什么使用 sendTransaction 还返回 [object Object] ?

ping2()是一个正则public函数。这表明您需要创建一个事务来执行它(即使在这种情况下它不会进行任何状态更改,因此它也可能是一个视图函数)。

当您创建交易时,Ethers.js 返回交易数据而不是合约函数返回值。

有几种方法可以读取使用 Ethers.js 生成的交易值。

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

  • 事务到 setter 并调用 getter

    contract MyContract {
        uint256 value;
    
        function setValue(uint256 _value) public {
            value = _value;
        }
    
        function getValue() public view returns (uint256) {
            return value;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    首先,您创建一个执行该setValue()函数的事务,然后调用getValue()(没有事务,因此它返回 JS 中的值)。

  • 读取您的交易产生的事件日志

    event Transfer(address from, address to, uint256 amount);
    
    function transfer(address _to, uint256 _amount) public {
        emit Transfer(msg.sender, _to, _amount);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    您可以获得还包含事件日志(在本例中为事件及其值)的交易收据。Transfer