美文网首页
简易投票合约的编译和部署

简易投票合约的编译和部署

作者: _微光角落_ | 来源:发表于2020-04-20 11:47 被阅读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()

相关文章

网友评论

      本文标题:简易投票合约的编译和部署

      本文链接:https://www.haomeiwen.com/subject/zxerihtx.html