以太坊宠物店搭建教程

以太坊开发之搭建宠物商店 truffle的宠物商店是一个了解以太坊开发的一个很不错的例子. 跟着官方提供的demo与教程,可以完整的感受一下整个流程的开发. Ganache 为了环境需要,并且快速的在本地搭建一个私有链环境. truffle推出了一个可视化私有链客户端: Ganache下载地址 下载之后运行,你会看到这样一个界面: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ueP8hSnx-1600174507424)(https://static.alili.tech/images/Jiet 阅读详情

设置开发环境

在我们开始之前,有一些技术要求。请安装以下内容:

一旦我们安装了这些,我们只需要一个命令来安装Truffle:

npm install -g truffle

要验证Truffle是否已正确安装,请truffle version在终端上键入。如果发现错误,请确保将npm模块添加到路径中。

我们还将使用Ganache,一个用于以太坊开发的个人区块链,您可以使用它来部署合同,开发应用程序和运行测试。您可以通过导航到http://truffleframework.com/ganache并单击“下载”按钮来下载Ganache 。

 

Truffle在当前目录中初始化,因此首先在您选择的开发文件夹中创建一个目录,然后在其中移动。

mkdir pet-shop-tutorial 

cd pet-shop-tutor

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

al

truffle unbox命令解压缩此松露盒。

truffle unbox命令解压缩此松露盒。
truffle unbox pet-shop

truffle unbox pet-shop

目录结构

默认的Truffle目录结构包含以下内容:

  • contracts/:包含我们的智能合约的Solidity源文件。这里有一个重要的合同Migrations.sol,我们将在后面讨论。
  • migrations/:Truffle使用迁移系统来处理智能合约部署。迁移是一种额外的特殊智能合约,可以跟踪变化。
  • test/:包含我们的智能合约的JavaScript和Solidity测试
  • truffle.js:松露配置文件

该pet-shop松露盒有额外的文件和文件夹,但我们不会担心这些,只是还没有。

 

写出智能合约

我们将通过编写充当后端逻辑和存储的智能合约来启动我们的dapp。

1创建一个名为一个新的文件Adoption.sol在contracts/目录中。

2将以下内容添加到文件中:

pragma solidity ^0.4.17; 

contract Adoption {

 }

需要注意的事项:

  • 合同顶部注明了所需的最低Solidity版本:pragma solidity ^0.4.17;。该pragma命令表示“ 只有编译器关心的附加信息 ”,而插入符号(^)表示“ 指示的版本或更高 ”。
  • 与JavaScript或PHP一样,语句以分号结束。

变量设置

 

 

Solidity是一种静态类型语言,意味着必须定义字符串,整数和数组等数据类型。Solidity有一种称为地址的独特类型。地址是以太坊地址,存储为20字节值。以太坊区块链上的每个账户和智能合约都有一个地址,可以通过该地址发送和接收以太网。、

之后的下一行添加以下变量contract Adoption {

address[16] public adopters;

  •  

我们定义了一个变量:adopters。这是以太坊地址的数组。数组包含一种类型,可以具有固定或可变长度。在这种情况下,类型是address和长度是16。

你也会注意到adopters是公开的。公共变量具有自动getter方法,但在数组的情况下,需要一个键,并且只返回一个值。稍后,我们将编写一个函数来返回整个数组,以便在我们的UI中使用。

 

你的第一个功能:采用宠物

1在我们上面设置的变量声明之后,将以下函数添加到智能合约中。

// Adopting a pet 

function adopt(uint petId) public returns (uint)  { 

require(petId >= 0 && petId <= 15); 

adopters[petId] = msg.sender;  

return petId; 

}

需要注意的事项:

 

在Solidity中,必须指定函数参数和输出的类型。在这种情况下,我们将接受一个petId(整数)并返回一个整数。

 

我们正在检查以确保petId在我们的adopters阵列范围内。Solidity中的数组从0开始索引,因此ID值必须介于0到15之间。我们使用该require()语句确保ID在范围内。

 

如果ID在范围内,我们然后添加调用我们的adopters数组的地址。调用此函数的人或智能合约的地址表示为msg.sender。

 

最后,我们将petId提供的内容作为确认返回。

 

 

 

 

您的第二个功能:检索采用者

如上所述,数组getter仅从给定键返回单个值。我们的UI需要更新所有宠物采用状态,但进行16次API调用并不理想。所以我们下一步是编写一个函数来返回整个数组。

1在我们上面添加的getAdopters()函数之后,将以下函数添加到智能合约中adopt():

// Retrieving the adopters 

function getAdopters() public view returns (address[16]) {

 return adopters;

 }

既然adopters已经宣布,我们可以简单地归还它。请务必将返回类型(在本例中为类型adopters)指定为address[16]。

 

编译和迁移智能合约

现在我们已经编写了智能合约,接下来的步骤是编译和迁移它。

Truffle有一个内置的开发者控制台,我们称之为Truffle Develop,它生成一个开发区块链,我们可以使用它来测试部署合同。它还能够直接从控制台运行Truffle命令。在本教程中,我们将使用Truffle Develop来执行我们合同中的大部分操作。

Solidity是一种编译语言,这意味着我们需要将我们的Solidity编译为字节码,以便执行以太坊虚拟机(EVM)。可以把它想象成将人类可读的Solidity翻译成EVM理解的东西。

1在终端中,确保您位于包含dapp的目录的根目录中并键入:

truffle compile
您应该看到类似于以下内容的输出:
Compiling ./contracts/Migrations.sol... 
Compiling ./contracts/Adoption.sol... 
Writing artifacts to ./build/contracts

移民

现在我们已经成功编译了合同,是时候将它们迁移到区块链了!

迁移是一种部署脚本,用于更改应用程序合同的状态,将其从一个状态移动到另一个状态。对于第一次迁移,您可能只是部署新代码,但随着时间的推移,其他迁移可能会移动数据或用新代码替换合同。

您将在migrations/目录中看到一个JavaScript文件:1_initial_migration.js。这会处理部署Migrations.sol合同以观察后续智能合约迁移,并确保我们不会在未来双重迁移未更改的合同。

现在我们准备创建自己的迁移脚本了。

创建一个名为一个新的文件2_deploy_contracts.js在migrations/目录中。

将以下内容添加到2_deploy_contracts.js文件中:

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

在我们将合同迁移到区块链之前,我们需要运行区块链。对于本教程,我们将使用Ganache,一个用于以太坊开发的个人区块链,您可以使用它来部署合同,开发应用程序和运行测试。如果您还没有,请下载Ganache并双击该图标以启动该应用程序。这将生成在端口7545上本地运行的区块链。

回到我们的终端,将合同迁移到区块链。

truffle migrate

truffle migrate
您应该看到类似于以下内容的输出:
Using network 'development'. 
Running migration: 1_initial_migration.js Deploying Migrations... ... 0xcc1a5aea7c0a8257ba3ae366b83af2d257d73a5772e84393b0576065bf24aedf Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0 Saving successful migration to network... ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956 

您可以按顺序查看正在执行的迁移,然后是每个已部署合同的区块链地址。

在Ganache中,请注意区块链的状态已发生变化。现在,区块链显示了当前的块,0现在是4。此外,虽然第一个帐户最初有100个以太,但由于迁移的交易成本,它现在更低。我们稍后会详细讨论交易成本。

 

迁移后的Ganache

您现在已经编写了第一份智能合约,并将其部署到本地运行的区块链中。现在是时候与我们的智能合约进行互动,以确保它能够满足我们的需求。

测试智能合约

Truffle在智能合约测试方面非常灵活,因为测试可以用JavaScript或Solidity编写。在本教程中,我们将在Solidity中编写测试。

创建一个名为一个新的文件TestAdoption.sol在test/目录中。

将以下内容添加到TestAdoption.sol文件中:

pragma solidity ^0.4.17; import "truffle/Assert.sol"; import "truffle/DeployedAddresses.sol"; import "../contracts/Adoption.sol"; contract TestAdoption { Adoption adoption = Adoption(DeployedAddresses.Adoption()); }

我们用3个进口开始合同:

  • Assert.sol:给我们在测试中使用的各种断言。在测试中,断言检查诸如平等,不平等或空虚之类的事情,以便从我们的测试中返回通过/失败。以下是Truffle附带的断言的完整列表。
  • DeployedAddresses.sol:运行测试时,Truffle会将正在测试的合同的新实例部署到区块链。这个智能合约获得已部署合同的地址。
  • Adoption.sol:我们想要测试的智能合约。
  • 注意:前两个导入是指全局Truffle文件,而不是truffle目录。您不应该在truffle目录中看到test/目录。

    然后我们定义一个合约范围的变量,其中包含要测试的DeployedAddresses智能合约,调用智能合约来获取其地址。

     测试adopt()函数

    要测试该adopt()功能,请记住,一旦成功,它将返回给定的petId。通过比较adopt()我们传入的ID 的返回值,我们可以确保返回一个ID并且它是正确的。

    TestAdoption.sol声明后,在智能合约中添加以下功能Adoption:

     

    // Testing the adopt() function function testUserCanAdoptPet() public { uint returnedId = adoption.adopt(8); uint expected = 8; Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded."); }

     

    需要注意的事项:

  • 我们将之前声明的智能合约称为ID 8。
  • 然后我们也声明了预期值8。
  • 最后,我们传递实际值,期望值和失败消息(如果测试未通过则将其打印到控制台)Assert.equal()。

    测试单个宠物主人的检索

    记住上面公共变量有自动getter方法,我们可以检索上面的采用测试存储的地址。存储的数据将在我们的测试期间持续存在,因此我们对8上面的pet的采用可以通过其他测试来检索。

    在以前添加的函数下面添加此函数TestAdoption.sol。

    // Testing retrieval of a single pet's owner function testGetAdopterAddressByPetId() public { // Expected owner is this contract address expected = this; address adopter = adoption.adopters(8); Assert.equal(adopter, expected, "Owner of pet ID 8 should be recorded."); }

    由于TestAdoption合约将发送交易,我们将预期值设置为此,这是一个获得当前合约地址的合约范围变量。从那里我们就像上面所说的那样断言平等。

     测试所有宠物主人的检索

    由于数组只能在给定单个键的情况下返回单个值,因此我们为整个数组创建自己的getter。

    在以前添加的函数下面添加此函数TestAdoption.sol。

    // Testing retrieval of all pet owners function testGetAdopterAddressByPetIdInArray() public {

     // Expected owner is this contract 

    address expected = this; 

    // Store adopters in memory rather than contract's storage 

    address[16] memory adopters = adoption.getAdopters(); Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded."); 

    }

    请注意内存属性adopters。memory属性告诉Solidity将值临时存储在内存中,而不是将其保存到合同的存储中。由于adopters是一个数组,我们从第一次采用测试我们知道采用pet 8,我们将测试合同地址与8数组中的位置进行比较。

  •  

     

    运行测试

    回到终端,运行测试

    运行测试
    回到终端,运行测试:
    truffle test
    如果所有测试都通过,您将看到与此类似的控制台输出:
    Using network 'development'. Compiling ./contracts/Adoption.sol... Compiling ./test/TestAdoption.sol... Compiling truffle/Assert.sol... Compiling truffle/DeployedAddresses.sol... TestAdoption ✓ testUserCanAdoptPet (91ms) ✓ testGetAdopterAddressByPetId (70ms) ✓ testGetAdopterAddressByPetIdInArray (89ms) 3 passing (670ms)

     

 

创建用户界面以与智能合约进行交互<下一章>

 

以太坊开发------使用Truffle打造去中心化的宠物商店 pet-shop Box项目地址:http://truffleframework.com/boxes/pet-shop pet-shop Box官方教程:http://truffleframework.com/tutorials/pet-shop   本文在原文基于Truffle Box中的pet-shop Box代码,使用图形化的Ganache以及插件形式的以太坊轻客户端MetaMask,... 阅读详情

相关推荐

深入理解进程就绪状态:从CPU调度到系统性能排查实战

在操作系统进程管理中,就绪态是进程三态中最基础却常被忽略的一环。它指进程已获得运行所需资源,只欠CPU调度,与等待外部事件的阻塞态有本质区别。理解就绪状态,是读懂Load Average、排查系统卡顿的前提。CPU调度器通过时间片、优先级等策略从就绪队列中挑选进程,而多核场景下的负载均衡与上下文切换成本,直接影响服务吞吐量。实战中,通过top/ps识别R状态进程并结合负载均值判断CPU瓶颈,同时区分D状态、僵尸进程等异常现象,能快速定位性能问题。此外,nohup与systemd的进程守护机制,保障后台服务持

weixin_34005042的博客 358

以太坊:Truffle 和 MetaMask 配合

Truffle 和 MetaMask 配合 在浏览器中与智能合约进行交互之前,请确保合约已经编译及部署,并且我们是通过客户端JavaScript中的web3与合约进行交互。 Truffle 建议使用truffle-contract库,因为它使合约的交互更容易,更健壮。 有关这些主题的更多信息,包括使用`truffle-contract`,请查看的Truffle教程:宠物商店或Tutori...

跨链技术践行者 1万+

infura上部署以太坊智能合约

Infura是一个托管的以太坊节点集群,可以将你开发的以太坊智能合约发布到infura提供的节点上,而无需搭建自己的以太坊节点。 可能你还不了解Infura,但如果你使用过MetaMask,那么就已经接触过Infura了,因为它是MetaMask背后的以太坊供应商。 出于安全原因,Infura不管理你的私钥,这意味着Infura不能代表你签署交易。 但是,Infura可以通过使用HDW...

mongo_node的专栏 2003

开发实战|3步教你在以太坊上开一家宠物店(附流程+代码)

DApp是区块链技术落地应用的主要体现方式,通过将友好的交互设计与其背后的智能合约相结合,就能产生一个个区块链应用。 开发一个DApp需要哪些技能?需要几个人配合?其实,1个人分3步就可以完成一个DApp! 首先准备并部署开发环境 其次编写并部署智能合约 最后测试合约并创建交互 HiBlock区块链社区Bob在自己的摸索与实践中开发了一款基于以太坊的宠物店,开发成功后,总结自己的...

weixin_34406086的博客 481

infura上部署智能合约​及创建使用Truffle提供的宠物店dapp​

Infura是一个托管的以太坊节点集群,可以将你开发的以太坊智能合约发布到infura提供的节点上,而无需搭建自己的以太坊节点。Infura是一个托管的以太坊节点集群,可以将你开发的以太坊智能合约发布到infura提供的节点上,而无需搭建自己的以太坊节点。可能你还不了解Infura,但如果你使用过MetaMask,那么就已经接触过Infura了,因为它是MetaMask背后的以太坊供应商。出于安全原因,Infura不管理你的私钥,这意味着Infura不能代表你签署交易。

dgdwa的博客 417

大学生毕业设计-宠物电子商城DEMO

大学生毕业设计之宠物电子商城源代码提交,该项目使用了java,mybatis,spring,tomcat,mysql等技术来实现的一个web项目,适合大学生用于毕业设计源代码开发工作。

第二十三课 如何部署TRUFFLE智能合约到以太坊主网(以宠物商店为例)

#1,摘要 通过《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》 学习,大家掌握了一个DAPP的编程和以太坊私有测试环境调试,本文做进一步的技术深入学习。 【本文目标】 (1)采用INFURA配置的方式把智能合约部署到ROPSTEN测试网络; (2)采用INFURA配置的方式把智能合约部署到以太坊主网络; (3)了解采用.env配置的方式把助记词保存到本地防止泄露; 【前提条...

辉哥的技术投资路 1127

pet-shop:这是一个基于以太坊智能合约的宠物商店Dapp,使用truffle框架,Solidity编写,仅用于测试

pet-shop 这是一个基于以太坊智能合约的宠物商店Dapp,使用truffle框架,Solidity编写,仅用于测试 项目背景 Pete有一个宠物店,有16只宠物,他想开发一个去中心化应用,让大家来领养宠物。 在truffle box中,已经提供了pet-shop的网站部分的代码,我们只需要编写合约及交互部分。 环境搭建 安装Node 安装 Truffle : npm install -g truffle 安装Ganache Ganache(或Ganache CLI)已经取代了 testrpc。 启动服务 npm run dev 会自动打开浏览器显示我们的dapp,如本文的第一张图。 现在领养一直宠物看看,当我们点击Adopt时,MetaMask会提示我们交易的确认 点击Submit确认后,就可以看到成功领养了这次宠物。 在MetaMask中,也可以看到交易的清单: 好了,恭喜你,即将

如何部署TRUFFLE智能合约到以太坊主网(以宠物商店为例)

1 摘要 通过开发实战|3步教你在以太坊上开一家宠物店(附流程+代码)学习,大家掌握了一个DAPP的编程和以太坊私有测试环境调试,本文做进一步的技术深入学习。 【本文目标】 (1)采用INFURA配置的方式把智能合约部署到ROPSTEN测试网络; (2)采用INFURA配置的方式把智能合约部署到以太坊主网络; (3)了解采用.env配置的方式把助记词保存到本地防止泄露; 【前提条件】 本文假设你...

HiBlock的博客 1662

猫咪宠物店网站模板.rar

猫咪宠物店网站模板,页面自适应分辨率大小,兼容PC端和手机移动端,全套模板,包含首页、关于我们、服务、图片展示、博客、联系我们等网站模板页面。

dPetShop:以Truffle在区块链上构建的去中心化以太坊宠物店

宠物商店 通过Truffle在以太坊区块链之上构建的去中心化PetShop。 :warning: 注意:由于此dApp是为个人测试而制作的,因此您可能将无法运行。 要开发自己的内容,请访问Truffle的。 要求: Node.js v8 + LTS和npm(Node附带) 吉特 Ganache是​​用于以太坊开发的个人区块链,可用于部署合同,开发应用程序和运行测试。 您可以通过导航到并单击“下载”按钮来下载Ganache。 MetaMask(用于创建和操作您的自定义RPC)

以太坊(8)truffle ganache dapp 宠物店(pet-shot)--mac

本章内容:通过truffle ganache实现dapp应用——宠物店;                     官网的操作步骤:http://truffleframework.com/tutorials/pet-shop准备条件:     1. truffle     2. ganache     3.  MetaMask         4. lite-server ( 前面我没有介绍,可以百...

xiliangMa的博客 1932

SAP SD模块进阶:VA31和VA01底层竟是同一个BAPI?揭秘销售单据创建的统一逻辑

本文深入解析SAP SD模块中VA31和VA01的底层统一架构设计,揭示两者如何通过同一个BAPI `SD_SALESDOCUMENT_CREATE`实现销售单据创建。通过ABAP调试和参数化设计分析,展示了SAP如何利用单据类型(doc_type)等关键字段实现业务逻辑复用,为开发者提供配置化设计的重要启示。

weixin_30561177的博客 243

[币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识。 本文通过实例教大家来开发去中心化应用,应用效果如图: 项目背景 Pete有一个宠物店,有16只宠物,他想开发一个去中心化应用,让大家来领养宠物。在truffle box中,已经提供了pet-shop的网站部分的代码,我...

weixin_30312659的博客 434

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2922

别再纠结选哪个向量库了!我用Spring AI + Redis Stack 7.2,5分钟搞定企业知识库RAG原型

本文介绍了如何利用Spring AI和Redis Stack 7.2快速构建企业级RAG应用,解决向量数据库选型难题。Redis Stack 7.2集成了RediSearch模块,支持向量相似性搜索,具备高性能、低成本、零学习成本等优势,特别适合中小团队快速搭建知识库系统。通过实战代码示例,展示了从环境准备到核心功能实现的完整流程。

weixin_29061041的博客 270

使用Truffle和infura部署以太坊合约

使用Truffle和infura部署以太坊合约 缸中之脑 百家号04-2313:33 Infura是一个托管的以太坊节点集群,可以将你开发的以太坊智能合约部署到infura提供的节点上,而无需搭建自己的以太坊节点。   可能你还不了解Infura,但如果你使用过MetaMask,那么就已经接触过Infura了,因为它是MetaMask背后的以太坊供应商。 出于安全原因,Infu...

jfkidear的专栏 677

头歌操作系统2023春季课堂练习2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少?本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?2.此时 bochs 虚拟机输出的 0/1 字符串是什么?(只填写数字,不填写空格!根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。

weixin_64821608的博客 8128

逸学区块链【Truffle】宠物商店教程

官网教学:https://www.trufflesuite.com/tutorial。

m0_59337285的博客 667

手把手教你用FPGA解析AD9680的JESD204B数据流(附Verilog代码)

本文详细介绍了如何利用FPGA解析AD9680的JESD204B数据流,包括协议核心机制、硬件平台搭建、Verilog代码实现及调试技巧。通过实战案例和代码示例,帮助工程师快速掌握高速ADC数据采集与处理技术,提升系统性能。

weixin_33640562的博客 372

开源分享:苹果群控手机源代码解析与实战

本文介绍了苹果设备群控的基本原理和实现方法,重点解析了基于Python+Appium的群控系统构建。主要内容包括:1)设备连接管理技术(USB/Wi-Fi);2)自动化控制方式(WDA/AppleScript/Appium);3)实战演示了通过Python脚本实现多设备同时控制,涵盖环境配置、代码解析和功能说明;4)提出了多线程、图像识别等优化方向。文章为开发者提供了快速上手的群控方案,适用于自动化测试、批量管理等场景,并推荐了相关开源项目参考。

2403_88540309的博客 1344
上一篇: 解析apk 版本号,包名,内部版本号. 全.
Nirvana--
博客等级 码龄10年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值