前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带你做一个基于智能合约的项目

带你做一个基于智能合约的项目

作者头像
海哥@开发
发布2022-04-06 14:24:45
1.3K0
发布2022-04-06 14:24:45
举报
文章被收录于专栏:海哥聊技术

以太坊(英语:Ethereum)是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether,又称“以太币”)提供去中心化的虚拟机(称为“以太虚拟机”Ethereum Virtual Machine)来处理点对点合约。

从前年开始比特币这种去中心化的代币火了起来,但一直没有实际的基于区块链应用开发出发更多的就是挖矿炒币,直到以太坊的出现,智能合约的出现。大大方便了基于区块链项目的开发。

智能合约(英语:Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。

但目前相对的游戏还是比较单一40%的市场都是基于击鼓传花类的游戏(代表作加密名人),30%是基于收藏类的游戏(代表作加密猫)。更多的感觉还是借助区块链的这热度来快速圈钱。

当然也不可否定对于这个新鲜事务或玩法也有颠覆的一面,智能合约一但发布全部合约代码,会放到区块链上所有人可以查看。比如加密猫的源码在区块链上就是可查的包括所有的代码注释,官方无法在再像传统游戏隐瞒各种概率类事件。当然如果发生盗号一类事件官方也无法进行回档操作。

我们可以看到加密猫的部分常量代码写死到了智能合约里,比如0代猫的最大数量,用户促销活动的0代猫数量。

代码语言:javascript
复制
  contract KittyMinting is KittyAuction {       // Limits the number of cats the contract owner can ever create.       uint256 public constant PROMO_CREATION_LIMIT = 5000;      uint256 public constant GEN0_CREATION_LIMIT = 45000;

介绍了很多,到底这些分布式APP的未来如何不可知,但我们今天的主要目的是分享一下技术,实现一个基于智能合约的投票项目。 本文档会以macOS版本来举例构建开发环境.

客户端

以太坊的主要客户端是Geth由GO语言开发,开发使用Solidity。我们今天全部使用brew来自动安装

Geth终端的安装

Geth一个基于GO语言开发的以太网终端,可以执行终端命令。创建私有网络,挖矿。 官方地址

macOS下的安装

代码语言:javascript
复制
brew tap ethereum/ethereumbrew install ethereum#连入公有以太网geth consle#连入私有网络geth attach http://localhost:7545 consle

Ganache 安装

基于私有链路的一个服务器程序,有图形界面可用很方便,下载安装即可使用。 (代替旧有的testrpc) 下载地址

智能合约

智能合约的开发语言是Solity.我们还会使用Truffle框架方便进行dApp快速开发测试。

SolityIDE安装

IDE目前没有太智能的,在线的推荐Remix可以直接编译程序生成字节码,并进行发布。单机模式推荐Atom,并安装相应的智能提示插件。

Solidity,truffle安装

Solidity是一种合约导向式语言,可被应用于各种不同的区块链平台上,其主要开发者为Gavin Wood,Christian Reitwiessner,Alex Beregszaszi,Liana Husikyan,Yoichi Hirai和其他几位早期以太坊核心贡献者。Solidity 可使程式开发人员能在区块链上(例如以太坊)编写智能合约。

关于Solidity的官方文档 在这里语法比较简单,像javascript很快就可以上手。(官方文档有语言可选 en zh 我选了ZH后翻了好几页也没简单一个简体中文)

代码语言:javascript
复制
brew updatebrew upgradebrew tap ethereum/ethereumbrew install soliditybrew linkapps solidity npm install -g truffle

创建我们的投票项目

网上很多旧的教程还在用truffle init在初始化,这是官方已经抛弃的旧方法。目前官方推荐使用 Truffle Boxes 来创建项目。是官方已经做好的一些模板项目,方便我们的快速开发.

代码语言:javascript
复制
guohai•Developer/ethereum/vote» truffle unbox reactDownloading...Unpacking...Setting up...Unbox successful. Sweet! Commands:   Compile:              truffle compile  Migrate:              truffle migrate  Test contracts:       truffle test  Test dapp:            npm test  Run dev server:       npm run start  Build for production: npm run build

执行完上面的命令会帮我们创建一个项目目录。

  • contracts:编写智能合约的文件夹,所有的智能合约文件都放置在这里
  • migrations:部署合约配置的文件夹
  • src:基于React的Web端源码
  • test:智能合约测试用例文件夹

创建投票合约

我们先在contracts目录下创建一个Voting.sol 来写我们的合约内容

代码语言:javascript
复制
pragma solidity ^0.4.18; contract Voting {    mapping (bytes32 => uint8) public votesReceived;    //候选人    bytes32[] public candidateList;     //无名函数 ,构造方法    function Voting(bytes32[] candidateNames) public {      candidateList = candidateNames;    }     //查票    function totalVotesFor(bytes32 candidate) public constant returns (uint8) {      require(validCandidate(candidate) == true);      return votesReceived[candidate];    }     //投票    function voteForCandidate(bytes32 candidate) public {      assert(validCandidate(candidate) == true);      votesReceived[candidate] += 1;    }     //select    function validCandidate(bytes32 candidate) public constant returns (bool) {      for(uint i =0 ; i < candidateList.length; i++) {        if(candidateList[i] == candidate) {          return true;        }      }      return false;    }}

发布合约到我们的私有链上

在以太网的区块链上发布合约也是要消耗GAS的,为矿工支付报酬。我们需要先安装chrome的一个钱包插件MetaMask.安装好后切换下钱包的网络到你的私有链上。打开Remix我们在进行合约的发布。提交后我会得到合约的地址,拷贝下来 “0x0d8cc4b8d15d4c3ef1d70af0071376fb26b5669b”

当合约发布完后,我们可以直接在Remix里对合约的方法进行调用测试。当测试无问题后我们再开发APP程序。在测试程序的时候我们可以看到粉红色的投票方法按钮因为要写数据到区块中是要消耗GAS的。而我们的查询按钮全是蓝色,因为不用写入全是免费的。

友好的网页界面程序

接下来编译我们的项目,得到ABI。truffle compile .修改src/App.js文件为如下内容

代码语言:javascript
复制
import React, { Component } from 'react'import VotingContract from '../build/contracts/Voting.json'import getWeb3 from './utils/getWeb3' import './css/oswald.css'import './css/open-sans.css'import './css/pure-min.css'import './App.css' const contractAddress ="0x0d8cc4b8d15d4c3ef1d70af0071376fb26b5669b"var votingContractInstance;var account; var _modifyVotingCount = (candidates,i,votingCount) => {     console.log("---------");    console.log(candidates);    console.log(i);    console.log(votingCount);     let obj = candidates[i];    obj.votingCount = votingCount;    return candidates;}  。。。。代码过长请跳转阅读原文

接下来运行我们的项目 npm run start

参考资料

  • 以太坊私有链搭建指南
  • Solidity在线调试工具
  • 一个简单的基于Dapp的投票
  • 去中心化应用(Dapp) - 宠物商店机遇unbox
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海哥聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 客户端
    • Geth终端的安装
      • Ganache 安装
        • SolityIDE安装
          • Solidity,truffle安装
          • 创建我们的投票项目
            • 创建投票合约
              • 发布合约到我们的私有链上
                • 友好的网页界面程序
                • 参考资料
                相关产品与服务
                私有网络
                私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档