一步步教你开发部署第一个去中心化应用(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.撸宠:如何提高领养成功率【案例背景及需求】 广州噜宠网络科技有限公司是国内领先的宠物生活消费服务平台。我们的支付宝小程序经过一年多的发展,已经有200多万的注册用户。宠物领养是我们比较重要的业务板块,平台基于芝麻信用的账户体系,通过芝麻证展示送(领)养双方过往的信用记录,让用户领养更安心。 https://opendocs.alipay.com/b/04onuk
1.宠物托养项目创新创业计划书(通用11篇)宠物托养项目创新创业计划书(通用11篇) 在当今社会生活中,创业计划书的使用频率逐渐增多,创业计划书是创业者计划创立的业务的书面摘要。想学习拟定创业计划书却不知道该请教谁?以下是小编为大家整理的宠物托养项目创新创业计划书,供大家参考借鉴,希望可以帮助到有需要的朋友。 宠物托养项目创新创业计划书 1 一、...https://www.yjbys.com/chuangye/ziliao/chuangyejihuashu/633317.html
2.宠物寄养所创新创业计划书(精选5篇)宠物寄养所是一个充满商机的行业,我们将通过提供高品质的服务、舒适的环境和专业的护理人员,让宠物主人放心地将自己的宠物寄养在我们这里,从而赢得市场份额,实现企业的快速发展。 宠物寄养所创新创业计划书2 一、创业背景 随着人们生活水平的提高,越来越多的人选择养宠物作为家庭的一部分。然而,随之而来的问题是,当主...https://www.ruiwen.com/word/chongwujiyangsuochuangxincyjhs.html
3.2024springboot源码宠物领养平台课题开发背景目的意义研究思...七、项目交流 背景:随着人们生活水平的提高和对宠物养护意识的增强,宠物领养需求逐渐增加。然而,传统的宠物领养方式存在信息不对称、流程复杂等问题,因此建立一个宠物领养平台具有重要的现实意义。 目的:本课题旨在建立一个宠物领养平台,提供宠物领养信息发布、匹配推荐、领养流程指导等服务,方便有意领养宠物的人们找到合适...https://blog.csdn.net/u013374864/article/details/134891785
4.创基金在行动PurrfectPair小伴宠物互助社群ICCI上海交大参与"小伴"项目,我深刻体会到了团队文化对于项目成功的重要性。我们团队成员虽然来自不同的背景,但我们都对小动物有着深厚的感情,致力于打造一个更加宠物友好的文化社区,这种共同的价值观成为了我们团队文化的核心。通过共同的努力和协作,我们不仅为宠物提供了优质的喂养服务,团队成员之间也建立了深厚的友谊,让我更加...https://icci.sjtu.edu.cn/news/view/1714
5.如何用设计改善“人宠关系”?所有的领养室都设有天窗和互动式屏幕,家一般的装修风格为人与动物提供了一个温馨的氛围,人类和动物们还可以在领养室内上演一出命定的相遇,帮助他们更好地认识和了解彼此。 宠物商店与犬类训练室 黑镇市动物收容中心:为动物和员工的福祉而设计 黑镇市动物收容中心(BARC)位于西悉尼绿地公园附近,是南半球同类建筑中最...https://www.huxiu.com/article/2270217.html
6.2022宠物店syb创业计划书(通用9篇)而在花鸟市场,经营较成气候,货源流通量很大,而且成本很低,但产品售价相对较低,竞争激烈,大学校花校草,也适合以产品销售为主,不宜做宠物美容和寄养。如果选择开在中高档的居民小区里,那么能够考虑用品销售、美容和寄养等全项目经营。 此外,鉴于宠物店的消费群体比较特殊,宠物店的选址要留意几个细节地方的问题。首先...https://www.oh100.com/kaidian/4351570.html
7.上海大型购物中心排名(上海最顶级的购物中心)再譬如「有点急事!」的市集项目,整个市集活动内容的丰富程度、热门程度、品牌尺度、内容深度都藏着相当多的惊喜... 拿宠物举例,市集就把犬舍/猫舍、宠物基因检测、宠物旧衣改造、萌宠领养等内容全部装了进来;再比如运动,包括陆冲、飞盘挑战赛、乒乒乓乓!创意活动+运动挑战、疗愈冥想等在内的时下最热门的「年轻力...https://www.yunyingyi.com/sy/180536.html
8.宠物店背景宠物店背景图片宠物店背景素材觅知网为您找到124个原创宠物店背景设计图片,包括宠物店背景图片,宠物店背景素材,宠物店背景海报,宠物店背景,宠物店背景模板源文件下载服务,包含PSD、PNG、JPG、AI、CDR等格式素材,更多关于宠物店背景素材、图片、海报、背景、插画、配图、矢量、UI、PS、免抠,模板https://www.51miz.com/so-sucai/2772602.html
9.领养代替购买!读特客户端上线“百宠回家”公益活动在此背景下,为更好地打破宠物领养信息壁垒,照亮更多毛孩子的归家之路,读特客户端最新上线“百宠回家”公益活动。该项目以“带100只流浪动物回家”为口号,通过流浪动物信息一站式集纳,借助媒体平台优势,为更多公益人士疏通送养渠道,也为更多爱心领养者提供透明、真实的领养信息获取平台。https://m.thepaper.cn/newsDetail_forward_28788079
10.玛氏宠物推出线上领养中心,温暖生命为宠物创造美好世界美通社PR北京2022年5月4日 /美通社/ -- 玛氏宠物旗下会员社交平台正式推出玛氏宠享会领养中心,秉承“为宠物创造美好世界”的愿景,建设链接宠物家长、爱心人士和待领养宠物的桥梁,积极推动领养公益的发展。玛氏宠物营养新任中国总经理任嘉实(Ganesh Ramani)表示:“玛氏宠享会领养中心的上线是玛氏在中国为宠物创造美好世界的一个...https://www.prnasia.com/story/360142-1.shtml
11.java宠物管理系统最简单的宠物管理系统设计本论文系统地描绘了整个网上宠物管理系统的设计与实现,主要实现的功能有以下几点:管理员;首页、个人中心、宠物分类管理、商品分类管理、宠物用品管理、宠物商店管理、宠物领养管理、用户管理、宠物寄存管理、用户领养管理、宠物挂失管理、论坛管理、管理员管理、系统管理、订单管理,前台首页;首页、宠物用品、宠物商店、宠物领...https://blog.51cto.com/u_16099261/7443186
12.保护流浪动物策划书(精选12篇)三、活动背景 生命,对于地球上所有的生物来说都是最宝贵的,但是很多物种却在恶劣的环境中,艰难的生存着,无处栖身,孤独流浪,甚至遭到人类的无情虐待和杀害,我们希望通过此次活动为更多的小动物们带去关心和爱护,让它们的生命不再受到威胁,从此远离折磨和迫害,同时呼吁更多而人曾加爱惜小生命的意识,参与到关爱流浪小...https://www.360wenmi.com/f/file060e1lde.html
13.基于java的仓库环境智能调节设计与实现(项目源码+数据库+源代码...基于springboot+vue的宠物领养系统 立即获取 查看详情 SpringBoot项目 源码+数据库+论文 基于springboot+vue的智慧图书管理系统 立即获取 查看详情 SpringBoot项目 源码+数据库+论文 基于springboot+vue的华强北商城二手手机管理系统 立即获取 查看详情 SpringBoot项目 源码+...https://cs-work.com/article/56570