3、宠物商店智能合约实战(truffle智能合约项目实战)

3、宠物商店智能合约实战(truffle智能合约项目实战)

  • 1-宠物商店环境搭建、运行
  • 2-webjs与宠物逻辑实现
  • 3-领养智能合约初始化
  • 4-宠物领养实现
  • 5-更新宠物领养状态

1-宠物商店环境搭建、运行

https://www.trufflesuite.com/boxes/pet-shop

这个还是不行

在这里插入图片描述

或者在github下载相对应的项目

直接使用课件源码

在这里插入图片描述

执行前修改jQuery及端口等

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本修改已经完成

连接ganache的私有链,再编译部署

先打开ganache
在这里插入图片描述

truffle develop
truffle(develop)> compiletruffle(develop)> deploy

在这里插入图片描述

Npm run dev

在这里插入图片描述
在这里插入图片描述

后续对应按钮,一旦领养成功就存到区块链上

所有的客户端都能

唯一要分析的就是App.js

在这里插入图片描述

具体的一些逻辑分析没有记录,可以看视频

jQuery的解决方案,需要模板才能

另一个react解决的方案

2-webjs与宠物逻辑实现

实现领养功能,及用户点击领养时,用户与狗狗就建立关系,关系要存到合约并不能被篡改

点击领养按钮可以

谁调用此函数就获得当前调用者的地址,而且地址在合约中是唯一的

领养者的地址可以知道,但宠物如何获取

总共16个宠物,并且获得唯一编号
在这里插入图片描述

能否创建一个数组用来存储领养者与宠物的关联信息
在这里插入图片描述

领养的合约代码如下

pragma solidity ^0.5.0;contract Adoption {// 创建一个固定数组,用来存储领养者与宠物的关联信息//宠物只能被领养一次,即一个宠物对应一个用户地址address[16] public adopters;   // storage// 完成宠物领养功能function adopt(uint petId) public returns (uint){// 判断当前petId的合法性require(petId >=0 && petId <=15);// 存储当前领养人的地址信息adopters[petId] = msg.sender;// 返回被领养的petIDreturn petId;}// 返回已领养者的信息 (只读) view 只读  pure 不读写function getAdopters() public view returns (address[16] memory){return adopters;}
}

数组、结构体、映射都是引用类型
数据的存储位置,全局变量默认storyge是部署到合约中的

引用类型的话默认memory并且指定

可以尝试先在remix测试编译,编译成功后再在本地进行编译

类型相同之间赋值是指针间的
类型不同之间赋值是复制有副本的
在这里插入图片描述

initWeb3: async function() {/** Replace me...*///如果web3不是undefined,说明上下文有web3对象,直接获取web3.currentProvider链if(typeof web3 !== 'undefined'){console.log('if......');App.web3Provider = web3.currentProvider;}else{//如果当前没有,则重新new个web3对象,链接到私有链console.log('else......');App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:7545')web3 = new Web3(App.web3Provider);  //创建一个web3对象}return App.initContract();},

在这里插入图片描述

Truffle develop
Deploy	

未打开ganache,直接部署到开发者模式的私有链

Npm run dev

使用chrome浏览器,无metamask,可以直接运行,看控制台执行到哪里

在这里插入图片描述

3-领养智能合约初始化

接着上节课完成合约的初始化

第一步是创建web3对象,完成

合约的初始化,变量已经在前面设置了
在这里插入图片描述

写法不是很熟悉,典型的nodejs写法

Nodejs不仅仅是js的运行环境还是升级版

有案例

如果将变量设置为json格式{,后续可以任意的向json变量中添加键和值}(视频有讲解)

web3Provider保存的公有链或者私有链地址,同一时间只能有一个,默认空
Constracts为json对象,后续可能有多个合约

此种方式可存储

第二步,初始化合约

上一个代币项目要通过jQuery获取编译好的json格式,然后通过TruffleContract构建智能合约
在这里插入图片描述

获取合约是json文件,将对象data给第一个AdoptionArtifact

Js文件导入到了index.html中,越在后面的js就可以使用上一个js声明的变量
在这里插入图片描述

 initContract: function() {// jquery $.getJSON用来获取json格式的文件$.getJSON('Adoption.json', function(data) {// Get the necessary contract artifact file and instantiate it with truffle-contract.var AdoptionArtifact = data;// 获取json文件中的合约名词App.contracts.Adoption = TruffleContract(AdoptionArtifact);// 配置合约关联的私有链App.contracts.Adoption.setProvider(App.web3Provider);// Use our contract to retieve and mark the adopted pets.return App.markAdopted();});console.info('initContract......');return App.bindEvents();},

宠物领养有没有初始化的需求,有

如一个账户领养了一个宠物,另一个账户在另一个页面应该看到已有的狗已经被设置成领养状态了

哪些狗被领养了,领养的按钮就使用不了了

//初始化完毕显示当前哪些狗被领养//标记宠物的领养状态//实现了领养功能,大量使用了jQuery的功能// 实现了给页面领养按钮的事件绑定bindEvents: function() {// 给页面所有的领养按钮注册了click事件$(document).on('click', '.btn-adopt', App.handleAdopt);},

当全部的无钱包模式开发完成的完整运行如下
前面进行cmd的develop开发者模式部署合约等消耗第一个账户钱

我们在chrome浏览器打开,直接点击领养,会成功,内部已经消耗了gas
消耗的是默认的第一个账户

在这里插入图片描述

在控制台可以看到,查询余额明显变少了,所以前面的代币转账也是消耗的账户的gas

只是一切在内部发生,没有metamask,无法明显显示,若安装metamask就会是否确认转钱的

在这里插入图片描述

4-宠物领养实现

上节完成智能合约json文件加载,并设置私有链信息

又调用了一个领养按钮事件绑定

Class样式,

每个宠物有个adopt

  // 实现了给页面领养按钮的事件绑定bindEvents: function() {// 给页面所有的领养按钮注册了click事件$(document).on('click', '.btn-adopt', App.handleAdopt);},

点击那个按钮就获取那个按钮的对象

Data-id属性很好用
在这里插入图片描述

所以html4

Id属性

获取当前单机的按钮的宠物的id
在按钮事件中进行合约的实例化,以此调用合约函数
老版本的api和新版本的api差别很大

handleAdopt: function(event) {// 获取当前单击按钮对应宠物的idvar petId = parseInt($(event.target).data('id'));console.info('宠物的ID为:' + petId);// 此变量用来存储实例化的合约var adoptionInstance;// 由于当前采用的是truffle 4.x + web3 0.x的版本,因此选择合适API查看web3.eth.getAccounts(function(error, accounts) {// 异步调用:if (error) {console.log(error);}// 拿到测试的第一个账户var account = accounts[0];console.info('account --->' + account);web3.eth.defaultAccount = account;// 通过合约名词实例化智能合约, 还可以通过ABI + address进行实例化App.contracts.Adoption.deployed().then(function(instance) {// 获取已经实例化的智能合约对象adoptionInstance = instance;return adoptionInstance.adopt(petId);}).then(function(result) {console.info('result --->' + result);// 调用标记宠物状态函数return App.markAdopted();}).catch(function(err) {console.log(err.message);});});}};

领养成功才会标记宠物

注意部署时迁移文件的,判断合约是否全部被部署

在代码中获取了第一个账户的地址,是内部部署的

选择哪个账户部署合约或者调用

在目前没有钱包的时候使用默认第一个账户的,当未指定账户地址就使用
web3.eth.defaultAccount进行

当点击领养就会调用默认的地址

5-更新宠物领养状态

前面合约实例化和调用合约函数

给宠物设计标记避免重复领养

标记函数的 调用合约函数前对合约实例化

在这里插入图片描述

地址总共40个长度

 // 标记宠物的领养状态markAdopted: function(adopters, account) {console.info('markAdopted......');var adoptionInstance;// 1: 根据宠物的状态来修改按钮App.contracts.Adoption.deployed().then(function(instance) {// 获取已经实例化的智能合约对象adoptionInstance = instance;// 返回 address[16] public adopters;return adoptionInstance.getAdopters();}).then(function(adopters) {	//adopters = adoptionInstance.getAdopters();console.log(adopters.length);for(i=0;i<adopters.length;i++){// 如果当前宠物被领养则地址不为 address(0x0)if(adopters[i]!='0x0000000000000000000000000000000000000000'){// 当前宠物已经被领养,通过jquery设置按钮状态为不可见$('.panel-pet').eq(i).find('button').text('success').attr('disabled',true);}}}).catch(function(err) {console.log(err.message);});},

如果当前交易量很大,很多交易会迟迟得不到处理
交易执行的函数
在这里插入图片描述

当关掉develop时,无法调用合约
当关掉develop重新打开,但未部署时也无法调用合约

新的私有链无智能合约,这个cmd的develop开发者模式既不直观也不能保存之前的结果

我们可以使用ganache可以直观的看到信息

快速打开ganache
在这里插入图片描述

E:\乐轻至上\Truffle智能合约项目实战上课代码、资源下载\上课代码、资源下载\pet-shop (命令测试版- 缺省账户领养)\pet-shop>

Truffle developDeployNpm run dev

在这里插入图片描述

两个合约创建,两个构造函数的调用

点击领养按钮

在这里插入图片描述

接下来保存我们之前快速启动的私有链
在这里插入图片描述

在这里插入图片描述

然后关闭再次启动
在这里插入图片描述

直接点击workspace中的那个就进入了

可以直接进入之前保存的链上,数据也都在

再次刷新html信息也都在

我们可以保存此私有链,下次再启动就可以选择之前的私有链,一启动页面,之前的领养也有记录

下节课开始安装使用领养钱包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开发实战】QT5 + OpenCV4 开发环境配置应用演示

前言 作为深度学习算法工程师&#xff0c;必须要掌握应用开发技能吗&#xff1f;搞工程肯定是必须要会界面开发&#xff0c;QT就是一个很不错的选择。本文以QT5.15 OpenCV4.8 OpenVINO2023为例&#xff0c;搭建应用开发环境&#xff0c;演示深度学习模型的QT应用案例。 开发…

数学建模~~~SPSS相关和回归分析

目录 1.双变量相关分析 1.1理论基础 1.2简单散点图的绘制介绍 1.3相关性分析 1.4分析相关性结果 2.简单线性回归分析 2.1简单概括 2.2分析过程 2.3结果分析 3.曲线回归分析 3.1问题介绍 3.2分析过程 3.3结果分析 1.双变量相关分析 1.1理论基础 双变量相关分析并不…

关于Linux的面试题(实时更新中~)

一、软连接和硬连接的区别&#xff1a; 软连接创建方式 ln -s 被链接文件 链接文件 &#xff08;1&#xff09;软链接是一个链接文件&#xff1b; &#xff08;2&#xff09;软链接有着自己的 inode 号&#xff08;文件编号&#xff09;&#xff1b; &#xff08;3&#…

趣谈linux操作系统 9 网络系统-读书笔记

文章目录 网络协议栈基础知识回顾网络分层网络分层的目的各层作用简介延伸-ip地址,有类,无类,cidr socket实现分析tcp/udp回顾socket编程回顾TCP编程回顾UDP编程回顾差异 socket相关接口实现浅析sokcet实现解析创建socket的三个参数socket函数定义及其参数创建socket结构体关联…

最新CSM客户成功 OKR 案例:以指导、激励和调整您的团队

客户是任何企业的命脉&#xff0c;而客户服务是与客户接触的第一站&#xff0c;是实现目标和扩大组织规模是以保留客户和追加销售为前提的。 客户成功CSM是一种商业方法&#xff0c;确保客户在使用你的产品/服务时达到他们想要的结果。客户成功是以关系为中心的客户管理&#…

实战篇(十):使用Processing创建可爱花朵:实现随机位置、大小和颜色的花朵

使用Processing创建可爱花朵 0.效果预览1. 引言2. 设置Processing环境3. 创建花朵类4. 实现花瓣绘制5. 绘制可爱的笑脸6. 鼠标点击生成花朵7. 完整代码8. 总结与扩展0.效果预览 在本教程中,我们将使用Processing编程语言来创建一个可爱的花朵生成器。通过封装花朵为一个类,并…

最小化研发过程质量管理,质量与效率之间的平衡

前言 是不是流程约束越多&#xff0c;效率越低&#xff1f;不然&#xff0c;如果因为缺了流程约束&#xff0c;而搞砸了质量&#xff0c;那么一切都将归零。 所以找到一套适合自身的研发过程质量管理方式&#xff0c;在质量与效率之间趋向平衡是每个研发团队所必须要考虑的事…

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro&#xff08;简称Pr&#xff09;是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用&#xff0c;包括Windows和Mac系统&#xff0c;并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

go语言Gin框架的学习路线(七)

GORM入门(基于七米老师) 目录 GORM入门 安装 连接数据库 连接MySQL 连接PostgreSQL 连接Sqlite3 连接SQL Server 我们搞一个连接MySQL的例子 创建数据库 GORM操作MySQL GORM是一个流行的Go语言ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种方…

Haproxy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

IAR环境下STM32+IAP方案的实现

--基于STM32F103ZET6的UART通讯实现 一、什么是IAP&#xff0c;为什么要IAP IAP即为In Application Programming(在应用中编程)&#xff0c;一般情况下&#xff0c;以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了&#xff0c;如果在设备使…

【C++】 string类的模拟实现

目录 一、我们先创建三个文件分别为 String.h&#xff08;声明&#xff09;、String.cpp&#xff08;定义&#xff09;、teat.cpp&#xff08;测试&#xff09; 二、成员函数 构造函数与析构函数 &#x1f31f;string() &#x1f31f;string(const char* str) &#x1f…

YOLO 模型基础入门及官方示例演示

文章目录 Github官网简介模式数据集Python 环境Conda 环境Docker 环境部署 CPU 版本官方 CLI 示例官方 Python 示例 任务目标检测姿势估计图像分类 Ultralytics HUB视频流示例 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttp…

python-网络并发模型

3. 网络并发模型 3.1 网络并发模型概述 什么是网络并发 在实际工作中&#xff0c;一个服务端程序往往要应对多个客户端同时发起访问的情况。如果让服务端程序能够更好的同时满足更多客户端网络请求的情形&#xff0c;这就是并发网络模型。 循环网络模型问题 循环网络模型只能…

跨平台WPF音乐商店应用程序

目录 一 简介 二 设计思路 三 源码 一 简介 支持在线检索音乐&#xff0c;支持实时浏览当前收藏的音乐及音乐数据的持久化。 二 设计思路 采用MVVM架构&#xff0c;前后端分离&#xff0c;子界面弹出始终位于主界面的中心。 三 源码 视窗引导启动源码&#xff1a; namesp…

知名在线市场 Etsy 允许在其平台上销售 AI 艺术品,但有条件限制|TodayAI

近日&#xff0c;以手工和复古商品著称的在线市场 Etsy 宣布&#xff0c;将允许在其平台上销售 AI 生成的艺术品。这一举措引发了广泛关注和争议。尽管 Etsy 正在接受 AI 艺术的潮流&#xff0c;但平台对这一类商品的销售设置了一些限制。 根据 Etsy 新发布的政策&#xff0c;…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动TFT大屏_I2C_HW参考代码(v1.3) 硬件I2C方式

本篇介绍单片机使用硬件I2C方式控制RA8889驱动彩屏。 提供STC8H8K64U和STC8051U34K64的参考代码。 【硬件部份】STC8H8K64U/STC8051U34K64 RA8889开发板 7寸TFT 800x480 1. 实物连接图&#xff1a;STC8H8K64URA8889开发板&#xff0c;使用P2口I2C接口&#xff1a; 2.实物连…

【QT】信号与槽(概述、使用、自定义、连接方式、其他说明)

一、信号和槽概述 在 Qt 中&#xff0c;用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是一个事件&#xff0c;“用户关闭窗口” 也是一个事件。每个事件都会发出一个信号&#xff0c;例如用户点击按钮会发出 “按钮被点击” 的信号&#xff0c;用户关闭窗口…

windows edge自带的pdf分割工具(功能)

WPS分割pdf得会员&#xff0c;要充值&#xff01;网上一顿乱找&#xff0c;发现最简单&#xff0c;最好用&#xff0c;免费的还是回到Windows。 Windows上直接在edge浏览器打开PDF&#xff0c;点击 打印 按钮,页面下选择对应页数 打印机 选择 另存为PDF&#xff0c;然后保存就…

记录一下在Hyper-v中动态磁盘在Ubuntu中不完全用到的问题(扩展根目录)

在之前给hyper虚拟机的Ubuntu分配磁盘有20G&#xff1b; 后来在Ubuntu中查看磁盘发现有一个分区没用到&#xff1a; 贴的图片是完成扩展后的 之前这里是10G&#xff0c;然后有个dev/sda4的分区&#xff0c;也是10G&#xff0c;Type是Microsoft Basic Data&#xff1b; …