dapp开发过程之一
作者:互联网
1,环境安装
linux下安装nodejs和npm,再用npm安装ganache-cli,web3和solc
mkdir simple_voting_dapp
cd simple_voting_dapp
npm init
npm install ganache-cli web3@0.20.1 solc
这里安装的ganache-cil不是全局的,所以在使用的时候会加目录
1.2 使用ganache启动一个私有链
在控制台 输入 ./node_moduls/.bin/ganache-cli
2,合约编写
pragma solidity >0.4.22 ;
contract Voting {
mapping (bytes32 => uint8) public votesReceived;
bytes32[] public candidateList;
bool isValid;
constructor(bytes32[] memory candidateListName) public {
candidateList = candidateListName;
}
function validateCandidate(bytes32 candidateName) internal view returns(bool){
for(uint8 i = 0 ; i < candidateList.length; i++){
if(candidateName == candidateList[i])
return true;
}
return false;
}
function vote(bytes32 candidateName) public{
require(validateCandidate(candidateName));
votesReceived[candidateName] += 1 ;
}
function totalVotersFor(bytes32 candidateName) public view returns(uint8){
require(validateCandidate(candidateName));
return votesReceived[candidateName];
}
}
3,编译合约
1,启动一个新的控制台
2,把写好的合约Voting.sol放在simple_voting_dapp文件下
3,在控制台输入node命令
4,
// 1, 创建一个web3对象
var Web3 = require('web3')
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
// 2, 创建一个solc对象,负责编译合约
var solc = require('solc')
// 3, 读取合约内容
var sourceCode = fs.readFileSync('Voting.sol').toString()
在这一步可能会出现文件无权限读取的问题。
可以新开一个控制台进入simple_voting_dapp文件下
输入 sudo chmod 666 Voting.sol,即可完成修改
若要看一个文件的权限,可以输入ls -l
// 4, 编译合约
var compiledCode = solc.compile(sourceCode)
// 5, 获取编译后得到的abi和bytecode
var abi = compiledCode.contracts[':Voting'].interface
//然而这个不是我们真正需要的abi
//真正的abi是一个对象
var abi = JSON.parse(compiledCode.contracts[':Voting'].interface)
var byteCode = compiledCode.contracts[':Voting'].bytecode
// 6, 通过abi创建一个合约对象
var VotingContract = web3.eth.contract(abi);
// 7, 创建一个交易实例
var deployTxObj = {data:byteCode,from: web3.eth.accounts[0], gas:3000000}
// 8, 创建一个合约实例
var contractInstance = VotingContract.new(['Alic','Bob','Cary'],deployTxObj)
5, 可以在ganache控制台看到已部署的合约的交易信息,并且可以在控制台输入
contractInstance.address
0xfa9fef4b968f51a6c14910eb502b411c689ad575
可以看到实例合约的地址
3,调用合约中的方法
1,调用vote方法
contractInstance.vote("Alic",{from:web3.eth.accounts[0]});
使用ganache很方便的可以在控制台看到交易的细腻些,并且,这笔交易直接进块了
2,调用totalVoteFor
contractInstance.totalVoteFor("Alice").toString()
'1'
标签:之一,web3,abi,ganache,dapp,开发,candidateName,var,Voting 来源: https://blog.csdn.net/qq_40403273/article/details/120624131