一步步教你开发部署第一个去中心化应用宠物商店Tiny熊

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

Ganache(或GanacheCLI)已经取代了testrpc。

>mkdirpet-shop-tutorial>cdpet-shop-tutorial使用truffleunbox创建项目>truffleunboxpet-shopDownloading...Unpacking...Settingup...Unboxsuccessful.Sweet!Commands:Compile:trufflecompileMigrate:trufflemigrateTestcontracts:truffletestRundevserver:npmrundev这一步需要等待一会

也可以使用truffleinit来创建一个全新的项目。

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执行后,有一下类似的输出,

现在我们来测试一下智能合约,测试用例可以用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显示的助记词。

至此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会提示我们交易的确认,如图:

THE END
1.德牧在野外带回一只小浣熊,要求主人收养它湖南罕见双性人,上半身女性下半身男性,被男人求婚该如何抉择? 历史博鉴览 255跟贴 越南购买印度反舰导弹,结果被坑了4.2亿美元,怎么回事? 安安的每一天 34跟贴 85年越南求和,中国不予回复,一个月后邓小平宣布:裁军100万 兰熊熊双胞胎 天花板级别的国产喜剧电影,上映已经15年,但依旧经典 猛虎电影 520跟贴 美女...https://m.163.com/v/video/VUG3MMBRS.html
2.“免费领养”宠物的套路也太多了值得注意的是,当记者以免费领养猫狗名义与北京多家宠物店沟通后被告知,必须先选好猫狗再沟通协议。 北京昌平某店称“仅约定按月支付款项的条款”,记者问及宠物生病如何解决,其称“领养之前自然会检查宠物健康状态”并拒绝告知详细条款,“合同需要到店恰谈”。北京朝阳一店员也告诉记者:“先选好要带...http://www.xinhuanet.com/legal/20240405/ec2348701146495ab7ff960ceff173c5/c.html
1.临安宠物交易宠物领养养宠物经验交流家有宠物临安宠物是一个供临安爱宠人士发布宠物交易、宠物领养、养宠经验交流的平台。您既可以在此求助养宠遇到的问题,也可以秀自家宠物美照。[第1页]https://linan.19lou.com/forum-2235-1.html
2.怎么领养到qq宠物猪或宠物熊(不通过淘宝网等其他网站)QQ宠物猪和宠物熊是QQ游戏中的虚拟宠物,玩家可以通过购买或者参与活动来获得。具体的领养方式可能根据不...https://ask.zol.com.cn/x/25465516.html
3.比熊免费领养!宠物乐园丹阳翼网两年多比熊,公狗,已打过疫苗3针,因为家庭原因,免费领养。有意者联系。https://bbs.212300.com/forum.php?mod=viewthread&tid=6894027
4.饥荒联机版宠物怎么获得饥荒联机版宠物领养方法先说一下宠物系统: 玩家可以在各种地形上寻找到岩石小穴如图 当玩家靠近岩石小穴就可以开启驯养的科技栏 下面给大家介绍宠物的种类及领养材料 小浣熊 炸鱼条*1 浣熊尾巴*1 小鬣犬 怪物千层糕*1 狗牙*1 小钢羊 鳄梨酱(地鼠肉)*1 钢丝绒*1 小龙蝇 ...https://www.3dmgame.com/gl/201612/3613708.html
5.Q宠网宠物领养宠物资讯平台Q宠网是国内知名的宠物资讯平台,服务每一位喜爱动物的您,为您提供全面的宠物资讯,无论是宠物狗、宠物猫、兔子、水族或者爬宠类,我们提供您需要的养宠知识,养宠新手、宠物喂养、宠物训练和宠物领养等丰富宠物资讯。https://qchongwang.net/
6.心动庄园2动物窝许可证怎么获得,教你如何领养自己的宠物要想建立自己的宠物小窝,玩家的第一个步骤需要领养到属于自己的宠物,这样在后续的玩法中才会开启对应的许可证获得方式。宠物在游戏中可以通过领养和购买来获得,领养的方式可以在好友庄园中进行,会有几率出现流浪的小动物,点击对话之后就可以进行领养了。 而购买的话除了庄园的等级需要,还需要准备大量的金币,而且目前游戏...https://m.wandoujia.com/apps/7769567/10202227786795508212.html
7.想领养一只比熊犬怎么领养?最近,我对领养一只比熊犬产生了浓厚的兴趣。这种小巧可爱的犬种,拥有无比柔软的毛发和聪明活泼的性格。然而,对于如何领养一只比熊犬,我还不是很清楚。经过了解和调研,我发现以下几个方面至关重要。 1. 寻找可信赖的比熊犬育种者 首先,要想领养一只比熊犬,寻找可信赖的比熊犬育种者是非常重要的。一个好的育种者...https://www.chongwugo.cn/44041.html
8.熊爸爸领猫馆的领养心得之路现在我们来讨论下熊爸爸领猫馆吧,这种比较新的无偿领养模式是真的为客户省钱还是一个坑呢? 一个全新养宠方式的诞生都是一个行业的进步和升华。重点了解一下这个模式是什么意思,简单的说就是客户不需要出原本在宠物店需要买猫的钱去买一只,而是需要花一笔钱在养猫本身,需要在熊爸网上商城每月购买一次猫粮猫砂为期...https://www.jianshu.com/p/62650c41ec6c
9.大侠立志传棕熊赤睛领养方法大侠立志传棕熊可以骑乘吗大侠立志传里新加入的骑乘系统,玩家可以收集不同的宠物,有几个在领养后可以作为交通工具来使用,棕熊是可以骑乘的一个,具体领取条件可以看看文中说明。 大侠立志传棕熊赤睛领养方法 棕熊赤睛出现地点 1.位于断魂林右侧深处。 2.初见赤睛时选择“挑衅这只红眼棕熊”并单挑战胜其3次后,其逃跑至断魂林左侧深处,之后返回...https://www.efusc.com/gonglve/2219107.html