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

news2024/9/20 16:31:32

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

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

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

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

这个还是不行

在这里插入图片描述

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

直接使用课件源码

在这里插入图片描述

执行前修改jQuery及端口等

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

基本修改已经完成

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

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

truffle develop
truffle(develop)> compile

truffle(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;
        // 返回被领养的petID
        return 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) {
    // 获取当前单击按钮对应宠物的id
    var 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 develop

Deploy

Npm run dev

在这里插入图片描述

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

点击领养按钮

在这里插入图片描述

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

在这里插入图片描述

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

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

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

再次刷新html信息也都在

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

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

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

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

相关文章

Blender4.2版本正式上线,新版本的5个主要功能!

​Blender刚刚推出了备受瞩目的 Blender 4.2 版本&#xff0c;这款软件专为那些在视觉特效、动画制作、游戏开发和可视化设计领域工作的艺术家们量身打造。作为最新的长期稳定更新&#xff0c;Blender 4.2 不仅稳定可靠&#xff0c;还引入了备受期待的“Eevee Next”实时渲染引…

【BUG】已解决:zipfile.BadZipFile: File is not a zip file

已解决&#xff1a;zipfile.BadZipFile: File is not a zip file 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

channle介绍

通道在Java NIO&#xff08;New Input/Output&#xff09;中扮演着核心角色&#xff0c;它们是与Buffer&#xff08;缓冲区&#xff09;交互的入口点&#xff0c;用于从外部资源读取数据到内存或从内存写入数据到外部资源。通道可以看作是访问文件数据和其他I/O资源&#xff08…

JVM:MAT内存泄漏检测原理

文章目录 一、介绍 一、介绍 MAT提供了称为支配树&#xff08;Dominator Tree&#xff09;的对象图。支配树展示的是对象实例间的支配关系。在对象引用图中&#xff0c;所有指向对象B的路径都经过对象A&#xff0c;则认为对象A支配对象B。 支配树中对象本身占用的空间称之为…

谷歌浏览器自动填充密码时,el-input样式错乱

使用到谷歌浏览器的记忆功能&#xff0c;选择的内容为浏览器保存的内容时 会导致element-plus的el-input样式改变 只需要增加一个css样式&#xff0c;就可以解决问题 :deep .el-input__inner {box-shadow: 0 0 0 1000px #fff inset; }修改后

深入理解ADB:Android调试桥详解与使用指南

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 什么是ADB&#xff1f; ADB的基本原理&#xff1a; 2. ADB的安装与配置 安装ADB工具集&#xff1a; 配置ADB环境变量&am…

注册安全分析报告:东方航空

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

进程与线程(一)进程相关

目录 一. 概念二 . 组成进程控制块程序段数据段 三. 特征四. 进程的状态与转换五. 进程控制进程创建进程终止进程阻塞与进程唤醒进程切换 六. 进程通信共享存储消息传递管道通信 一. 概念 多道程序环境下&#xff0c;允许多个程序并发执行&#xff0c;此时它们将失去封闭性&…

Unity 导入MRTK,使用URP 升级材质,MRTK的材质还是洋红色

控制台显示信息 ToggleBackground material was not upgraded. There’s no upgrader to convert Mixed Reality Toolkit/Standard shader to selected pipeline UnityEditor.Rendering.Universal.UniversalRenderPipelineMaterialUpgrader:UpgradeProjectMaterials() (at 点击…

出现 Welcome to nginx! If you see this page, 的解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 对于Nginx的知识点推荐阅读&#xff1a; Nginx从入门到精通&#xff08;全&#xff09;Nginx配置静态网页访问&#xff08;图文界面&#xff09;Nginx将https重定向为http进行访问的配置&#xff08;附Demo&#xff09; 由…

经典神经网络(14)T5模型原理详解及其微调(文本摘要)

经典神经网络(14)T5模型原理详解及其微调(文本摘要) 2018 年&#xff0c;谷歌发布基于双向 Transformer 的大规模预训练语言模型 BERT&#xff0c;而后一系列基于 BERT 的研究工作如春笋般涌现&#xff0c;预训练模型也成为了业内解决 NLP 问题的标配。 2019年&#xff0c;谷歌…

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…

UE4-蓝图(可视化编程)学习

一.开关门交互实现 1.需要用到的模板和内容包 2.给门添加碰撞 进入第三人称模板场景&#xff0c;找到门的模型&#xff0c;并将门的模型添加到我们的场景中&#xff1a; 此时我们运行游戏&#xff0c;会发现我们的角色可以穿过我们门的模型&#xff0c;说明我们没有给门添加碰…

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

处理.git文件夹过大出现臃肿问题

1、问题背景 在软件开发过程中&#xff0c;版本控制是一个至关重要的环节。Git 作为一种流行的分布式版本控制系统&#xff0c;被广泛应用于各种项目中。然而&#xff0c;近期我们发现在进行项目发版时&#xff0c;Git 克隆项目的时间显著增加&#xff0c;严重影响了发版的效率…

Golang | Leetcode Golang题解之第257题二叉树的所有路径

题目&#xff1a; 题解&#xff1a; func binaryTreePaths(root *TreeNode) []string {paths : []string{}if root nil {return paths}nodeQueue : []*TreeNode{}pathQueue : []string{}nodeQueue append(nodeQueue, root)pathQueue append(pathQueue, strconv.Itoa(root.V…

GaussDB常见调优指南

文章目录 GaussDB常见调优指南一. Analyze 统计信息解析二. Explain 分布式计划解析三. 性能调优总体策略详解四. 性能调优之坏味道 SQL 识别五. 性能调优之好味道表定义六. 性能调优之 SQL 改写七. 性能调优之路径干预八. 性能调优之 Plan hint 运用九. 性能调优之 GUC 参数调…

【Anaconda】Ubuntu配置与windows远程访问

下载安装 # 下载(进官网复制最新下载地址) wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh# 安装 bash Anaconda3-2024.06-1-Linux-x86_64.sh配置环境 # 编辑环境变量 nano ~/.bashrc# 加入以下这行内容&#xff0c;user替换为自己的用户名 ex…

网络安全-等级保护制度介绍

一、等保发展历程 &#xff08;1&#xff09;1994国务院147号令 第一次提出等级保护概念&#xff0c;要求对信息系统分等级进行保护 &#xff08;2&#xff09;1999年GB17859 国家强制标准发布&#xff0c;信息系统等级保护必须遵循的法规 &#xff08;3&#xff09;2005年公安…

selenium自动化测试-等待和窗口切换详解

目录 等待 强制等待 隐式等待 显式等待 窗口切换 标签页切换 iframe切换 alert弹窗切换 等待 在打开网页后&#xff0c;可能页面中某些元素在加载中&#xff0c;导致定位元素时找不到对应元素&#xff0c;然后报错出现异常&#xff0c;因此我们需要打开网页后&#xf…