Solidity 的编译现在不能直接用 web3 这个包来编译了:
var compiled = web3.eth.compile.solidity(contractSource)
以前可以这样用web3来编译,可是现在会报错:Returned error: Error: Method eth_compileSolidity not supported.
替代方案:使用 solc 来编译 Solidity:
const solc = require('solc') const solcOutput = solc.compile({sources: {main: contractSource}}, 1)
solcOutput.contracts['main:Greeting'].interface
Greeting
solcOutput.contracts['main:Greeting'].bytecode
。
获取ETH账户地址
web3.eth.accounts
web3.eth.getAccounts()
这个函数。而且需要注意的是这个函数是一个异步函数,返回的不是地址,而是一个Promise<地址列表>
. 建议使用 async/await 来处理:
const accountsList = await web3.eth.getAccounts() /* accountsList 是一个字符串数组(地址列表) [ '0x055Ce03B2DE2e40e9dA322b6098378f5F6280A33', '0x30B540058a8AF78c6b73CF2b72eA81B665280D0d', '0x0B5baD78Ce6d3D1935fabd9C1AA2aA4F65317DCC', '0x6B706d2058591C2Af396dbC539c30625f0BAD68F', '0x52f581eCDd4522B7bA49b15C4E20B0a90aa31553', '0x805F94503Fa8a3510a06636Fb62f6d9a6b6f7294', '0xdD3598E8b4Bc232e9D966685bfFb2aa0F5A70E25', '0x7246738dd4EbCd92fa4527A5521359b9560519E8', '0x1B85A66ED4C0472A395594Dc865C1406d1859cF0', '0xA6293d77DF43f6C4C106D047b8373194c1b55Ef9' ] */
发布合约
web3.eth.compile.solidity()
new()
- 创建合约
- 发布合约
web3.eth.Contract
const myContact = new web3.eth.Contract(contractAbi, {data: contractBytecode})
contractBytecode
solcOutput.contracts['main:Greeting'].bytecode
.
myContact.deploy().send()
。deploy()
deploy()
send()
from
选项),以及燃料多少(gas
选项)。send()
Promise
EventEmiter
,因而可以监听发布过程中的一些事件:
transactionHash
receipt
confirmation
error
最后,本Demo中的 Greeting 合约而言就是这样来发布的:
myContact.deploy({arguments: ["Hello world!"]}) // arguments will be passed to the contract's constructor .send({from: deployAddr, gas: gasEstimate * 10}) // send() returns a Promise & EventEmit .on('transactionHash', function(transactionHash){ util.log("deploy transaction hash: ", transactionHash) }) .on('receipt', function(receipt){ util.log("deploy receipt: ", receipt) }) .on('confirmation', function(confirmationNum, receipt){ util.log("got confirmations number: ", confirmationNum) }) .then(async function(myContactInstance){ util.log("deployed successfully.") util.log("now the addr %o balance is %o", deployAddr, await web3.eth.getBalance(deployAddr)) testContact(myContactInstance) }) .catch(err => { util.log("Error: failed to deploy, detail:", err) })
gasEstimate为什么要乘以10?
web3.eth.estimateGas()
调用合约
以前的合约的方法就直接在合约实例上,所以直接调用就行了,如myContactInstance.greet.call({from:xxxAddr})
;但是现在合约的方法在.methods
里面,即要这样调用:myContactInstance.methods.greet().call({from: testAddr})
.
调用合约的时候有两种方式,以前是分.call()
和.sendTransaction()
,现在是.call()
和.send()
. 其中前者(.call()
constant
.send()
)适用于其他方法(有交易或会修改storage的方法)。
.call()
的返回值(Promise解决后)就是合约方法的返回值,然而.send()
constant
转载自:初探ETH智能合约 ― Solidity开发部署踩坑记
https://www.clarencep.com/2018/03/28/eth-smart-contract-solidity-develop-and-deploy-demo/
完整的demo等见原文;