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.mzph.cn/web/46571.shtml

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

相关文章

ArkUI状态管理

State装饰器 在声明式UI中&#xff0c;是以状态驱动试图更新 状态 (State) 指驱动视图更新的数据(被装饰器标记的变量) 试图(View) 基于UI描述渲染得到用户界面 说明 1.State装饰器标记的变量必须初始化&#xff0c;不能为空 2.State支持Object、classstring、number、b…

[Vulnhub] devt-improved slog_users+vim权限提升+nano权限提升+passwd权限提升+Lxc逃逸权限提升

信息收集 IP AddressOpening Ports192.168.101.149TCP:22,113,139,445,8080 $ nmap -p- 192.168.101.149 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | …

9.11和9.9哪个大?GPT-4o也翻车了

今天刷到了这个问题&#xff0c;心血来潮去问下chatgpt-4o&#xff0c;没想到疯狂翻车... 第一次问&#xff1a; GPT一开始给出了难绷的解答&#xff0c;让我想起了某短视频软件评论区里对某歌手节目排名的质疑哈哈哈哈哈 但是在接下来的进一步询问和回答中它反应过来了。 第…

JavaWeb笔记_Response对象

一.Response对象 1.1 Response对象概述 a.专门负责给浏览器响应信息&#xff08;响应行&#xff0c;响应头&#xff0c;响应体&#xff09;的对象 b.我们主要使用的是跟HTTP协议相关的Response对象&#xff1a;HTTPServletResponse&#xff0c;继承了ServletResponse&#x…

MAVSDK-Java开源库的SDK库macOS平台编译

1.先安装好JDK17 2.克隆MAVSDK-Java源码 3.检测工程./gradlew check 发现未安装protoc-gen-mavsdk 安装后要添加到环境变量 4.安装protoc-gen-mavsdk pip3 install protoc-gen-mavsdk安装路径为: /opt/anaconda3/lib/python3.11/site-packages/protoc_gen_mavsdk

“社群+”生态下的开源AI智能名片源码:驱动商业与社会连接的新引擎

摘要&#xff1a;在“社群”生态日益成为主流趋势的今天&#xff0c;开源AI智能名片源码作为技术创新与社群运营的深度融合体&#xff0c;正逐步展现出其重塑商业格局、深化社会连接的巨大潜力。本文旨在深入探讨开源AI智能名片源码的技术特性、在“社群”生态中的具体应用、对…

Postman导出excel文件

0 写在前面 在我们后端写接口的时候&#xff0c;前端页面还没有出来&#xff0c;我们就得先接口测试&#xff0c;在此记录下如何使用postman测试导出excel接口。 如果不会使用接口传参可以看我这篇博客如何使用Postman 1 方法一 2 方法二 3 写在末尾 虽然在代码中写入文件名…

电流测量分流电阻

电流测量分流电阻 测量电流的设备称为安培计。大多数现代安培计测量已知电阻的精密电阻上的电压降。电流的计算使用欧姆定律&#xff1a;我五R 大多数电流表都内置电阻器来测量电流。但是&#xff0c;当电流对于电流表来说太高时&#xff0c;需要不同的设置。解决方案是将电流…

Chromium CI/CD 之Jenkins实用指南2024- Windows节点开启SSH服务(七)

1.引言 在现代软件开发和持续集成的过程中&#xff0c;自动化部署和远程管理是不可或缺的关键环节。SSH&#xff08;Secure Shell&#xff09;协议以其强大的安全性和灵活性&#xff0c;成为连接和管理远程服务器的首选工具。对于使用Windows虚拟机作为Jenkins从节点的开发者而…

Visual Studio Code 实现远程开发

Background 远程开发是指开发人员在本地计算机上进行编码、调试和测试&#xff0c;但实际的开发环境、代码库或应用程序运行在远程服务器上。远程开发的实现方式多种多样&#xff0c;包括通过SSH连接到远程服务器、使用远程桌面软件、或者利用云开发环境等。这里我们是使用VSCo…

【操作系统】文件管理——文件共享与保护,文件系统的结构(个人笔记)

学习日期&#xff1a;2024.7.18 内容摘要&#xff1a;文件共享&#xff0c;文件保护&#xff0c;文件系统的层级结构和全局结构&#xff0c;虚拟文件系统 文件共享 操作系统提供的文件共享功能&#xff0c;可以让多个用户共享使用同一个文件。文件共享和文件复制是不一样的&a…

python ATM实现

代码要求&#xff1a; 详细代码&#xff1a; money 50000000 name input("输入您的姓名 &#xff1a;")#查询功能 def search(show_header):if show_header:print("--------查询余额--------")print(f"{name}&#xff0c;您好&#xff0c;您的余额…

gitlab新建仓库

总贴 每个git网站都有不同的创建项目的方式&#xff0c;现在举例gitlab&#xff0c;其他例如gitee&#xff0c;gitcode&#xff0c;都是差不多的&#xff0c;自行百度 1![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dae875d9048940c0aeb292c07d6a4a62.png)1和2是项…

简约的悬浮动态特效404单页源HTML码

源码介绍 简约的悬浮动态特效404单页源HTML码,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8&q…

matlab 异常值检测与处理——Robust Z-score法

目录 一、算法原理1、概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠翻译,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、概述 Robust Z-score法也被称为中位数绝对偏差法。它类似于Z-sc…

WebRTC音视频-前言介绍

目录 效果预期 1&#xff1a;WebRTC相关简介 1.1&#xff1a;WebRTC和RTC 1.2&#xff1a;WebRTC前景和应用 2&#xff1a;WebRTC通话原理 2.1&#xff1a;媒体协商 2.2&#xff1a;网络协商 2.3&#xff1a;信令服务器 效果预期 1&#xff1a;WebRTC相关简介 1.1&…

排序算法(4)之快速排序(2)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序算法(4)之快速排序(2) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

剧本杀小程序搭建,为商家带来新的收益方向

近几年&#xff0c;剧本杀游戏成为了游戏市场的一匹黑马&#xff0c;受到了不少年轻玩家的欢迎。随着信息技术的快速发展&#xff0c;传统的剧本杀门店已经无法满足游戏玩家日益增长的需求&#xff0c;因此&#xff0c;剧本杀市场开始向线上模式发展&#xff0c;实现行业数字化…

linux中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…

汽车免拆诊断案例 | 卡罗拉急加速抖动故障排除

车型信息 2017年改款卡罗拉&#xff0c;排量1.2T&#xff0c;行驶里程48800公里。 故障现象 车辆不管在什么状态下&#xff0c;只要是平缓加速&#xff0c;都不会有抖动。车辆静止时&#xff0c;急加速时&#xff0c;也不会有抖动。但是车速达40公里/小时以上&#xff0c;急加…