当前位置:   article > 正文

使用web3.js进行编译发布及调用智能合约_当我们编完智能合约后生成二进制代码我们需要测用智能合约我们使用的是web3.j

当我们编完智能合约后生成二进制代码我们需要测用智能合约我们使用的是web3.j

简要:

web3.js 是一个库的集合,允许您使用HTTP或IPC连接与本地或远程以太节点进行交互。

solc.js 是solidity的编译器。官方推荐编译方式。

Ganache CLI是以太坊开发工具Truffle套件的一部分,是Ganache的命令行版本

Ganache CLI使用ethereumjs来模拟完整的客户端行为,并使开发以太坊应用程序更快,更轻松,更安全。它还包括所有流行的RPC功能和特性(如事件),并可以确定性地运行以使开发变得简单。

注:testrpc已被废弃,现已更名为Ganache CLI

本文环境:

node

macOs 10.13.4

web3.js 1.0.0-beta.34

solc 0.4.22

环境安装:

web3.js

npm install web3

ganache-cli

npm i ganache-cli

solc

npm install solc

solidity代码:

demo.sol

  1. pragma solidity ^0.4.0;
  2. contract Calc{
  3. uint count;
  4. function add(uint a, uint b) returns(uint){
  5. count++;
  6. return a + b;
  7. }
  8. function getCount() returns (uint){
  9. return count;
  10. }
  11. }

接下来通过web3.js进行编译、发布:

 (一)启动Ganache

ganache-cli

这时会列出预先创建的10个账户和10个私钥

创建本地私有链地址:localhost:8545

(二)引入所需的模块:

web3.js

  1. let Web3 = require('web3');
  2. let solc = require("solc");
  3. let fs = require('fs');

(三)实例web3对象,并使用solc编译solidity,获取发布所需对象

  1. if(typeof web3 != 'undefined'){
  2. web3=new Web3(web3.currentProvider);
  3. }else{
  4. web3 = new Web3('http://localhost:8545');
  5. }
  6. let source=fs.readFileSync("./demo.sol","utf8");
  7. let cacl=solc.compile(source,1);
  8. let abi= JSON.parse(cacl.contracts[':Calc'].interface);
  9. let bytecode=cacl.contracts[':Calc'].bytecode;
注意:solc在编译完时,会在solidity的类方法前加一个冒号。

(三)发布时,需要一个账户。如果账户未激活,需unlockAccount()进行激活。

  1. web3.eth.getAccounts().then(data=>{
  2. web3.eth.personal.unlockAccount(data[0])
  3. })
注意:web3.eth.getAccounts()为异步方法,直接读取会读取不到数据。

(四)进行部署,部署成功将返回合约地址。

  1. var rsContract=new web3.eth.Contract(abi).deploy({
  2. data:'0x'+bytecode, //已0x开头
  3. arguments:[], //传递构造函数的参数
  4. }).send({
  5. from:data[0],
  6. gas:1500000,
  7. gasPrice:'30000000000000'
  8. },function(error,transactionHash){
  9. console.log("send回调");
  10. console.log("error:"+error);
  11. console.log("send transactionHash:"+transactionHash);
  12. })
  13. .on('error', function(error){ console.error(error) })
  14. .then(function(newContractInstance){
  15. var newContractAddress=newContractInstance.options.address
  16. console.log("新合约地址:"+newContractAddress);
  17. });

注意:

    1、deploy中的data需以0x开头。

    2、from为账户地址,非合约地址

    3、发布时需传入gas和gasPrice,gas过小或过大,都会报错

    gas默认值为90000

    gasPrice默认值为20000000000 

(五)调用测试

  1. var MyContract = new web3.eth.Contract(abi,newContractAddress);
  2. MyContract.methods.add(1,3).call().then(console.log);

传入abi及合约地址,便可通过web3.js的call方法进行调用合约方法。

总结:

文本注意之处,都是踩坑之处,希望可以帮助到大家。以下为完整实例代码:

  1. let Web3 = require('web3');
  2. let solc = require("solc");
  3. let fs = require('fs');
  4. if(typeof web3 != 'undefined'){
  5. web3=new Web3(web3.currentProvider);
  6. }else{
  7. web3 = new Web3('http://localhost:8545');
  8. }
  9. let source=fs.readFileSync("./demo.sol","utf8");
  10. let cacl=solc.compile(source,1);
  11. let abi= JSON.parse(cacl.contracts[':Calc'].interface);
  12. let bytecode=cacl.contracts[':Calc'].bytecode; //合约二进制码
  1. web3.eth.getAccounts().then(data=>{
  2. web3.eth.personal.unlockAccount(data[0]).then(openAccountState=>{
  3. if(openAccountState){
  4. console.log("开户状态:"+openAccountState);
  5. var rsContract=new web3.eth.Contract(abi).deploy({
  6. data:'0x'+bytecode,
  7. arguments:[], //传递构造函数的参数
  8. }).send({
  9. from:data[0],
  10. gas:1500000,
  11. gasPrice:'30000000000000'
  12. },function(error,transactionHash){
  13. console.log("send回调");
  14. console.log("error:"+error);
  15. console.log("send transactionHash:"+transactionHash);
  16. })
  17. .on('error', function(error){ console.error(error) })
  18. // .on('transactionHash', function(transactionHash){ console.log("hash:",transactionHash)})
  19. // .on('receipt', function(receipt){
  20. // console.log(receipt.contractAddress) // contains the new contract address
  21. // })
  22. //.on('confirmation', function(confirmationNumber, receipt){console.log("receipt,",receipt)})
  23. .then(function(newContractInstance){
  24. var newContractAddress=newContractInstance.options.address
  25. console.log("新合约地址:"+newContractAddress);
  26. web3.eth.getBlockNumber().then(blockNum=>{
  27. console.log("当前块号:"+blockNum);
  28. web3.eth.getBlock(blockNum).then(data=>{
  29. console.log("当前块信息:");
  30. console.log(data);
  31. })
  32. });
  33. var MyContract = new web3.eth.Contract(abi,newContractAddress);
  34. MyContract.methods.add(1,3).call().then(console.log);
  35. });
  36. }
  37. });
  38. });

引用:

http://web3js.readthedocs.io/en/1.0/web3.html#version

https://www.npmjs.com/package/ganache-cli

https://www.npmjs.com/package/solc

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号