开发、部署第一个去中心化应用(Dapp) - 宠物商店

环境部署

1.安装Node:

http://nodejs.org/
在官网进行下载
查看npm是否安装完成:

2.创建项目并进入

mkdir pet-shop-tutorial
cd pet-shop-tutorial

3.使用truffle unbox 创建项目

truffle unbox pet-shop

4.项目目录结构

contracts/ 智能合约的文件夹,所有的智能合约文件都放置在这里,里面包含一个重要的合约 Migrations.sol(稍后再讲)
migrations/ 用来处理部署(迁移)智能合约 ,迁移是一个额外特别的合约用来保存合约的变化。
test/ 智能合约测试用例文件夹
truffle.js/ 配置文件

5.编写智能合约

在 contracts 目录下,添加合约文件 Adoption.sol

cd contracts
vim Adoption.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.5.0;
//
contract Adoption {
//
address[16] public adopters; // 保存领养者的地址

// 领养宠物
function adopt(uint petId) public returns (uint) {
require(petId >= 0 && petId <= 15); // 确保id>在数组长度内

adopters[petId] = msg.sender; // 保存调>用这地址
return petId;
}

// 返回领养者
function getAdopters() public view returns (address[16] memory) {
return adopters;
}

}

编译部署智能合约

1.编译

Solidity 是编译型语言,需要把可读的 Solidity 代码编译为 EVM 字节码才能运行。
需要在dapp 的目录 pet-shop-tutorial 下编译

cd pet-shop-tutorial
truffle compile

2.部署

编译之后,就可以部署到区块链上。
在 migrations 文件夹下已经有一个 1_initial_migration.js 部署脚本,用来部署 Migrations.sol 合约。
Migrations.sol 用来确保不会部署相同的合约。
创建一个自己的部署脚本 2_deploy_contracts.js

cd migrations
vim 2_deploy_contracts.js

将代码复制进去

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

3.创建一条私有链

使用Ganache 来开启一个私链来进行开发测试,会在 7545 端口上运行一个开发链。
Ganache 启动之后是这样:

执行部署命令:

truffle migrate

在打开的 Ganache 里可以看到区块链状态的变化,现在产生了 4 个区块。

4.测试智能合约

现在我们来测试一下智能合约,测试用例可以用 JavaScript 或 Solidity 来编写,这里使用 Solidity。
在 test 目录下新建一个 TestAdoption.sol,编写测试合约

cd test
vim TestAdoption.sol

合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.5.0;
//
import “truffle/Assert.sol”; // 引入的断言
import “truffle/DeployedAddresses.sol”; // 用来获取被测试合约的地址
import “…/contracts/Adoption.sol”; // 被测试合约
//
contract TestAdoption {
Adoption adoption = Adoption(DeployedAddresses.Adoption());

// 领养测试用例
function testUserCanAdoptPet() public {
uint returnedId = adoption.adopt(8);
//
uint expected = 8;
Assert.equal(returnedId, expected, “Adoption of pet ID 8 should be recorded.”);
}

// 宠物所有者测试用例
function testGetAdopterAddressByPetId() public {
// 期望领养者的地址就是本合约地址,因为交易是由测试合约发起交易,
address expected = address(this);
address adopter = adoption.adopters(8);
Assert.equal(adopter, expected, “Owner of >pet ID 8 should be recorded.”);
}

// 测试所有领养者
function testGetAdopterAddressByPetIdInArray() public {
// 领养者的地址就是本合约地址
address expected = address(this);
address[16] memory adopters = adoption.getAdopters();
Assert.equal(adopters[8], expected, “Owner of pet ID 8 should be recorded.”);
}
}

5.运行测试用例

在终端中,执行

truffle test

成功截图

6.创建用户接口和智能合约交互

在 Truffle Box pet-shop 里,已经包含了应用的前端代码,代码在 src/ 文件夹下。
在编辑器中打开 src/js/app.js
可以看到用来管理整个应用的 App 对象,init 函数加载宠物信息,就初始化 web3.
web3 是一个实现了与以太坊节点通信的库,我们利用 web3 来和合约进行交互。

cd …#进入项目根目录
vim src/js/app.js
gedit src/js/app.js

(vim和gedit都可以打开文件,gedit在记事本中打开)
将app.js文件修改为:
完整代码:

App = {
web3Provider: null,
contracts: {},
//
init: async function() {
// Load pets.
$.getJSON(’…/pets.json’, function(data) {
var petsRow = $(’#petsRow’);
var petTemplate = $(’#petTemplate’);
//
for (i = 0; i < data.length; i ++) {
petTemplate.find(’.panel-title’).text(data[i].name);
petTemplate.find(‘img’).attr(‘src’, data[i].picture);
petTemplate.find(’.pet-breed’).text(data[i].breed);
petTemplate.find(’.pet-age’).text(data[i].age);
petTemplate.find(’.pet-location’).text(data[i].location);
petTemplate.find(’.btn-adopt’).attr(‘data-id’, data[i].id);
//
petsRow.append(petTemplate.html());
}
});

return await App.initWeb3();
},

(初始化web3编辑 app.js 修改 initWeb3())

initWeb3: async function() {
if (window.ethereum) {
App.web3Provider = window.ethereum;
try {
// Request account access
await window.ethereum.enable();
} catch (error) {
// User denied account access…
console.error(“User denied account access”)
}
}
// Legacy dapp browsers…
else if (window.web3) {
App.web3Provider = window.web3.currentProvider;
}
// If no injected web3 instance is detected, fall back to Ganache
else {
App.web3Provider = new Web3.providers.HttpProvider(‘http://localhost:7545’);
}
web3 = new Web3(App.web3Provider);

return App.initContract();
},

(实例化合约
使用 truffle-contract 会帮我们保存合约部署的信息,就不需要我们手动修改合约地址,修改 initContract()代码如下

initContract: function() {
$.getJSON(‘Adoption.json’, function(data) {
// 用Adoption.json数据创建一个可交互的TruffleContract合约实例。
var AdoptionArtifact = data;
App.contracts.Adoption = TruffleContract(AdoptionArtifact);
//
// Set the provider for our contract
// App.contracts.Adoption.setProvider(App.web3Provider);

// Use our contract to retrieve and mark the adopted pets
return App.markAdopted();
});

return App.bindEvents();
},

bindEvents: function() {
$(document).on(‘click’, ‘.btn-adopt’, App.handleAdopt);
},

(处理领养
修改 markAdopted()代码:

markAdopted: function() {
var adoptionInstance;
//
App.contracts.Adoption.deployed().then(function(instance) {
adoptionInstance = instance;
//
// 调用合约的getAdopters(), 用call读取信息不用消耗gas
return 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);
});
},

修改 handleAdopt()代码:)

handleAdopt: function(event) {
event.preventDefault();
//
var petId = parseInt($(event.target).data(‘id’));
//
var adoptionInstance;

// 获取用户账号
web3.eth.getAccounts(function(error, accounts) {
if (error) {
console.log(error);
}
//
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);
});
});
}

};
//
$(function() {
$(window).load(function() {
App.init();
});
});

在浏览器中运行

1.安装 MetaMask

MetaMask 是一款插件形式的以太坊轻客户端,开发过程中使用 MetaMask 和我们的 dapp 进行交互是个很好的选择
下载地址:https://metamask.io/
这里选择安装的是谷歌浏览器版本,将下载好的MetaMask 安装在谷歌浏览器扩展程序中,打开程序并注册。
进入:

2.连接开发区块链网络

默认连接的是以太坊主网(左上角显示),选择 自定义 RPC,

在新增RPC URL中填入:

http://127.0.0.1:7545

点击右上角○选择导入用户

复制ganance中链的私匙
点击钥匙图片
复制PRIVATE KEY并粘贴

导入成功后显示:

在项目目录中启动服务

npm run dev

会在浏览器显示dapp如下:

现在领养一只宠物,当我们点击 Adopt 时,MetaMask 会提示我们交易的确认,如图:

交易成功:

可以在MetaMask看到交易记录:

至此dapp完成!

开发、部署第一个去中心化应用(Dapp) - 宠物商店相关推荐

  1. 一步步教你开发、部署第一个去中心化应用(Dapp) - 宠物商店

    今天我们来编写一个完整的去中心化(区块链)应用(Dapps), 本文可以和编写智能合约结合起来看. 写在前面 阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此 ...

  2. Truffle Web3.js -开发、部署第一个去中心化应用(Dapp) - 宠物商店

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些 HTML 及 JavaScript 知识. 修改后完整源代码: 下载 pet-shop ...

  3. 【学习笔记】Mac基于truffle第一个去中心化应用(Dapp) - 宠物商店

    一.项目背景 Pete 有一个宠物店,有 16 只宠物,他想开发一个去中心化应用,让大家来领养宠物. 在 truffle box 中,已经提供了 pet-shop 的网站部分的代码,我们只需要编写合约 ...

  4. 开发、部署去中心化应用(Dapp) - 宠物商店

    本文通过实例教大家来开发去中心化应用,应用效果如图: 从本文,你可以学习到: 搭建智能合约开发环境 创建Truffle项目 编写智能合约 编译和部署智能合约到区块链 如何通过Web3和智能合约交互 M ...

  5. 最简单的方式让你了解去中心化应用DAPP开发

    最简单的方式让你了解去中心化应用DAPP开发 一.什么是中心化 例如,微信归腾讯,facebook 归 facebook,淘宝归阿里巴巴.在这些应用中,我们只是腾讯和 facebook 的用户,我们无 ...

  6. 以太坊开发------使用Truffle打造去中心化的宠物商店

    pet-shop Box项目地址:http://truffleframework.com/boxes/pet-shop pet-shop Box官方教程:http://truffleframework ...

  7. 以太坊学习路线——(五)DApp开发:简易版去中心化微博

    这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战--以太坊关键技术与案例分析 第十一章(吴寿鹤.冯翔.刘涛.周广益   著). 项目地址,包含该项目所需大部分文件,前端因为依 ...

  8. 精通以太坊:开发智能合约和去中心化应用

    为什么微软.纳斯达克以及其他数百个组织都在尝试以太坊? 因为以太坊打开了通向去中心化计算的大门,在这个平台上,我们可以运行去中心化的应用程序(DApp)和智能合约.以太坊是WEB 3.0 和 NFT的 ...

  9. 去中心化(Dapp)是什么意思?

    谈到去中心化的应用,许多人的第一反应就是用"去中心化"这个词卡住了,而这四个字又是我们提到区块链时必须捆绑起来才能说话的另一个词.还不如将"去中心化"的应用拆开 ...

最新文章

  1. Linux自动备份文件(linux计划任务)
  2. 2017ACM暑期多校联合训练 - Team 7 1009 HDU 6128 Inverse of sum (数学计算)
  3. spring基础系列--JavaConfig配置
  4. python mkl freebsd_freebsd下之简单安装python
  5. vue的matcher_vue-router工作原理概述和问题分析
  6. Java开发环境!为什么MySQL不推荐使用uuid作为主键
  7. java 集合操作工具包_java之操作集合的工具类--Collections
  8. 去掉状态条并全屏_机关单位内必须懂的道理:20条潜规则和13条定律
  9. 对CSS选择器的理解
  10. kali win10双系统_小米win10+kali 双系统
  11. 哪个网站可以免费学计算机办公软件,有没有可以免费学习办公软件的网站?
  12. SD卡格式化重建分区
  13. Kubernetes中配置Pod的liveness和readiness探针
  14. 芝加哥打字机_芝加哥打字机不是打字机
  15. dtl文件java_数据库之DTL——数据事务语言 事务
  16. 全面理解面向对象的 JavaScript(转载)
  17. gazebo plugins
  18. Win11电脑一边耳机没声音怎么办
  19. PaaS的五个核心价值
  20. python的pandas库题1

热门文章

  1. 【定语从句练习题】限制性与非限制性
  2. erp实施过程中企业会受到怎样的影响?
  3. 腾讯微博宣布关闭!下一个会是微视吗?
  4. 在visio中将图片变成黑白,将图片对象进行颜色转换 彩色图转灰度图
  5. GT1030和730哪个好?GT1030与GT730区别对比 (全文)
  6. Java 通过csv表格文件生成转换SQL文件
  7. 站在供应链全局视角来了解服装行业
  8. Web安全知识体系总结
  9. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“label1”的线程访问它。”
  10. 转【Latex】Texstudio英文拼写错误检查功能出问题的解决方法