简易投票合约的编译和部署
2020-04-20 本文已影响0人
_微光角落_
简介:
solc:solc是以太坊的Solidity语言编译器,输入是Solidity语言编写的智能合约源代码,输出则是以太坊EVM虚拟机可以执行的二进制代码。
首先,新建一个文件夹,然后在文件夹内安装所需要的三个工具web3(0.20版本),solc,ganache-cli,命令如下:
npm install web3@0.20
npm install solc
npm install ganache-cli
安装过程可能会出现黄色的waring,可忽略继续。
安装完成后进入文件夹,将源码文件(Voting.sol)放置在文件夹内。
pragma solidity >0.4.22;
contract Voting{
//传入候选人名单
bytes32[] public candidateList;
//每个人的得票数
mapping(bytes32=>uint8) public voteReceived;
//构造函数初始化
constructor(bytes32[] memory candidateListName) public {
candidateList = candidateListName;
}
//函数修饰器,用于在执行某个函数之前处理一些行为
// bool isValid;
// modifier validateCandidate(bytes32 candidateName){
// for(uint8 i = 0;i<candidateList.length;i++){
// if(candidateName==candidateList[i])
// isValid = true;
// }
// isValid = false;
// _;
// }
//判断是否存在候选人
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));
voteReceived[candidateName]+=1;
}
//获取某个候选人总票数
function totalVotesFor(bytes32 candidateName) public view returns(uint8){
require(validateCandidate(candidateName));
return voteReceived[candidateName];
}
}
先开启一个terminal,cd入刚刚创建的文件夹,输入ganache-cli,会开启监听(127.0.0.1:8545),并且会自动创建十个账户,每个账户预置100ETH。
再开启一个terminal,cd进入文件夹,打开node,输入以下命令:
var Web3 = require('web3')
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
var solc = require('solc')
//同步读取文件内容,如果是Ubuntu,还可能有权限问题,使用命令sudo chmod 666 Voting.sol开启权限
var sourceCode = fs.readFileSync('Voting.sol').toString()
//编译文件
var compileCode = solc.compile(sourceCode)
//获取abi
var abi =JSON.parse(compileCode.contracts[':Voting'].interface)
//获取字节码
var byteCode = compileCode.contracts[':Voting'].bytecode
//创建抽象合约对象
var VotingContract = web3.eth.contract(abi)
//创建交易
var deployObj = {data:byteCode,from:web3.eth.accounts[0],gas:3000000}
//创建合约实例,并给构造函数传参初始化数组
v var contractInstance = VotingContract.new(['Alice','Bob','Cary'],deployObj)
之前ganache-cli开启的terminal会出现交易哈希,至此完成编译和部署。
给某位候选人投一票
contractInstance.vote("Alice",{from:web3.eth.accounts[0]})
查询候选人得票数
contractInstance. totalVotesFor("Alice").toString()