(三)基于区块链的投票系统的设计与实现

1、本地环境的搭建(Windows 10)

1.1 安装nodejs,npm,git,web3,solc

(1)nodejs:官网下载最新版本https://nodejs.org/en/download/current/

node.js后续还需安装python2.7与visual studio的c++开发工具包(建议手动)。

(2)npm:在Windows下安装nodejs会自带npm

(3)git:官网下载即可https://git-scm.com/downloads

(4)web3:命令行npm install [email protected]

(5)solc:命令行npm install solc

期间可能会经历各种安装error,但根据提示都可以解决。

2. 用Truffle完成一个智能合约的部署:

这里我们实现以太坊开发框架Truffle的配置和运行,并借助Truffle完成一个智能合约的部署。

Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle有以下:

-内置的智能合约编译,链接,部署和二进制文件的管理。

-快速开发下的自动合约测试。

-脚本化的,可扩展的部署与发布框架。

-部署到不管多少的公网或私网的网络环境管理功能

-使用EthPM&NPM提供的包管理,使用ERC190标准。

-与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。

-可配的构建流程,支持紧密集成。

-在Truffle环境里支持执行外部的脚本。

2.1 TRUFFLE的安装

2.2 Truffle客户端

有许多的以太坊客户端可以选择。我们推荐在开发时使用客户端EtherumJS TestRPC(后改名为Ganache)

当开发基于Truffle的应用时,我们推荐使用EthereumJS TestRPC。它是一个完整的在内存中的区块链仅仅存在于你开发的设备上。它在执行交易时是实时返回,而不等待默认的出块时间,这样你可以快速验证你新写的代码,当出现错误时,也能即时反馈给你。它同时还是一个支持自动化测试的功能强大的客户端。Truffle充分利用它的特性,能将测试运行时间提速近90%。

3、用Truffle框架运行一个投票的智能合约

3.1 创建工程目录并初始化框架

3.2  新建新合约

在contract目录下创建一个自己的合约文件Voting.sol。由于solidity的编译器更新很快,对应的语法可能会有改变,建议先在浏览器的Remix IDE中修改好,再到命令行运行

pragma solidity ^0.5.0;

contract Voting {

mapping (bytes32 => uint8) public votesReceived;

bytes32[] public candidateList;

constructor() public {

candidateList.push("zhang");

candidateList.push("bin");

candidateList.push("cheng");

}

function totalVotesFor(bytes32 candidate) view public returns (uint8) {

require(validCandidate(candidate));

return votesReceived[candidate];

}

function voteForCandidate(bytes32 candidate) public {

require(validCandidate(candidate));

votesReceived[candidate] += 1;

}

function validCandidate(bytes32 candidate) view public returns (bool) {

for(uint i = 0; i < candidateList.length; i++) {

if (candidateList[i] == candidate) {

return true;

}

}

return false;

}

}

3.4 新建发布脚本

在./migrations/目录下新建一个文件:2_deploy_contracts.js,增加发布代码。

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

module.exports = function(deployer) {

deployer.deploy(Voting); //配置合约的发布

};

3.5 编译

进入到工程目录下,进行编译:

3.6 启动客户端Ganache

如果之前没有启动Ganache客户端的话,则需要启动之前安装好的Ganache客户端,如果已启动的则忽略此步。Ganache图形化界面可以实时显示账户的余额变化以及交易情况。

3.7 修改文件truffle-config.js文件,增加网络配置:

如果用命令行启动Ganache-cli客户端,port选择8545

3.8部署合约(migrate)

Ganache图形化界面显示新出的块:

4、在控制台中与智能合约进行交互

Truffle提供了一种更加简单的方式,通过交互式控制台来与你的那些准备好的合约进行交互。

4.1 进入控制台,输入Voting智能合约命令

控制台显示打印出一个json结构,展示了Voting的各种属性内容。

4.2 运行Voting智能合约命令:

5、利用网页与智能合约进行交互

5.1 文件结构

在上一步的交互中我们是在控制台中进行投票和查询的,现在我们就要把这些命令写到js中,并写一个简单的html文件,通过网页来与智能合约进行交互。html和js文件见下。

js文件夹包含:

其中app.js实现了系统的整个逻辑运行过程,app.js的内容如下:

App = {

web3Provider: null,

contracts: {},

initWeb3: function () {

if (typeof web3 !== ‘undefined‘) {

App.web3Provider = web3.currentProvider;

} else {

App.web3Provider = new Web3.providers.HttpProvider(‘http://localhost:7545‘);

}

web3 = new Web3(App.web3Provider);

App.initContract();

},

initContract: function () {

$.getJSON(‘Voting.json‘, function (data) {

var Artifact = data;

App.contracts.Voting = TruffleContract(Artifact);

App.contracts.Voting.setProvider(App.web3Provider);

console.log(App.contracts.Voting);

App.setCounts();

});

App.bindEvents();

},

setCounts: function () {

var candidates = {"zhang": "one", "bin": "two", "cheng": "three"};

var candidateNames = Object.keys(candidates);

for (var i = 0; i < candidateNames.length; i++) {

App.update(candidateNames[i]);

}

},

bindEvents: function () {

$(document).on(‘click‘, ‘.btn-vote‘, App.handleVoting);

},

update: function (name) {

var Instance;

var candidates = {"zhang": "one", "bin": "two", "cheng": "three"};

App.contracts.Voting.deployed().then(function (instance) {

Instance = instance;

return  Instance.totalVotesFor.call(name);

}).then(function (val) {

console.log(val.toNumber());

$("#" + candidates[name]).html(val.toNumber());

}).catch(function (err) {

console.log(err.message);

});

},

handleVoting: function () {

var VotingInstance;

var candidateName = $("#candidate").val();

console.log(candidateName);

// 获取用户账号

web3.eth.getAccounts(function (error, accounts) {

if (error) {

console.log(error);

}

var account = accounts[0];

console.log(accounts);

App.contracts.Voting.deployed().then(function (instance) {

VotingInstance = instance;

return VotingInstance.voteForCandidate(candidateName, {from: account});

}).then(function (result) {

return App.update();

}).catch(function (err) {

console.log(err.message);

});

});

}

};

$(function () {

$(window).load(function () {

App.initWeb3();

});

});

5.2 启动lite-server

lite-server 是一个全功能的网站架设工具软件包轻量级的、仅适用于开发的 node 服务器,它仅支持web app。它能够为你打开浏览器,当你的html或是JavaScript文件变化时,它会识别到并自动帮你刷新浏览器, 还能使用套接字自动注入变化的CSS,当路由没有被找到时,它将自动后退页面。

启动lite-server:

5.3 前端index.html页面自动执行,网址为localhost:3000

结果展示:

6、总结

目前我已经在本地部署好了运行环境,也运行了基本的Demo。

原文地址:https://www.cnblogs.com/honghongzeng/p/12552032.html

时间: 2024-07-31 15:21:14

(三)基于区块链的投票系统的设计与实现的相关文章

(四)基于区块链的投票系统的设计与实现

基于区块链的投票系统的代码及前端页面实现 本次报告将介绍基于区块链的投票系统的实现过程,本系统的实现过程为:首先在总体设计及详细设计的基础上编写智能合约,在本地搭建的以太坊私有链节点上部署我们的智能合约,并设计与投票系统交互的前端界面,通过以太坊提供的通过以太坊提供 Web3.js 库的 JavaScript API 接口调用部署在区块链上智能合约的相应方法,实现整个投票系统的流程. 1.系统运行流程及需求分析 1.1 系统运行流程     1.2 需求分析 我们设计的投票系统主要分为两部分:投

(五)基于区块链的投票系统的设计与实现

1.需求分析 1.1 用户群体分析 需要进行投票表决的学校小团体.商业董事会群体.政府人员等. 1.2 系统用途概述 本系统是一个基于区块链技术的线上投票系统.针对目前线上投票系统中出现的恶意刷票.数据安全.隐私泄露等问题,本系统结合区块链技术的去中心化.数据不可篡改.可匿名性等特点,可以保证投票系统的投票数据公正.公开.可验证.不可篡改,提高投票系统的可信任性.用户可以通过本系统进行投票项目的创建.规定投票时间.注册投票等操作,系统同时提供投票数据可追溯可验证的功能,旨在给用户构建一个更加高效

(一)基于区块链的投票系统的设计与实现之环境的搭建

由于博主的毕设做的是区块链的方向,因此想写博客记录这个过程. 博主是在本地搭建的开发环境,操作系统为window10,使用以太坊开发平台,truffle框架,Solidity开发语言,Atom编辑器. 如果你还不知道区块链的一些基础知识,推荐看完这个公开课: https://www.bilibili.com/video/av37065233 (1)安装Atom 官网:https://atom.io/ 点击进入官网,选择对应的版本下载安装即可. (2)安装Git, NodeJS, Truffle,

基于区块链的支付系统开发,区块链支付方案

基于区块链的支付系统开发,区块链支付方案区块链支付系统开发,区块链支付平台让用户轻松注册:每个人都知道,开一个新的账户或者买一张新的信.用.卡就意味着你需要花费大量的文书工作来完成冗长乏味的过程.而如果你使用数字资产区块链支付平台,你几乎肯定会立即这样做.此外,它就像应下载用程序到您手机一样简单. 区块链技术的去中心化特征正在"抢目前电商平台第三方支付平台的饭碗",以区块链为基础的新型互联网金融体系,买方和卖方可以直接交易,交易基于密码学原理而不基于信任,使得任何达成一致的双方,能够直

区块链产品溯源系统到数字资产交易系统开发技术

如何用区块链实现商品打假? 电影<我不是药神>最近比较火.片中除了动容的情节故事外,还有一些细节也给我们留下了深刻的印象,比如假院士卖假药的桥段. 为什么目前假货如此泛滥? 源中瑞jojo开发产品溯源带来了新的思路 具体来说,区块链技术开发电↑.可以从以下三个方面赋能零售商品的防伪溯源,并克服传统方式无法解决的痛点. 第一,基于不可篡改的商品信息,解决信任问题. 第二,全程实时溯源各种商品信息. 第三,有效遏制造假行为. 除了上述三点,区块链与零售业的结合,还可以显著提高效率.降低成本.具体而

基于区块链资产交易系统

基于区块链资产交易系统 今天先到这儿,希望对您 区块链,  技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管理,团队建设 有参考作用 , 您可能感兴趣的文章: 领导人怎样带领好团队构建创业公司突击小团队国际化环境下系统架构演化微服务架构设计视频直播平台的系统架构演化微服务与Docker介绍Docker与CI持续集成/CD互联网电商购物车架构演变案例互联网业务场景下消息队列架构互联网高效研发团队管理演进之一消息系统架构设计演进互联网电商搜索架构演化之一企业信息化与软件工程

区块链社交IM系统开发,多币种钱包系统开发,直播系统开发

区块链社交IM系统开发是现在能够应用于各个行业增加用户粘度的一款系统app.开发区块链社交IM系统不仅仅是用于用户与用户之间的社交沟通,这类型的app系统还可以做一个多币种钱包系统来使用,还可以是一个直播系统.区块链社交IM系统在目前的市场中,给用户带来的是更多的便捷.用户在使用社交的功能的同时,还可以拥有多币种钱包系统的功能,能够储存大量的币,还可以作为一个直播系统来使用.而且随着自媒体时代的不断地发展,人们对于接受新闻的方式越来越新颖,就像现在的广告,很多时候都是以邀请网红直播的方式去推广,

基于区块链的播客,2019风口!

虽然youtube和soundcloud这样的平台已经成为独立音乐人的强有力的工具,这些平台同时也打开了内容管理方面的潘多拉魔盒.音频流媒体产业每年都在增长,在2018年底付费流媒体用户已经达到2.55亿人,该年度音乐流媒体销售产生的收入也接近了89亿美元.但问题在于:这些销售都是由大牌企业例如Spotify或者Apple Music主宰的,对于独立音乐人而言,要争取平台流媒体销售中的收入分成,其话语权并不够强大. 1.救星来了:区块链 区块链会出现在任何需要去中心化的解决方案中,对于音乐流媒体

区块链币支付系统开发技术解决方案

区块链支付应用.分布式网络技术可以在去中心化的机制下使用户以更低的费用和更快的速度完成跨境转账. "区块链"是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了过去十分钟内所有网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块."区块链"技术拥有去中心化.方便快捷.高安全性.记账速度快.成本较低.验证等优点. 背景:需要开发区块链支付系统,找源中瑞科技加ruiecjo了解开发技术. 区块链支付系统相比传统支付: 使用区块链数字资产作为承载,实现了