solidity 从状态改变方法返回一个值
从状态改变方法返回一个值
由于状态改变(非常量)函数可能需要大量时间来挖掘,响应是一个交易,不能直接返回值。
使用事件,我们可以模拟非常量函数的返回值。
contract Example {
event Return(uint256);
uint256 _accum = 0;
function increment() returns (uint256 sum) {
_accum++;
Returns(_accum);
}
}
const assert = require('assert')
const {
Contract,
Wallet,
getDefaultProvider
} = require('ethers')
const provider = getDefaultProvider('ropsten')
const wallet = new Wallet(privateKey, provider)
const abi = [
"event Return(uint256)",
"function increment() returns (uint256 sum)"
]
const contractAddress = "0x..."
const contract = new Contract(contractAddress, abi)
async function increment() {
// Call the contract, getting back the transaction
let tx = await contract.increment()
// Wait for the transaction to have 2 confirmations.
// See the note below on "Economic Value" for considerations
// regarding the number of suggested confirmations
let receipt = await tx.wait(2)
// The receipt will have an "events" Array, which will have
// the emitted event from the Contract. The "Return(uint256)"
// call is the last event.
let sumEvent = receipt.events.pop()
// Not necessary; these are just for the purpose of this
// example
assert.equal(sumEvent.event, 'Return')
assert.equal(sumEvent.eventSignature, 'Return(uint256)')
// The sum is the first (and in this case only) parameter
// in the "Return(uint256 sum)" event
let sum = sumEvent.args[0]
return sum
}
increment.then((value) => {
console.log(value);
});
https://docs.ethers.org/v4/cookbook-contracts.html