一步步教你开发部署第一个去中心化应用(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.第二本书(课后题)懒得写了准备都写这一个里面了1、类图 随意写个类 然后new model 选个model新建 然后直接把写好的类拖进model 自动生成类图 2、领养宠物并输出宠物信息 package com.opp.unit3.demo8; /** * Created by 渣渣飞 on 2018/6/11 20:12 * 星期一 * FDF */ public class Dog { ...https://www.cnblogs.com/yunfeioliver/p/9169348.html
2.美国留学,领养宠物狗的方式有哪些?美国宠物领养攻略TestDaily...Rescue可以保证在你领养宠物后,如果宠物出现了疾病或者其他问题致使你无法继续收养时,你可以退还给他们,由他们会去救助,从而最大程度避免了再次遗弃的问题。有些Rescue会有自己的官网,也有instagram和facebook,你可以通过网络平台了解等待收养的动物的信息。 以上所说的三种shelter,你都可以通过下方的网址进行查询:网站...https://www.testdaily.cn/48314/
3.宠物领养协议书(通用版)(30页)2)领养人在领养动物前有权要求甲方提供甲方当前已知的所领养动物的真实状况,并进行初步观察与接触。 3)领养人必须为领养动物提供适合的食物(天然猫粮),提供洁净的饮用水,做到科学喂养。 4)领养人须在室内提供适当的活动空间,进行家庭喂养,并保证领养动物的安全。 5)领养人在必要时为领养动物提供必要的医疗措施,宠物...https://max.book118.com/html/2021/0826/7056120130003165.shtm
4.图免费领养狗狗文登文登区宠物文登之窗信息详情 出生30天左右的狗狗,好心人免费领养 联系方式 联系人:于 电话:18763194206 小提示:联系时告诉对方是在"文登之窗-文登信息港"看到的信息,将会得到更多的信任! 免责声明:文登之窗网站(http://www.whwd.com)提醒您:本站所有信息由用户自行发布,其真实 性、准确性和合法性由发布人负责。文登之窗网站...http://gqxx.whwd.com/information-id-2497508.html
1.实现领养宠物实现领养宠物功能编写宠物类Dog和Penguin创建宠物...为了实现领养宠物的功能,我们可以分别创建两个类,Dog(狗)和Penguin(企鹅),每个类都有基本的属性和方法。然后通过实例化这两个类来代表具体的宠物,并在用户请求领养时获取并输出相关信息。 // 宠物类DogclassDog{privateStringname;privateintage;publicDog(Stringname,intage){this.name = name;this.age = age; ...https://wenku.csdn.net/answer/6m79pcwkj8
2.领养宠物并打印宠物信息java代码宠物领养小程序源码领养宠物并打印宠物信息java代码 宠物领养小程序源码,【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等https://blog.51cto.com/u_14499/6886552
3.宠物领养网站源码,专注收养表单HTML代码,简洁高效,仅输出关键文字...宠物领养网站源码,提供简洁高效的宠物收养表单html代码。用户可通过填写基本信息,轻松提交领养申请。我们致力于打造一个安全、便捷的宠物领养平台,让每只宠物都能找到温暖的家。 5.00点 演示地址查看 后台程序无后台 技术支持无 发布者°sunshine 有效期永久 https://www.moyublog.com/codes/24772.html
4.宠物领养简单版协议书(通用9篇)3) 领养人必须为领养动物提供适合的食物(天然猫粮),提供洁净的饮用水,做到科学喂养。 4) 领养人须在室内提供适当的活动空间, 进行家庭喂养,并保证领养动物的安全。 5) 领养人在必要时为领养动物提供必要的医疗措施,宠物若有生病,领养人须做到不离不弃,并带宠物及时去正规宠物医院接受治疗。 https://www.ruiwen.com/xieyishu/4622303.html
5.宠物“免费领养”骗局:隐藏在爱心背后的变味“强卖”—新京报近年来,随着人们对宠物认知观念的改变,“以领养代替购买”的方式逐渐在流浪动物的救助中得到推崇,但某些隐藏在宠物“免费领养”背后的骗局也慢慢突破着爱心人士的底线,层层加价、捆绑消费甚或诈骗犯罪等一系列套路让“免费送养宠物”变了味儿,最后成了“强卖”。 https://www.bjnews.com.cn/detail/1670426170169094.html
6.全国十大宠物领养平台领养猫狗的平台推荐可领养宠物的app有哪些宠安家是隶属于北京爱它动物保护基金会的正规领养猫狗的平台,是其重点推出、打造和扶持的慈善品牌之一,曾在2022中国公益慈善项目大赛上,荣获“三星优质项目”称号,亦曾登上第二届北京慈善文化创享会的舞台。宠安家已开通官方微博账户,不定期发布宠物领养信息。宠安家是当下最好的宠物领养平台之一。 https://www.maigoo.com/citiao/list_105163.html
7.Q宠网宠物领养宠物资讯平台Q宠网是国内知名的宠物资讯平台,服务每一位喜爱动物的您,为您提供全面的宠物资讯,无论是宠物狗、宠物猫、兔子、水族或者爬宠类,我们提供您需要的养宠知识,养宠新手、宠物喂养、宠物训练和宠物领养等丰富宠物资讯。https://www.qchongwang.net/
8.宠物领养模式APP原生系统开发解决方案宠物领养模式APP的开发旨在为用户提供一个便捷、全面的宠物领养服务平台。以下是该类型APP的主要功能介绍: 一、宠物信息展示 详细宠物资料:提供宠物的种类、年龄、健康状况、性格描述等详细信息,帮助用户全面了解宠物的基本情况。 领养信息:展示宠物的领养状态、领养条件以及领养流程,为用户提供清晰的领养指南。 二、领养...http://m.trustexporter.com/m21-d1675541.htm
9.全套源码教程基于SpringBoot+MyBatis+Vue的流浪动物救助网站...管理用户个人信息,包括用户名、个人介绍等信息。 动物领养/捐赠管理 对于用户已经提交的动物领养或捐赠申请,用户可以在这里看到相关信息。 动物领养审核管理 对于用户在界面中提交的关于宠物领养的申请,可以在这里看到审核流程、管理动物领养申请或撤销。 论坛管理 ...https://cloud.tencent.com/developer/article/2421091