乐闻世界logo
搜索文章和话题

How to receive a value returned by a Solidity smart contract transacting function?

4 个月前提问
4 个月前修改
浏览次数19

1个答案

1

在Solidity智能合约中,交易函数(通常修改状态变量的函数)默认是无法直接返回值给外部调用者的,因为这些调用在Ethereum上是异步的。换句话说,当你调用一个会改变状态的函数时,你接收到的只是一个交易哈希,而不是函数执行的返回值。

然而,有几种方法可以间接获取到这些信息:

1. 事件(Events)

在Solidity中,你可以定义事件并在函数中触发这些事件,将返回值作为事件参数发布。外部的应用可以监听这些事件并获取需要的值。

示例代码:

solidity
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract ExampleContract { event ReturnValue(address indexed caller, uint256 indexed value); function set(uint _value) public { // 这里做一些状态变更的逻辑 emit ReturnValue(msg.sender, _value); } }

在这个例子中,每当set函数被调用时,它都会触发一个ReturnValue事件,该事件将调用者地址和传入的值记录下来。

2. 交易的回执(Transaction Receipt)

虽然交易本身不返回值,但你可以在交易被矿工处理并添加到区块链后,通过查看交易的回执来访问事件日志。这可以通过前端JavaScript库如web3.js或ethers.js来实现。

示例代码(使用web3.js):

javascript
const Web3 = require('web3'); const web3 = new Web3('http://localhost:8545'); const contract = new web3.eth.Contract(abi, contractAddress); contract.methods.set(123).send({from: account}) .on('receipt', function(receipt){ // 在这里处理receipt,从中可以获取事件日志 console.log(receipt.events.ReturnValue.returnValues); });

这段代码展示了如何在发送交易后,通过监听收据来获取事件的返回值。

3. 调用(Calls)与交易分离

有时候,可以将需要返回值的逻辑放在一个只读的call函数中,与实际修改状态的交易函数分开。先通过call方式调用只读函数预测结果,然后再执行实际的交易。

示例代码:

solidity
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract PredictionContract { uint public value; // 只读调用,预测结果 function predictNewValue(uint _increment) public view returns (uint) { return value + _increment; } // 实际的交易 function incrementValue(uint _increment) public { value += _increment; } }

通过这些方法,你可以有效地从Solidity智能合约中获取需要的返回值或状态信息。

2024年7月24日 09:53 回复

你的答案