赞
踩
简要:
web3.js 是一个库的集合,允许您使用HTTP或IPC连接与本地或远程以太节点进行交互。
solc.js 是solidity的编译器。官方推荐编译方式。
Ganache CLI是以太坊开发工具Truffle套件的一部分,是Ganache的命令行版本。
Ganache CLI使用ethereumjs来模拟完整的客户端行为,并使开发以太坊应用程序更快,更轻松,更安全。它还包括所有流行的RPC功能和特性(如事件),并可以确定性地运行以使开发变得简单。
本文环境:
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
- pragma solidity ^0.4.0;
-
- contract Calc{
- uint count;
- function add(uint a, uint b) returns(uint){
- count++;
- return a + b;
- }
- function getCount() returns (uint){
- return count;
- }
- }
接下来通过web3.js进行编译、发布:
(一)启动Ganache
ganache-cli
这时会列出预先创建的10个账户和10个私钥
创建本地私有链地址:localhost:8545
(二)引入所需的模块:
web3.js
- let Web3 = require('web3');
- let solc = require("solc");
- let fs = require('fs');
(三)实例web3对象,并使用solc编译solidity,获取发布所需对象
- if(typeof web3 != 'undefined'){
- web3=new Web3(web3.currentProvider);
- }else{
- web3 = new Web3('http://localhost:8545');
- }
- let source=fs.readFileSync("./demo.sol","utf8");
- let cacl=solc.compile(source,1);
- let abi= JSON.parse(cacl.contracts[':Calc'].interface);
- let bytecode=cacl.contracts[':Calc'].bytecode;
(三)发布时,需要一个账户。如果账户未激活,需unlockAccount()进行激活。
- web3.eth.getAccounts().then(data=>{
- web3.eth.personal.unlockAccount(data[0])
- })
(四)进行部署,部署成功将返回合约地址。
var rsContract=new web3.eth.Contract(abi).deploy({ data:'0x'+bytecode, //已0x开头 arguments:[], //传递构造函数的参数 }).send({ from:data[0], gas:1500000, gasPrice:'30000000000000' },function(error,transactionHash){ console.log("send回调"); console.log("error:"+error); console.log("send transactionHash:"+transactionHash); }) .on('error', function(error){ console.error(error) }) .then(function(newContractInstance){ var newContractAddress=newContractInstance.options.address console.log("新合约地址:"+newContractAddress); });
注意:
1、deploy中的data需以0x开头。
2、from为账户地址,非合约地址
3、发布时需传入gas和gasPrice,gas过小或过大,都会报错
gas默认值为90000
gasPrice默认值为20000000000
(五)调用测试
- var MyContract = new web3.eth.Contract(abi,newContractAddress);
- MyContract.methods.add(1,3).call().then(console.log);
传入abi及合约地址,便可通过web3.js的call方法进行调用合约方法。
总结:
文本注意之处,都是踩坑之处,希望可以帮助到大家。以下为完整实例代码:
- let Web3 = require('web3');
- let solc = require("solc");
- let fs = require('fs');
- if(typeof web3 != 'undefined'){
- web3=new Web3(web3.currentProvider);
- }else{
- web3 = new Web3('http://localhost:8545');
- }
- let source=fs.readFileSync("./demo.sol","utf8");
- let cacl=solc.compile(source,1);
- let abi= JSON.parse(cacl.contracts[':Calc'].interface);
- let bytecode=cacl.contracts[':Calc'].bytecode; //合约二进制码
web3.eth.getAccounts().then(data=>{ web3.eth.personal.unlockAccount(data[0]).then(openAccountState=>{ if(openAccountState){ console.log("开户状态:"+openAccountState); var rsContract=new web3.eth.Contract(abi).deploy({ data:'0x'+bytecode, arguments:[], //传递构造函数的参数 }).send({ from:data[0], gas:1500000, gasPrice:'30000000000000' },function(error,transactionHash){ console.log("send回调"); console.log("error:"+error); console.log("send transactionHash:"+transactionHash); }) .on('error', function(error){ console.error(error) }) // .on('transactionHash', function(transactionHash){ console.log("hash:",transactionHash)}) // .on('receipt', function(receipt){ // console.log(receipt.contractAddress) // contains the new contract address // }) //.on('confirmation', function(confirmationNumber, receipt){console.log("receipt,",receipt)}) .then(function(newContractInstance){ var newContractAddress=newContractInstance.options.address console.log("新合约地址:"+newContractAddress); web3.eth.getBlockNumber().then(blockNum=>{ console.log("当前块号:"+blockNum); web3.eth.getBlock(blockNum).then(data=>{ console.log("当前块信息:"); console.log(data); }) }); var MyContract = new web3.eth.Contract(abi,newContractAddress); MyContract.methods.add(1,3).call().then(console.log); }); } }); });
引用:
http://web3js.readthedocs.io/en/1.0/web3.html#version
https://www.npmjs.com/package/ganache-cli
https://www.npmjs.com/package/solc
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。