查看更多文章: https://alili.tech

truffle的宠物商店是一个了解以太坊开发的一个很不错的例子.
跟着官方提供的demo与教程,可以完整的感受一下整个流程的开发.

Ganache

为了环境需要,并且快速的在本地搭建一个私有链环境.
truffle推出了一个可视化私有链客户端:
Ganache下载地址
下载之后运行,你会看到这样一个界面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ueP8hSnx-1600174507424)(https://static.alili.tech/images/Jietu20180421-213717.jpg)]

初始化你的项目

首先我们新建一个目录,并且初始化一下项目

$ mkdir pet-shop
$ cd pet-shop
$ truffle unbox pet-shop

项目目录结构

这里只列出了重要的目录与文件

├── bs-config.json
├── contracts //合约目录
│   └── Migrations.sol //合约文件
├── migrations // 部署脚本
│   └── 1_initial_migration.js
├── package-lock.json
├── package.json
├── src // 前端代码目录
├── test // 测试代码目录
└── truffle.js // truffle配置文件

编写智能合约

在contracts/目录中,创建一个Adoption.sol文件
文件内容:

pragma solidity ^0.4.17;contract Adoption {address[16] public adopters;  // 声明一个地址变量,用于保存领养者地址// 领养宠物function adopt(uint petId) public returns (uint) {require(petId >= 0 && petId <= 15);  // 确保宠物id正确,为0到15之间,// 如果不符合条件就会回滚    //msg.sender 为调用这个函数的人的地址adopters[petId] = msg.sender;        // 保存调用这地址 return petId;}// 返回领养者function getAdopters() public view returns (address[16]) {return adopters;}}

编译你的智能合约

$ truffle compile//输出
Compiling ./contracts/Adoption.sol...
Writing artifacts to ./build/contracts

这样你就会发现你的项目多了一个build文件夹,
里面存放这里刚刚写好的智能合约编译完成的json文件

部署你的智能合约

你的智能合约写好了,你可以暂且理解为你的后台代码写好了.要部署起来便于前端调用.

在你的migrations/目录新建一个部署脚本:2_deploy_contracts.js

var Adoption = artifacts.require("Adoption");module.exports = function(deployer) {deployer.deploy(Adoption);
};

打开刚刚下载的Ganache, Ganache会启动一个私有链.
我们的智能合约就是要部署在这个私有链上.

确认项目录根目录的truffle.js

module.exports = {networks: {development: {host: "127.0.0.1",port: 7545, //确保端口地址,是否与私有链地址一致,如果不一致请保持一致network_id: "*" // Match any network id}}
};

执行以下命令,部署合约:

truffle  migrate# 输出
Using network 'develop'.Running migration: 1_initial_migration.jsDeploying Migrations...... 0x3076b7dac65afc44ec51508bf6f2b6894f833f0f9560ecad2d6d41ed98a4679fMigrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
Saving artifacts...
Running migration: 2_deploy_contracts.jsDeploying Adoption...... 0x2c6ab4471c225b5473f2079ee42ca1356007e51d5bb57eb80bfeb406acc35cd4Adoption: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
Saving successful migration to network...... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0
Saving artifacts...

重新打开Ganache,你会发现区块链的状态发生了变化,多了4个区块.
OK,部署完毕
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EryPlo7E-1600174507428)(https://learnblockchain.cn/images/ganache-migrated.png)]

前端与智能合约的交互

好,智能合约我们已经部署好了.接下来我们就要开始我们的javascript部分了
打开 src/js/app.js

初始化web3

web3是一个前端与以太坊通信的库,所有调用智能合约的操作,我们基于web3来实现.

我们在app.js里找到initWeb3方法,为其添加以下代码:

initWeb3: function() {// 判断是否有全局web3对象,一般装了MetaMask这种钱包就会有全局的web3对象if (typeof web3 !== 'undefined') {// 如果有,就直接使用App.web3Provider = web3.currentProvider;} else {// 如果没有全局的web3对象,就直接在本地初始化一个App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');}web3 = new Web3(App.web3Provider);return App.initContract();
}

实例化智能合约

找到initContract方法部分,添加以下代码:

initContract: function() {//加载我们的之前写好的智能合约$.getJSON('Adoption.json', function(data) {// 用Adoption.json数据创建一个可交互的TruffleContract合约实例。var AdoptionArtifact = data;//TruffleContract 为该项目的全局方法,使用的是 truffle-contract这个库//如果在其他项目,你可以直接npm i truffle-contract --save 来安装这个库//用于实例化合约App.contracts.Adoption = TruffleContract(AdoptionArtifact);// Set the provider for our contractApp.contracts.Adoption.setProvider(App.web3Provider);// Use our contract to retrieve and mark the adopted petsreturn App.markAdopted();});return App.bindEvents();
}

领养部分

handleAdopt方法部分,添加以下代码:

handleAdopt: function(event) {event.preventDefault();//dom里获取到宠物的idvar petId = parseInt($(event.target).data('id'));var adoptionInstance;// 获取用户账号web3.eth.getAccounts(function(error, accounts) {if (error) {console.log(error);}//获取用户,如果装了钱包只会返回长度只有1的数组,如果没有装钱包,会返回所有用户的地址var account = accounts[0];//调用智能合约App.contracts.Adoption.deployed().then(function(instance) {adoptionInstance = instance;// 发送交易领养宠物return adoptionInstance.adopt(petId, {from: account});}).then(function(result) {return App.markAdopted();}).catch(function(err) {console.log(err.message);});});
}

找到 markAdopted方法,添加以下代码:

markAdopted: function(adopters, account) {var adoptionInstance;//调用合约的方法App.contracts.Adoption.deployed().then(function(instance) {adoptionInstance = instance;// 调用合约的getAdopters(), 用call读取信息不用消耗gasreturn adoptionInstance.getAdopters.call();}).then(function(adopters) {for (i = 0; i < adopters.length; i++) {if (adopters[i] !== '0x0000000000000000000000000000000000000000') {$('.panel-pet').eq(i).find('button').text('Success').attr('disabled', true);}}}).catch(function(err) {console.log(err.message);});
}

启动服务

好了,所有代码我们都已经填充完毕,启动我们的项目,开始领养你喜欢的宠物吧

$ npm run dev

公众号“ Alili丶前端大爆炸”,关注后提供海量学习资料

以太坊开发之搭建宠物商店相关推荐

  1. 以太坊开发环境搭建(Windows系统)

    ** 以太坊开发环境搭建(Windows系统) ** 1.安装go环境 官网下载安装包或者去其他国内网站下载go环境下载地址. 安装步骤:打开安装文件.点击next.点击next.选择安装目录点击ne ...

  2. linux以太坊开发环境搭建

    2019独角兽企业重金招聘Python工程师标准>>> 如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战入门教程 以太坊去中心化 ...

  3. linux 以太坊开发环境搭建

    1 安装go环境 preference 2 安装最新版node和npm 3 安装以太坊go-ethereum 引用 4 安装solc(solidity编译环境) 5 搭建以太坊私有链 1 安装go环境 ...

  4. 以太坊源码linux下如何编译,以太坊教程:搭建环境、编写编译一个智能合约

    本以太坊教程主要是介绍:搭建一个开发环境.编写编译一个智能合约. 以太坊是什么 以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台.通过其专用加密货币以太币(Ether)提供去中心化 ...

  5. 以太坊教程:搭建环境、编写编译一个智能合约

    本以太坊教程主要是介绍:搭建一个开发环境.编写编译一个智能合约. 以太坊是什么 以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台.通过其专用加密货币以太币(Ether)提供去中心化 ...

  6. 第二课 如何在WINDOWS环境下搭建以太坊开发环境

    [本文目标] 根据本文指导,可以在WINDOUWS环境下完成以太坊智能合约部署前的比较环境准备. [技术收获] 如何在WINDOW(笔者以WINDOWS 10为例)环境搭建以太坊开发环境,按照以下安装 ...

  7. 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约

    以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...

  8. 以太坊开发入门,如何搭建一个区块链DApp投票系统

    点击关注异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 第一节 概述 对于初学者,需要了解以太坊开发相关的基本概念,另外就是如何构建一个基于以太坊的完整去中心化应用例如一个区块链投票 ...

  9. 第一课 如何在WINDOWS环境下搭建以太坊开发环境

    目录:https://blog.csdn.net/qq_40452317/article/details/90270046 [本文目标] 根据本文指导,可以在WINDOUWS环境下完成以太坊智能合约部 ...

最新文章

  1. python八大选择排序_Python实现选择排序
  2. Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext
  3. python open方法下file模块_python 文件操作
  4. python中的拷贝
  5. android photopicker怎么修改状态栏,有没有办法阻止UIImagePickerController更改状态栏样式?...
  6. 工业POE供电交换机在安防应用中的优势有哪些?
  7. 协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
  8. 值类型和引用类型的区别
  9. anaconda镜像源配置_Anaconda使用技巧,如何修改国内镜像源?
  10. 多目标跟踪MOT评价指标
  11. UIWindow statusBar消失
  12. 540.有序数组中的单一元素(力扣leetcode) 博主可答疑该问题
  13. 棋牌游戏服务器架构设计
  14. win任务栏计算机变未知,深度技术Win7电脑任务栏图标显示异常的解决方法
  15. 获取微信公众号文章封面图的方法
  16. 传统文化千千问重磅来袭!边玩边学,答题赢Kindle、全年免单大奖!——心田花开
  17. 缺陷管理工具--mantis使用过程
  18. mysql批量添加空行_MySQL加入空行
  19. 怎么用计算机要微信,电脑端要实现“微信双开”功能,三种方法,简单实用!...
  20. 使用jQuery制作图书简介

热门文章

  1. 家庭自建流媒体服务器,如何创建自己的“家庭媒体流服务器”使用Plex与FreeNAS - 第3部分...
  2. 龙纹身的女孩 The Girl with the Dragon Tattoo
  3. 电脑开机密码忘记了怎么办 怎么破解电脑开机密码
  4. 英宝通Unity4.0公开课下载地址
  5. 『Android开源框架』用XXPermissions请求相机权限实现手电筒
  6. 为什么在线个人品牌对企业家至关重要
  7. 如何选择低代码/0代码平台(最全平台总结)
  8. python反转一个3位整数
  9. 郑州大学大二计算机课程表,郑州大学大四课表.doc
  10. GT1030 GTX1050 GT705 Pascal Maxwell Fermi系列N卡Monterey 12.5 – Ventura 13.2 开启QE/CI驱动详尽教程