合约 Contracts 的使用¶
Some quick examples for techniques with Contracts.
获取状态变化后的值¶
Since a state-changing (non-constant) function can take a non-trivial amount of time to mine, the response is a transaction, and cannot return values directly.
Using events, we can simulate a return value from a non-constant function.
contract Example {
event Return(uint256);
uint256 _accum = 0;
function increment() returns (uint256 sum) {
_accum++;
emit 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);
});
经济激励与经济价值¶
A very important aspect of Smart Contracts is consideration of the Economic Value being protected; even a completely logically correct Smart Contract can fall victim to misaligned economic incentives.
Imagine a city with an average parking ticket cost of $60, but the parking enforcement is not effective, allowing a person to park anytime and anywhere with only an average of 3 tickets per year. If the average cost to pay for parking is $10, and you park 100 times per year, the $180 in fines compared to the $1,000 in paying for parking is actually incentivizing illegal parking and disincentivizing paying legitimate parking.
This is a fairly involved topic, which we will write an article for and then link to from here, along with a related topic, “Miner Front-Running”.