当前位置: 首页 > news >正文

基于区块链的供应链应用开发

区块链的供应链溯源应用开发

一 、环境准备

(1)更新镜像源

apt update

在这里插入图片描述

(2)安装(openssl、jdk、git)

apt -y install openssl default-jdk git

在这里插入图片描述

(3)配置JAVA_HOME环境变量

echo “export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/” >> /etc/profilesource /etc/profile

(4)下载区块链开发部署工具

使用curl命令下载build_chain.sh区块链开发部署工具
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.11.0/build_chain.sh && chmod u+x build_chain.sh

在这里插入图片描述

(5)下载fisco-bcos二进制程序

使用wget命令下载fisco-bcos二进制程序
wget -c http://res.zhonghui.vip/blockchain/training/trace/resourse/fisco-bcos.tar.gz
解压缩文件,使用tar命令将fisco-bcos.tar.gz压缩包解压。-x参数解压文件,-v参数显示解压过程,-f参数指定文件
tar -xvf fisco-bcos.tar.gz

(6) 搭建并启动区块链网络

搭建区块链网络
bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -e ./fisco-bcos

在这里插入图片描述

启动区块链网络
bash nodes/127.0.0.1/start_all

在这里插入图片描述

(7) 安装并启动webase-front服务

使用wget命令下载
wget -c http://res.zhonghui.vip/blockchain/training/trace/resourse/webase-front.zipunzip webase-front.zipcp -r nodes/127.0.0.1/sdk/* webase-front/conf/
启动webase-front服务
cd webase-frontbash start.sh

在这里插入图片描述

在网站中打开:http://127.0.0.1:5002/WeBASE-Front

在这里插入图片描述

(8)合约功能开发

在这里插入图片描述

编写供应链(Logistics.sol)合约
pragma solidity 0.6.10;
pragma experimental ABIEncoderV2;contract Logistics {struct LogisticsData {address cargo;            // 货物合约地址address orgin;            // 货物上级合约地址address destination;     // 货物下级合约地址string memo;              // 备注信息uint createdAt;            // 创建时间uint queryCount;      // 已查询次数}LogisticsData[] private _logisticsData;              // 全部物流信息数组uint public recordCount;                  // 所有记录条数uint public queryCount;               // 所有查询次数function newLogistics(address cargo, address orgin, addressdestination, string memory memo) public {_logisticsData.push(LogisticsData({cargo:cargo,        // 货物合约地址orgin:orgin,        // 货物上级合约地址destination: destination, // 货物下级合约地址memo:memo,         // 备注信息createdAt:now,    // 创建时间初始化为当前时间queryCount:0       // 查询次数初始化为0}));recordCount = recordCount + 1;      // 所有记录条数增加1}function getLogisticsInfo(address cargo) publicreturns(LogisticsData[] memory _cargoLogisticsData) {// 使用new关键字初始化LogisticsData[]数组,长度为3,将其赋值给_cargoLogisticsData数组变量_cargoLogisticsData = new LogisticsData[](3);// 进行3次循环for (uint i=0; i < 3; i ++) {// 在所有物流记录中查询货物合约地址为cargo的记录for (uint j=0; j < _logisticsData.length; j++) {if (_logisticsData[j].cargo == cargo) {// 把此条物流记录查询次数增加1_logisticsData[j].queryCount =_logisticsData[j].queryCount + 1;// 把此条物流记录添加到_cargoLogisticsData数组变量中_cargoLogisticsData[i] = _logisticsData[j];}}// 把货物上级合约地址赋值给cargo,进行上级货物物流记录的查询cargo = _cargoLogisticsData[i].orgin;if (cargo == address(0)) {// 货物上级地址为空,终止循环break;}}// 把全部记录查询次数增加1queryCount = queryCount + 1;return _cargoLogisticsData;}}

在这里插入图片描述

编写原产品(Material.sol)合约
pragma solidity 0.6.10;
contract Material {
address private _owner; // 合约创建者
string private _name; // 原产品名
string private _memo; // 备注信息
uint private _createdAt;// 创建时间
constructor(string memory materialName, string memory memo)
public {
_owner = msg.sender; // 把创建合约的地址赋值给_owner
_name = materialName; // 把原产品名赋值给_name
_memo = memo; // 把备注信息赋值给_memo
_createdAt = now; // 把当前时间赋值给_createdAt
}
function getMaterialInfo() public view returns(address, string
memory, string memory , uint){
return (_owner, _name, _memo, _createdAt);
}
}

在这里插入图片描述

编写中间产品(Product.sol)合约
pragma solidity 0.6.10;
import "./Logistics.sol";
contract Product {
address private _owner;    // 合约创建者
string private _name;   // 中间产品名
string private _memo;    // 备注信息
uint private _createdAt;     // 创建时间
address private _materialAddress;     // 原产品合约地址constructor(address materialAddress, address logisticsAddress,
string memory productName, string memory memo, string memory
logisticsMemo) public {
_owner = msg.sender; 
// 把创建合约的地址赋值给_owner_name = productName;
// 把中间产品名赋值给_name_materialAddress = materialAddress; 
// 把原产品合约地址赋值给_materialAddress_memo = memo; // 把备注信息赋值给_memo
_createdAt = now; // 把当前时间赋值给_createdAt// 调用供应链合约,保存供应链数据
Logistics(logisticsAddress).newLogistics(materialAddress,
address(0), address(this), logisticsMemo);
}
function getProductInfo() public view returns(address, string
memory, string memory memo, uint){
return (_owner, _name, _memo, _createdAt);
}
}

在这里插入图片描述

编写商品(Goods.sol)合约
pragma solidity 0.6.10;
import "./Logistics.sol";
contract Goods {
address private _owner; // 合约创建者
string private _name; // 商品名
string private _memo; // 备注信息
uint private _createdAt; // 创建时间
address private _productAddress; // 中间产品合约地址
address private _logisticsAddress; // 供应链合约地址
constructor(address materialAddress, address productAddress,
address logisticsAddress, string memory goodsName, string memory
memo, string memory logisticsMemo) public {
_owner = msg.sender; // 把创建合约的地址赋值给
_owner
_name = goodsName; // 把商品名赋值给_name
_productAddress = productAddress; // 把中间产品合约地址赋值
给_productAddress
_memo = memo; // 把备注信息赋值给memo
_createdAt = now; // 把当前时间赋值给
_createdAt
_logisticsAddress = logisticsAddress;// 把供应链合约地址赋值给
_logisticsAddress
// 调用供应链合约,保存供应链数据
Logistics(logisticsAddress).newLogistics(productAddress,
materialAddress, address(this), logisticsMemo);
}
function getGoodsInfo() public view returns(address, string
memory, string memory memo, uint){
return (_owner, _name, _memo, _createdAt);
}
function sell(string memory logisticsMemo) public {
// 调用供应链合约,保存供应链数据
Logistics(_logisticsAddress).newLogistics(address(this),
_productAddress, address(0), logisticsMemo);
}
}

在这里插入图片描述

(9)导出合约文件

在这里插入图片描述

在这里插入图片描述

二、 构建项目

(1)生成go合约文件

mkdir web && cd webmkdir contract && cd contract
将导出的合约文件移动到当前contract文件夹下并解压
mv /root/Downloads/trace.zip ./
unzip trace.zip
<

相关文章:

基于区块链的供应链应用开发

区块链的供应链溯源应用开发 一 、环境准备 (1)更新镜像源 apt update(2)安装(openssl、jdk、git) apt -y install openssl default-jdk git(3)配置JAVA_HOME环境变量 echo “export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/” >> /etc/profilesource /etc…...

获取GORM执行时的sql字符串

示例&#xff1a; import "log" func GetDetail(tx *gorm.DB,id int)(data any,err error){var query tx.Session(&gorm.Session{DryRun: true})err query.Where("id ?", id).First(&res).Errorif err!nil{zap.L().Error("get detail er…...

Linux系统使用Docker安装RStudio服务并实现任意浏览器远程访问

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…...

【原创】springboot+mysql法律咨询网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…...

Vue 应用实例的关键方法与配置案例二

目录 createApp createSSRApp app.mount app.unmount app.component app.directive Vue3.X自定义全局指令 Vue2.X自定义全局指令 app.use app.mixin 非 VIP 用户能够免费下载博文资源 createApp 详见上一章节:Vue 应用实例的关键方法与配置案例一-CSDN博客 createSS…...

Java面试题--JVM大厂篇之破解 JVM 性能瓶颈:实战优化策略大全

目录 引言: 正文: 1. 常见的JVM性能问题 频繁的GC导致应用暂停 内存泄漏导致的内存不足 线程争用导致的CPU利用率过高 类加载问题导致的启动时间过长 2. 优化策略大全 2.1 代码层面的优化 2.1.1 避免不必要的对象创建 2.1.2 优化数据结构的选择 2.1.3 使用并发工具…...

Apache Curator 创建节点时,如果节点存储就会抛出异常吗?

在Apache Curator中&#xff0c;创建节点时&#xff0c;如果该节点已经存在&#xff0c;并且你的代码没有正确处理这种情况&#xff0c;那么会抛出NodeExistsException异常。这是ZooKeeper客户端库&#xff08;包括Curator&#xff09;的常见行为&#xff0c;因为它需要确保Zoo…...

【食物链】

题目 代码 #include<bits/stdc.h> using namespace std; const int N 5e410; int n, k; int p[N], d[N]; int find(int x) {if(p[x] ! x){int root find(p[x]);d[x] d[p[x]];p[x] root;}return p[x]; } int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)…...

【RN】实现markdown文本简单解析

需求 支持文本插入&#xff0c;比如 xxx {product_name} xxx &#xff0c;如果提供了product_name变量的值为feedback&#xff0c;则可以渲染出 xxx feedback xxx。支持链接解析&#xff0c;比如 [baidu](https://www.baidu.com/)&#xff0c;可以直接渲染成超链接的形式。支持…...

webpack plugin

webpack plugin webpack完成的复杂炫酷的功能依赖于插件机制&#xff0c;webpack的插件机制依赖于核心的库&#xff0c; tapable tapable是一个类似于nodejs的eventEmitter的库&#xff0c; 主要是控制钩子函数的发布喝定于&#xff0c;当时&#xff0c;tapable提供您的hook机…...

【busybox记录】【shell指令】date

目录 内容来源&#xff1a; 【GUN】【date】指令介绍 【busybox】【date】指令介绍 【linux】【date】指令介绍 使用示例&#xff1a; 打印前天的日期: 打印三个月零一天后的日期: 打印当年圣诞节的年数: 打印当前的全月名称和月的日期: 要打印一个没有前导零的日期&…...

同态加密和SEAL库的介绍(八)性能

本篇会对比三种加密方案&#xff0c;同时每种方案配置三种参数。即九种情况下的各个操作的性能差异&#xff0c;为大家选择合适的方案和合适的参数提供参考。表格中所有时长的单位均为微妙&#xff0c;即 。 当然数据量比较大&#xff0c;为了方便大家查找&#xff0c…...

华为OD-D卷数的分解

给定一个正整数n&#xff0c;如果能够分解为m(m > 1)个连续正整数之和&#xff0c;请输出所有分解中&#xff0c;m最小的分解。 如果给定整数无法分解为连续正整数&#xff0c;则输出字符串"N"。 输入描述: 输入数据为一整数&#xff0c;范围为&#xff08;1, 2^3…...

rk3588 low_delay_net_display注意事项

low_delay_net_display例子默认只支持YUV420和RGB888,如果需要支持YUV422&#xff0c;请添加下面部分&#xff1a; rk3588_nvr/build/app/low_delay_net_display$ git diff v4l2HdmiRX.cpp diff --git a/app/low_delay_net_display/v4l2HdmiRX.cpp b/app/low_delay_net_displa…...

Spring Boot 快速入门样例【后端 3】

Spring Boot 入门&#xff1a;从零到一构建你的第一个应用 Spring Boot 作为一个流行的Java框架&#xff0c;以其“习惯优于配置”的理念极大地简化了Spring应用的开发和部署过程。本文将带你一步步创建一个简单的Spring Boot应用&#xff0c;从环境准备到项目创建&#xff0c;…...

Linux云计算 |【第二阶段】NETWORK-DAY2

主要内容&#xff1a; VLAN技术、TRUNK模式、链路聚合、路由器 一、VLAN技术应用 广播域指接受同样广播消息的节点的集合&#xff0c;如在该集合中的任何一个节点传输一个广播帧&#xff0c;则所有其它能收到这个帧的节点都被认为是该广播帧的一部分&#xff1b; 交换机的所有…...

Java面试题(基础篇)③

目录 一&#xff0c; 与 equals 的区别&#xff1f; 二&#xff0c;接口和抽象类的区别&#xff1f; 三&#xff0c;请说出几个常见的异常&#xff1f; 四&#xff0c;请问你对Java 反射有了解吗&#xff1f; 五&#xff0c;浅拷贝和深拷贝区别&#xff1f; 一&#xff0c…...

Qt动态调用 - QMetaObject::invokeMethod

QMetaObject::invokeMethod 动态调用是 Qt 的元对象系统的一项强大功能&#xff0c;它允许在运行时通过名称调用槽函数、信号和普通成员函数。 这种能力对于构建灵活和可扩展的应用程序非常有用&#xff0c;比如插件系统或脚本接口。 动态调用方法 Qt 提供了 QMetaObject::i…...

html+css+js网页设计 星享咖啡6个页面(带js) ui还原度90%

htmlcssjs网页设计 星享咖啡6个页面&#xff08;带js&#xff09; ui还原度90% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等…...

docker上传镜像至阿里云

1、安装wsl2 WSL2安装&#xff08;详细过程&#xff09; 2、安装docker Docker在Windows下的安装及使用 3、创建私人阿里云镜像库 如何创建私人阿里云镜像仓库&#xff1f;&#xff08;保姆级&#xff09; 4、如何删除容器 (1) 查找正在使用该图像的容器 docker ps -a --filte…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...