坚固性:
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?
发布于 2021-04-24 16:55:42
(等待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都会返回函数调用(而不是tx)的结果。到设置器和calling a getter的
合同返回值{ uint256 value;function setValue(uint256 _value) public { value = _value;} function getValue()公共视图返回(uint256) {uint256 value;}}
首先创建一个执行setValue()函数的事务,然后调用getValue() (没有事务,所以它返回JS中的值)。
事件传递( address from,address to,uint256 amount);函数传递(address _to,uint256 _amount) public { emit Transfer(msg.sender,_to,_amount);}
您可以获取还包含事件日志(在本例中为Transfer事件及其值)的transaction receipt。
发布于 2022-01-25 02:14:24
这是来自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);https://stackoverflow.com/questions/67239017
复制相似问题