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'
上一篇:简单电子日历.html


下一篇:FTP服务