DApp项目-基于truffle的简单投票合约-1

简介

基于以太坊开发投票系统DApp,在基础投票功能的基础上,增加了基于自定义token进行投票的功能;另外还涉及到了以太坊开发框架truffle的使用。

通过一个完整的DApp的开发,将以太坊理论和实践紧密结合起来,可以使学习者对以太坊上的DApp开发有更加全面充分的认识,进而对整个区块链技术有更深刻的理解。

基础准备

需先掌握以下基础知识:

  1. truffle框架环境的搭建
  2. geth启动以太坊私链以及操作
  3. web3js
  4. solidity智能合约编程语言的掌握
  5. 简单DApp开发流程

可以在博客中搜索到以上详细的知识

我的环境是windows7(Linux玩的不熟),具体学习资源来自硅谷投票系统区块链以太坊尚硅谷

开发步骤

打造自己的truffle-box

  • 新建项目空文件夹,在文件夹下unbox webpack

  • 清空webpack中不需要的东西

    删除掉两个自带的示例合约:

    把准备好的投票合约Voting加进去

    Voting.js:

    pragma solidity >=0.4.0;

    contract Voting{
    bytes32[] public candidateList; //候选人数组
    mapping(bytes32 => uint) public votesReceived;
    constructor(bytes32[] candidateListName) public{
    candidateList = candidateListName;
    }

    //检测是否为有效的投票地址
    function validateCandidate(bytes32 candidateName) internal view returns(bool){
    for(uint 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 totalVotesFor(bytes32 candidateName) public view returns(uint){
    require(validateCandidate(candidateName));
    return votesReceived[candidateName];
    }

    }

    然后修改migration文件夹下的2_deploy_contracts.js文件:

    var Voting = artifacts.require("./Voting.sol");

    module.exports = function(deployer) {
    // 注意这里部署构造函数需要给初始值
    deployer.deploy(Voting, ['Alice', 'Bob', 'Cary'], {gas: 1000000});
    };
  • 有build文件夹的话删除这个文件夹(build是输出文件夹)

上面的修改完,现在就是自己的工作空间了。

编译合约

truffle compile

注意windows下cmd直接使用此命令不可行,需采用git bash执行。

warning指的是migration合约构造函数使用了老版本的同名方式,这个不用管。

完成后会生成build文件夹:

其中的json就是合约对应的abi。

部署合约

truffle migrate

报错:

因为连接的是自己geth启动的私链,部署合约没有先解锁账户,所以先解锁账户。

可以使用truffle console启动客户端来解锁账户:

再次部署报错:

修改构造函数中的gas,以及设置最小Gas限制(改大点):

truffle.js:

// Allows us to use ES6 in our migrations and tests.
require('babel-register')

module.exports = {
networks: {
development: {
host: 'localhost',
port: 8545,
network_id: '*' ,// Match any network id
gas: 470000
}
}
}

2_deploy_contracts.js:

var Voting = artifacts.require("./Voting.sol");

module.exports = function(deployer) {
// 注意这里部署构造函数需要给初始值
deployer.deploy(Voting, ['Alice', 'Bob', 'Cary'], {gas: 100000});
};

再次部署:

这样卡住了,因为是个人私链,所以要去挖矿!

挖儿挖~

出块了就停止吧。

第一个成功了,第二个又失败了。。。因为给的gas太小了,所以部署合约的汽油费一定要恰当!

修改2_deploy_contracts.js中的汽油费为:400000 或者直接删掉右面的{gas:xxx}使用默认的truffle.js中设置的汽油费

成功了:

注意,第一个合约部署过后就不会再部署了。

truffle 部署的好处在于:它会检测是否修改了合约,如果合约内容没有变化,那么部署成功后以后都不会去重复部署了。

控制台使用合约

truffle包装了web3麻烦的根据abi和字节码部署一系列复杂的操作,在其控制台,对于已经部署的合约可以使用其特殊语法创建实例。(部署完合约之后,truffle就会帮我们记住合约的abi和地址,我们可以直接创建实例)

使用合约语法:

创建合约实例给Alice投票。

Voting.deployed().then(function(votingInstance){votingInstance.vote('Alice').then(function(v){console.log(v)})});

异步运行,一开始运行提示undefind,需要手动挖矿后显示收据:

查询Alice的票数

Voting.deployed().then(function(votingInstance){votingInstance.totalVotesFor('Alice').then(function(v){console.log(v.toString())})})

再次投票、查询观察票数变化

测试合约功能无误。

网页使用合约

truffle会把app文件夹中的前端文件压缩/处理到build中输出:

所以,我们修改box中已有的前端页面为自己的即可

修改app/index.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>投票DApp</title>
<link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' type='text/css'>
</head>
<body class="container">
<h1>简单区块链投票系统</h1>
address : <div id="address"></div>
<div class="table-responsive">
<table class="table table-bordered">
<!-- 表头 -->
<thead>
<tr>
<th>候选人</th>
<th>得票数</th>
</tr>
</thead>
<!-- 内容 -->
<tbody>
<tr>
<td>Alice</td>
<td id="candidate-1"></td>
</tr>
<tr>
<td>Bob</td>
<td id="candidate-2"></td>
</tr>
<tr>
<td>Cary</td>
<td id="candidate-3"></td>
</tr>
</tbody>
</table>

msg <div id="msg"></div>

</div>
<input type="text" id="candidate" />
<a href="#" onclick="voteForCandidate()" class="btn btn-primary">投票</a>
</body>
<script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>
<script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
<script src="app.js"></script>
</html>

修改app/javascripts/app.js



部署到build命令:

npm run dev

其实就是运行webpack-dev-server,webpack封装的一个服务器(nodejs)

如果这里报错的话,例如:

那么很有可能启动需要的依赖包没有安装,安装的方式是在项目文件夹下:

npm install

那么就会把package.json文件中要依赖的所有的包都安装上了:

再次启动npm run dev

监听端口8080,可以在浏览器中打开了。

但是没有读取到数据,原因是在于我的浏览器开了MetaMask,自带了provider,但是这个Voting合约在MetaMask中的Ropsten环境中是没有的,所以报错。

换到本地8545:

ok查询结果出来了:

本文作者: DDDemons hide 发布时间: 2020-09-03 最后更新: 2020-09-03 本文标题: DApp项目-基于truffle的简单投票合约-1 本文链接: https://xwjahahahaha.github.io/2020/09/03/技术贴/区块链/项目/DApp项目-基于truffle的简单投票合约-1/ 版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
知识共享许可协议

-------------本文结束 感谢您的阅读-------------
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxx_undefined

谢谢请博主吃糖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值