web3.js 1.0部署合约

匿名 (未验证) 提交于 2019-12-03 00:22:01

Solidity 的编译

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'].interfaceGreetingsolcOutput.contracts['main:Greeting'].bytecode

获取ETH账户地址

web3.eth.accountsweb3.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()

  1. 创建合约
  2. 发布合约

web3.eth.Contract

const myContact = new web3.eth.Contract(contractAbi, {data: contractBytecode}) 

contractBytecodesolcOutput.contracts['main:Greeting'].bytecode.

myContact.deploy().send()
deploy()deploy()
send()from选项),以及燃料多少(gas选项)。
send()PromiseEventEmiter,因而可以监听发布过程中的一些事件:

  • 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等见原文;


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!