以太坊区块链之使用truffle框架完成简单投票Dapp开发

这篇具有很好参考价值的文章主要介绍了以太坊区块链之使用truffle框架完成简单投票Dapp开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

安装truffle

安装:sudo npm install -g truffle
检查是否成功: truffle -v

创建工程

truffle unbox webpack

投票智能合约编写

  • 编写环境 remix
    话不多说,直接上代码
pragma solidity ^0.4.22;

contract Voting{
  bytes32[] public candidateList;

  mapping(bytes32 => uint8)public votesReceived;
  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 voteFor(bytes32 candidateName) public{
  require(validateCandidate(candidateName));
    votesReceived[candidateName]+=1}
  function totalVotesFor(bytes32 candidateName) public view returns(uint8){
    require(validateCandidate(candidateName));
    return votesReceived[candidateName];
  }
}

编译合约

1、启动ganache
以太坊区块链之使用truffle框架完成简单投票Dapp开发
2、在/contracts目录下加入新建一个.sol文件,将之前编写的智能合约代码加入该文件中,博主新建的是一个Voting.sol的文件
!!!该文件目录一定要与智能合约代码名字相对应
3、修改truffle-config.js
将development内的host、port改为ganache的地址
以太坊区块链之使用truffle框架完成简单投票Dapp开发
4、修改migrations/2_deploy_constracts.js文件
修改如下:artifacts.require("Voting"),Voting为上一步加入/contracts目录sol文件的文件名
以太坊区块链之使用truffle框架完成简单投票Dapp开发

5、进入创建的项目目录,编译合约

//编译合约指令
truffle compile

以太坊区块链之使用truffle框架完成简单投票Dapp开发

部署合约

truffle migrate

以太坊区块链之使用truffle框架完成简单投票Dapp开发

前端

app/src文件的index.html代码

<!DOCTYPE html>
<html>
  <head>
    <title>My Voting Dapp</title>
  </head>
  <body>
      <h1> Voting Dapp </h1>
      <p>Alice:<strong id="alice">
        
      </strong>tickets</p>
      <p>Bob:<strong id="bob">
        
     </strong>tickets</p>
     <label>VoteFor:</label>
     <input type="text" id="candidate"/>
     <button onclick="App.voteFor()">vote</button>
     <script src="index.js"></script>
  </body>
</html>

修改app/src文件的index.js代码
代码如下
具体代码解释见代码内的注释

import Web3 from "web3";
//将Voting.json引入js
import votingArtifact from 
"../../build/contracts/Voting.json";
const aBytes32="0x41000000000000000000000000000000000000000000000000000000000000";
const bBytes32="0x42000000000000000000000000000000000000000000000000000000000000";

const App = {
  web3: null,
  account: null,
  voting: null,
  start: async function() {
    const { web3 } = this;
    try {
      // get contract instance
      //这里的votingArtifact对应的为文件第二行引入的votingArtifact
      const networkId = await web3.eth.net.getId();
      const deployedNetwork = votingArtifact.networks[networkId];
      this.voting = new web3.eth.Contract(
        votingArtifact.abi,
        deployedNetwork.address,
      );
      // get accounts
      const accounts = await web3.eth.getAccounts();
      this.account = accounts[0];
      this.ready();
     // this.refreshBalance();
    } catch (error) {
     console.error(error);
      console.error("Could not connect to contract or chain.");
    }
  },
 	refresh:async function(id,name){
 	 //调用合约的totalVotesFor方法
 		const{totalVotesFor}=this.voting.methods;
 		const tickets= await totalVotesFor(name).call();
 		const element=document.getElementById(id);
 		element.innerHTML=tickets.toString();
 },
 ready:async function(){
 try{
  		this.refresh("alice",aBytes32);
  		this.refresh("bob",bBytes32);
  	}
  	catch(err){
  		console.log(err);
  	}
 },
  voteFor:async function(){
  console.log("vote");
  	try{
  		const{voteFor}=this.voting.methods;
  		const candidateName=document.getElementById("candidate").value;
  		console.log(candidateName);
  		//调用合约voteFor方法
  		if(candidateName =="Alice"){
  			await voteFor(aBytes32).send({from: this.account});
  			this.refresh("alice",aBytes32);
  		}else if(candidateName =="Bob"){
  			await voteFor(bBytes32).send({from: this.account});
  			//调用refresh方法
  			this.refresh("bob",bBytes32);
  			console.log("votebob");
  		}
  	}
  	catch(err){
  		console.log(err);
  	}
  }
};
window.App = App;

window.addEventListener("load", function() {
  if (window.ethereum) {
    // use MetaMask's provider
    App.web3 = new Web3(window.ethereum);
    window.ethereum.enable(); // get permission to access accounts
  } else {
    console.warn(
      "No web3 detected. Falling back to http://127.0.0.1:8545. You should remove this fallback when you deploy live",
    );
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    App.web3 = new Web3(
      new Web3.providers.HttpProvider("http://127.0.0.1:8545"),
    );
  }
  App.start();
});

运行

使用cd app进入到app目录,运行指令

npm run dev

以太坊区块链之使用truffle框架完成简单投票Dapp开发

END

在浏览器输入http://127.0.0.1:8080/即可看到最后Dapp页面
以太坊区块链之使用truffle框架完成简单投票Dapp开发
输入Bob或者Alice,对应的票数将会增1

好啦,这次分析就到这里啦,希望对友友们有用,笔芯芯文章来源地址https://www.toymoban.com/news/detail-485305.html

到了这里,关于以太坊区块链之使用truffle框架完成简单投票Dapp开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Truffle开发太坊智能及其区块链

      安装 Truffle 构建一个Truffle项目 浏览一下这个项目 测试项目 编译智能合约 使用 Ganache 部署项目 与智能合约交互 搭建自连网络 truflle初始化项目 Stairs upon the temple I climb and I crawl  Wonder how much further I\\\'ll go Feet that fall apart till I walk on my ankles Can I finish I just don\\\'t know ​   简介:

    2024年02月14日
    浏览(26)
  • 创建一个简单的区块链,并使用 Flask 框架提供一个简单的 Web 接口来与区块链交互。

    目录 前言 一、代码展示 二、代码注释 1.简单的区块链模拟实现,这段代码定义了一个简单的区块链类,可以创建一个新的区块链,并能够添加新的区块到链上,同时获取最新的区块信息。这个模拟的区块链可以用于教学或演示区块链的基本概念。 2.这段代码是一个简单的工

    2024年04月14日
    浏览(36)
  • 区块链DAPP开发 以太坊智能合约框架有哪些

    Truffle 是一个在以太坊进行 DApp 开发的世界级开发环境、测试框架。 使用 Truffle 开发有一以下优点: 内置智能合约编译,链接,部署和二进制(文件)管理。 可快速开发自动化智能合约测试框架。 可脚本化、可扩展的部署和迁移框架。 可管理多个不同的以太坊网络,可部署

    2024年02月02日
    浏览(34)
  • 【区块链技术开发】十个比较流行的以太坊智能合约开发框架

    专栏:【区块链技术开发】 前期文章: 【区块链技术开发】剖析区块链Ganache模拟器工具及其智能合约部署区块链的查询方式 【区块链技术开发】基于Web3.js以太坊网络上的智能合约的交互及其应用 【区块链技术开发】OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,

    2024年02月02日
    浏览(48)
  • 【区块链】以太坊Solidity编写一个简单的Hello World合约

    熟悉一门语言得从Hello World! 开始,因为这是最简单的一个输出形式。 我们先在contracts目录下建立一个helloworld.sol文件 进入编辑 保存退出 在migrations下新建一个部署合约的js文件:3_initial_migration.js 名字可以变动 接下来在test中使用js调用智能合约 在另一个窗口打开ganache 运行智

    2024年02月15日
    浏览(54)
  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码

    专栏:区块链技术开发 Truffle Box是一个开发工具,为Truffle生态系统中的开发人员提供了预构建

    2023年04月16日
    浏览(41)
  • 区块链之智能合约

    智能合约( Smart Contract)是以计算机为主要工具,将数学算法嵌入到程序中,用以证明某个事件是否符合约定条件,并保证各方在约定时间内按照约定条件达成一致,以验证和执行合同条款的计算机文本。简单来说智能合约是一个计算机程序,可以在不需要第三方介入的情况

    2024年02月07日
    浏览(35)
  • 详细介绍区块链之挖矿

    对不起,大家,这篇文章对作者来说实在是太有意义和含金量了,作者想把它设置为关注博主才能见全文,请大家理解!如果觉得还是看不懂,抱歉耽误大家的时间,就请取消关注!!! 挖矿前述文章请见网络安全之网站常见的攻击方式_Joy T的博客-CSDN博客 建议先看一下先前

    2024年02月08日
    浏览(38)
  • 区块链之数字签名

    区块链中采用对原本信息的哈希值进行加密的方式来进行签名 数字签名:签名和验证 一个消息M、其哈希摘要D 签名者 通过自身的 私钥Kp 生成对应的签名 S=F(D,Kp) 验证者 通过 公钥K 解密 S 得到 消息M的摘要D=F(S,K) 双方通信的时候!!! 公钥加密,私钥解密 私钥签名

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包