一步步教你开发部署第一个去中心化应用(Dapp)宠物商店区块链技术剖析

本文通过实例教大家来开发去中心化应用,应用效果如图:

从本文,你可以学习到:

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

1、建立项目目录并进入

>mkdirpet-shop-tutorial>cdpet-shop-tutorial2、使用truffleunbox创建项目

>truffleunboxpet-shopDownloading...Unpacking...Settingup...Unboxsuccessful.Sweet!Commands:Compile:trufflecompileMigrate:trufflemigrateTestcontracts:truffletestRundevserver:npmrundev这一步需要等待一会

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

其他代码可以暂时不用管

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

pragmasolidity^0.4.17;contractAdoption{address[16]publicadopters;//保存领养者的地址//领养宠物functionadopt(uintpetId)publicreturns(uint){require(petId>=0&&petId<=15);//确保id在数组长度内adopters[petId]=msg.sender;//保存调用这地址returnpetId;}//返回领养者functiongetAdopters()publicviewreturns(address[16]){returnadopters;}}编译部署智能合约Truffle集成了一个开发者控制台,可用来生成一个开发链用来测试和部署智能合约。

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

>trufflecompile输出

Compiling./contracts/Adoption.sol...Writingartifactsto./build/contracts部署编译之后,就可以部署到区块链上。在migrations文件夹下已经有一个1_initial_migration.js部署脚本,用来部署Migrations.sol合约。Migrations.sol用来确保不会部署相同的合约。

现在我们来创建一个自己的部署脚本2_deploy_contracts.js

接下来执行部署命令:

>trufflemigrate执行后,有一下类似的输出,

Usingnetwork'develop'.Runningmigration:1_initial_migration.jsDeployingMigrations......0x3076b7dac65afc44ec51508bf6f2b6894f833f0f9560ecad2d6d41ed98a4679fMigrations:0x8cdaf0cd259887258bc13a92c0a6da92698644c0Savingsuccessfulmigrationtonetwork......0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956Savingartifacts...Runningmigration:2_deploy_contracts.jsDeployingAdoption......0x2c6ab4471c225b5473f2079ee42ca1356007e51d5bb57eb80bfeb406acc35cd4Adoption:0x345ca3e014aaf5dca488057592ee47305d9b3e10Savingsuccessfulmigrationtonetwork......0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0Savingartifacts...在打开的Ganache里可以看到区块链状态的变化,现在产生了4个区块。这时说明已经智能合约已经部署好了。

现在我们来测试一下智能合约,测试用例可以用JavaScriptorSolidity来编写,这里使用Solidity。

在test目录下新建一个TestAdoption.sol,编写测试合约

pragmasolidity^0.4.17;import"truffle/Assert.sol";//引入的断言import"truffle/DeployedAddresses.sol";//用来获取被测试合约的地址import"../contracts/Adoption.sol";//被测试合约contractTestAdoption{Adoptionadoption=Adoption(DeployedAddresses.Adoption());//领养测试用例functiontestUserCanAdoptPet()public{uintreturnedId=adoption.adopt(8);uintexpected=8;Assert.equal(returnedId,expected,"AdoptionofpetID8shouldberecorded.");}//宠物所有者测试用例functiontestGetAdopterAddressByPetId()public{//期望领养者的地址就是本合约地址,因为交易是由测试合约发起交易,addressexpected=this;addressadopter=adoption.adopters(8);Assert.equal(adopter,expected,"OwnerofpetID8shouldberecorded.");}//测试所有领养者functiontestGetAdopterAddressByPetIdInArray()public{//领养者的地址就是本合约地址addressexpected=this;address[16]memoryadopters=adoption.getAdopters();Assert.equal(adopters[8],expected,"OwnerofpetID8shouldberecorded.");}}Assert.sol及DeployedAddresses.sol是Truffle框架提供,在test目录下并不提供truffle目录。

TestAdoption合约中添加adopt的测试用例

在终端中,执行

truffletest如果测试通过,则终端输出:

Usingnetwork'develop'.Compiling./contracts/Adoption.sol...Compiling./test/TestAdoption.sol...Compilingtruffle/Assert.sol...Compilingtruffle/DeployedAddresses.sol...TestAdoptiontestUserCanAdoptPet(62ms)testGetAdopterAddressByPetId(53ms)testGetAdopterAddressByPetIdInArray(73ms)3passing(554ms)创建用户接口和智能合约交互我们已经编写和部署及测试好了我们的合约,接下我们为合约编写UI,让合约真正可以用起来。

在TruffleBoxpet-shop里,已经包含了应用的前端代码,代码在src/文件夹下。

接下来,我们来编辑app.js修改initWeb3():删除注释,修改为:

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

initContract:function(){//加载Adoption.json,保存了Adoption的ABI(接口说明)信息及部署后的网络(地址)信息,它在编译合约的时候生成ABI,在部署的时候追加网络信息$.getJSON('Adoption.json',function(data){//用Adoption.json数据创建一个可交互的TruffleContract合约实例。varAdoptionArtifact=data;App.contracts.Adoption=TruffleContract(AdoptionArtifact);//SettheproviderforourcontractApp.contracts.Adoption.setProvider(App.web3Provider);//UseourcontracttoretrieveandmarktheadoptedpetsreturnApp.markAdopted();});returnApp.bindEvents();}处理领养修改markAdopted()代码:

markAdopted:function(adopters,account){varadoptionInstance;App.contracts.Adoption.deployed().then(function(instance){adoptionInstance=instance;//调用合约的getAdopters(),用call读取信息不用消耗gasreturnadoptionInstance.getAdopters.call();}).then(function(adopters){for(i=0;i

在接受隐私说明后,会出现页面如下:

这里我们通过还原一个Ganache为我们创建好的钱包,作为我们的开发测试钱包。点击页面的ImportExistingDEN,输入Ganache显示的助记词。

candymaplecakesugarpuddingcreamhoneyrichsmoothcrumblesweettreat然后自己想要的密码,点击OK。如图:

至此MetaMask的安装,配置已经完成。

接下来需要本地的web服务器提供服务的访问,TruffleBoxpet-shop里提供了一个lite-server可以直接使用,我们看看它是如何工作的。bs-config.json指示了lite-server的工作目录。

{"server":{"baseDir":["./src","./build/contracts"]}}./src是网站文件目录./build/contracts是合约输出目录

以此同时,在package.json文件的scripts中添加了dev命令:

"scripts":{"dev":"lite-server","test":"echo\"Error:notestspecified\"&&exit1"},当运行npmrundev的时候,就会启动lite-server

>npmrundev会自动打开浏览器显示我们的dapp,如本文的第一张图。现在领养一直宠物看看,当我们点击Adopt时,MetaMask会提示我们交易的确认,如图:

点击Submit确认后,就可以看到成功领养了这次宠物。

在MetaMask中,也可以看到交易的清单:

区块链技术专家,《精通以太坊智能合约开发》的作者,北京航空航天大学硕士,创新工场高级工程师,猎豹移动技术项目负责人,以太坊基金会讲师,登链科技创始人兼CTO。对底层公链技术,区块链技术落地都有深入研究。

THE END
1.Petshop5.0详解+源代码(微软官方宠物商店5.0源码)petshop for framework 3.5(petshop 5.0)2008-07-27 20:59简介 基于.NET Framework 3.5的Petshop, 使用LINQ to SQL改进数据访问层 PetShop.Model.DataContext.MSPetShop4DataContext 继承System.Data.Linq.DataContext PetShop.Model.ProductInfo与PetShop.Model.CategoryInfo实体类分别映射数据库表 PetShop.Model....https://www.iteye.com/resource/zfzxw12-8644569
2.宠物对战脚本攻略:全面解决战斗技巧脚本编写与优化问题2. 编写战斗逻辑,包含宠物选择、战斗策略等。 3. 编写宠物技能释放逻辑,确信在战斗中能够发挥更大优势。 ### 3.3 编写示例 以下是一个简单的宠物对战脚本示例: ```python # 导入宠物对战API import pet_battle_api # 宠物选择 def choose_pet(): http://www.slrbs.com/jrzg/aizhishi/472410.html
3.圣伯纳犬类宠物(stbernarddoganimalspet)图片图库爱给网提供海量的高清图库资源素材免费下载, 本次作品为jpg 格式的圣伯纳犬类宠物(st-bernard-dog-animals-pet), 本站编号43251966, 该高清图库素材大小为3m, 分辨率为4374 x 2916, 更多精彩高清图库素材,尽在爱给网。 浏览本次作品的您可能还对 动物 感兴趣。https://www.aigei.com/item/st_bernard_dog_3.html
4....1.定义一个描述宠物的抽象类Pet,包含重量(weight)和年龄(age...根据题意,利用面向对象程序设计的思想完成如下代码设计: 1.定义一个描述宠物的抽象类Pet,包含重量(weight)和年龄(age)两个成员变量和显示宠物资料的showInfo方法以及获取宠物资料的getInfo方法 ; 2.设计一个可吃的接口Eatable,包含一个被吃(beEatted)的方法 ; 3https://m.ppkao.com/wangke/daan/b979677cf11946dd8b8788209425c153
5.基于ssm框架的宠物领养系统毕业论文.docx本系统实现了宠物信息的管理、领养申请等功能。本系统可以提高宠物领养机构的管理效率和信息透明度,方便用户进行领养申请和机构进行管理。同时,本系统还可以帮助机构进行数据统计和分析,为机构决策提供支持。本系统的开发和应用具有重要的实际意义和社会价值。关键词:SSM框架;宠物领养系统;Mysql A Pet Adoption System ...https://m.book118.com/html/2023/0827/8016100007005125.shtm
6.亚马逊宠物类产品和旅行户外用品中,什么卖得好亚马逊宠物类产品、旅行用品和户外产品中,Poop Bags、Pet Hair Remover、行李箱、防晒霜等产品卖得很好。 一、Pet Supplies(宠物用品) 蓝海亿观网了解到,根据APPA(American Pet Products Association 美国宠物用品协会)所做的一项National Pet Owners Survey(全国宠物主人调查),67%的美国家庭(约8500万个家庭)拥有宠物...https://www.egainnews.com/article/12675
7.宠物快跑(RunningPet)游戏下载宠物快跑手机版下载宠物快跑是一款让玩家控制着各种道具去进行对决冒险的动作跑酷休闲游戏,在游戏之中多种玩法随便进行选择畅玩,在这里玩家还能轻松获得各种资源,感兴趣的小伙伴赶紧下载试试吧。 宠物快跑说明 1、拥有多种可爱的宠物角色,采用精美的宠物设计。 2、带给你畅快的奔跑体验,体验与宠物一起快乐奔跑的乐趣。 3、展现了不同宠...http://m.opdown.com/danji/410695.html
8.宠物领养(PETADOPTION)本业务场景为: PET_ADOPTION。 L ext_key String 是 否 是 订单详情地址 key。固定为merchant_order_link_page,一笔订单同步过程中需要保持一致。 L ext_value String 是 否 是 商户小程序对应的订单详情页路径地址 value。仅需传入小程序页面路径即可。 L ext_key String 是 否 否 ...https://opendocs.alipay.com/mini/04v89b
9.PETEMO—宠物的天堂!自从养了狗狗后PETEMO—宠物的天堂!自从养了狗狗后,每次出门的目标之一,就是给它带些好吃的好玩的回来。 这次先介绍这家位于东京台场的AQUA CITY内的大型宠物超市PETEMO。其实AC里不止这家宠物用品店,但他确实是这里面最大,种类最齐全的一家。 狗玩具、狗用品、狗粮、零食应有尽有!逛得我这个铲屎官心花怒放如果你是铲屎官一...https://m.dianping.com/review/689758215
1.python毕设宠物之家程序+论文python毕设宠物之家程序+论文 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。 系统程序文件列表 开题报告内容 一、选题背景 关于宠物相关系统的研究,现有研究主要以宠物领养或宠物综合平台的部分功能为主,专门针对集宠物售卖、服务、医疗以及宠物与主人相关多种功能于...https://blog.csdn.net/sheji303/article/details/143721795
2.Web3优秀案例收集整理(附带源码):80+项目创意和案例等待你的...如何编写和部署NFT? https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/ 创建一个基于区块链的技能验证系统 ...创建一个基于Flow链的NFT宠物商店 https://nftschool.dev/tutorial/flow-nft-marketplace/#prerequisites 使用Moralis复制rarible NFT交易平台 ...https://maimai.cn/article/detail?fid=1744128853&efid=0ZU5e9Hff_sR0HEXROq_Iw
3.编写程序模拟“主人”喂养“宠物”的嘲,利用多态的思想...提示1: 主人类:Master 宠物类:Pet 宠物类子类:Dog、Cat、YingWu 提示2: 主人应该有喂养的方法:feed() 宠物应该有吃的方法:eat() 只要主人喂宠物,宠物就吃。 要求:主人类中只提供一个喂养方法feed(),要求达到可以喂养各种类型的宠物。 编写测试程序: 创建主人对象 创建各种宠物对象 调用主人的喂养方法feed()...https://cloud.tencent.com/developer/article/2182538
4.mypet经典英语教案(精选6篇)学生的积极性比较高。不足之处在于,将本课的难点没有很好的突破,以至于学生在描述自己宠物的环节中显得有些困难。 my pet 经典英语教案 2 一、教学目标 学生能够掌握与宠物相关的常见单词,如 pet(宠物)、dog(狗)、cat(猫)、turtle(乌龟)、parrot(鹦鹉)、goldfish(金鱼)等,并正确发音。https://mip.cnfla.com/jiaoan/847052.html
5.请用java代码对宠物进行类描述java创建一个宠物类我们两种宠物有很多相同的属性和方法,所以我们创建一个Pet类作为它们的子类。改进后类图 1.2 类代码 1.2.1 Pet类代码 package petShop; public class Pet { private String name;//成员变量 private int health; private int love; public Pet() { https://blog.51cto.com/u_14402/8920847
6.java多态实现电子宠物系统java4、宠物类,Pet:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class Pet { private int health; public int getHealth() { return health; } public void setHealth(int health) { this.health = health; if(this.health>100){ this.health=100; ...https://www.jb51.net/article/238702.htm
7.Django模型(数据库)及DjangoQuery常用方法需求二:编写宠物管理系统 宠物系统文件树形图 petForm.py # -*- coding: utf-8 -*- from django.forms import Form,widgets,fields class petInfo(Form): petName = fields.CharField(max_length=10,) petId = fields.CharField(max_length=4) gender = fields.CharField(initial = '雄性', widget = ...https://www.jianshu.com/p/25b5a9663100
8.PPet下载PPet正式版下载[桌面小宠物]PPet正式版是一款专用于PC电脑桌面的小宠物工具,PPet最新版酷炫好玩,让您的电脑桌面出现一个萌妹看板娘,桌面看板娘随机显示文字对话框,PPet软件还支持鼠标点击角色显示对话内容,角色右侧显示小工具可以使用,十分的可爱。 官方简介 你的电脑桌面是不是就只是一片青青草原那种普通的桌面?或者说时髦一点就是会动的电脑...http://downza.cn/soft/292203.html
9.魔兽世界宏命令怎么使用魔兽世界宏命令编写教程@目标判定,p 自己,pet宠物,focus焦点,target目标,targettarget目标的目标,mouseover鼠标指向,cursor光标位置,form姿态(相比stance少2字符),party1队伍框架1,arena1竞技场敌方框架1,partypet1队伍框架1的宠物,arenapet1竞技场敌方框架1的宠物 注意:focus焦点,敌方死亡自动取消焦点,仍可以再次焦点尸体,友方死亡不会取消焦...https://www.vqs.com/article/158.html
10.小小宠物园中文版下载有趣的宠物养成手游。应用截图应用介绍 小小宠物园是一款非常有趣的宠物养成游戏,在游戏中,有着许许多多不同的角色,你需要根据它们的生活习惯来喂养它们。还要陪它们玩耍,只有这样才能让它们长的更好哦!觉得这款游戏还不错的小伙伴快来下载吧! 游戏简介 它是传统意义的养成类游戏,该作品与前作《彩虹小马》风格...https://www.qqtn.com/azgame/340430.html
11.益生菌治疗宠物细菌性腹泻概述益生菌能够帮助宠物抵御致病菌并缓解细菌性腹泻的研究已较为明确,但其作用机制有多种且较为复杂,因此本文归纳总结了目前益生菌作用机制的研究进展情况。如图2所示,益生菌防止致病菌对胃肠道造成损害的作用机制主要分为3大类,分别是直接拮抗、免疫调节和排斥作用。图...http://journals.im.ac.cn/html/actamicrocn/2020/10/20201002.htm
12.IsPet品牌介绍IsPet宠物服装狗链IS PET作为E&B Group Limited的旗舰品牌,创始于2005年,目前IS PET已在全球19个国家拥有630多家经销商。IS PET的设计集当季流行元素于一身,设计风格虽然每个时期各有不同,却同样坚持着剪裁细腻,设计精巧、简约等大方向,兼带着永恒的舒服和品质。 宠物是我们的家庭成员之一,我们应该像照顾家人一样照顾和关爱它们。https://m.maigoo.com/brand/136548.html
13.PetFoster:PetXu**pn上传3.64MB文件格式zip 宠物寄养 PET_FOSTER>从宠物收集数据以供收养的应用程序 (0)踩踩(0) 所需:1积分 一份不知道哪里来的第十五届国赛模拟...家谱程序 编写家谱是一项富有意义和价值的任务 2024-11-02 00:07:47 积分:1 学校的编译原理课设成果 2024-11-01 16:39:30 ...https://www.coder100.com/index/index/content/id/2328580