基于区块链的供应链应用开发
区块链的供应链溯源应用开发
一 、环境准备
(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字符串
示例: 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,并通过 Web 浏览器进行访问…...

【原创】springboot+mysql法律咨询网设计与实现
个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…...
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中,创建节点时,如果该节点已经存在,并且你的代码没有正确处理这种情况,那么会抛出NodeExistsException异常。这是ZooKeeper客户端库(包括Curator)的常见行为,因为它需要确保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文本简单解析
需求 支持文本插入,比如 xxx {product_name} xxx ,如果提供了product_name变量的值为feedback,则可以渲染出 xxx feedback xxx。支持链接解析,比如 [baidu](https://www.baidu.com/),可以直接渲染成超链接的形式。支持…...
webpack plugin
webpack plugin webpack完成的复杂炫酷的功能依赖于插件机制,webpack的插件机制依赖于核心的库, tapable tapable是一个类似于nodejs的eventEmitter的库, 主要是控制钩子函数的发布喝定于,当时,tapable提供您的hook机…...
【busybox记录】【shell指令】date
目录 内容来源: 【GUN】【date】指令介绍 【busybox】【date】指令介绍 【linux】【date】指令介绍 使用示例: 打印前天的日期: 打印三个月零一天后的日期: 打印当年圣诞节的年数: 打印当前的全月名称和月的日期: 要打印一个没有前导零的日期&…...

同态加密和SEAL库的介绍(八)性能
本篇会对比三种加密方案,同时每种方案配置三种参数。即九种情况下的各个操作的性能差异,为大家选择合适的方案和合适的参数提供参考。表格中所有时长的单位均为微妙,即 。 当然数据量比较大,为了方便大家查找,…...
华为OD-D卷数的分解
给定一个正整数n,如果能够分解为m(m > 1)个连续正整数之和,请输出所有分解中,m最小的分解。 如果给定整数无法分解为连续正整数,则输出字符串"N"。 输入描述: 输入数据为一整数,范围为(1, 2^3…...
rk3588 low_delay_net_display注意事项
low_delay_net_display例子默认只支持YUV420和RGB888,如果需要支持YUV422,请添加下面部分: 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 入门:从零到一构建你的第一个应用 Spring Boot 作为一个流行的Java框架,以其“习惯优于配置”的理念极大地简化了Spring应用的开发和部署过程。本文将带你一步步创建一个简单的Spring Boot应用,从环境准备到项目创建,…...

Linux云计算 |【第二阶段】NETWORK-DAY2
主要内容: VLAN技术、TRUNK模式、链路聚合、路由器 一、VLAN技术应用 广播域指接受同样广播消息的节点的集合,如在该集合中的任何一个节点传输一个广播帧,则所有其它能收到这个帧的节点都被认为是该广播帧的一部分; 交换机的所有…...
Java面试题(基础篇)③
目录 一, 与 equals 的区别? 二,接口和抽象类的区别? 三,请说出几个常见的异常? 四,请问你对Java 反射有了解吗? 五,浅拷贝和深拷贝区别? 一,…...
Qt动态调用 - QMetaObject::invokeMethod
QMetaObject::invokeMethod 动态调用是 Qt 的元对象系统的一项强大功能,它允许在运行时通过名称调用槽函数、信号和普通成员函数。 这种能力对于构建灵活和可扩展的应用程序非常有用,比如插件系统或脚本接口。 动态调用方法 Qt 提供了 QMetaObject::i…...

html+css+js网页设计 星享咖啡6个页面(带js) ui还原度90%
htmlcssjs网页设计 星享咖啡6个页面(带js) ui还原度90% 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等…...
docker上传镜像至阿里云
1、安装wsl2 WSL2安装(详细过程) 2、安装docker Docker在Windows下的安装及使用 3、创建私人阿里云镜像库 如何创建私人阿里云镜像仓库?(保姆级) 4、如何删除容器 (1) 查找正在使用该图像的容器 docker ps -a --filte…...

POS刷卡开发源码之语音播报-CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
一、终端语音提醒的好处 1. 增强信息传递的有效性:在人们忙碌或者注意力分散时,语音提醒能够直接穿透噪音和干扰,确保重要信息被准确接收。 2. 提高操作的便捷性:用户无需停下手中的工作去查看屏幕或阅读文字,直接通过…...
jupyter notebook魔法命令
%xmode 魔法命令来控制异常报告: 输入魔法命令:在 IPython 或 Jupyter Notebook 的一个新单元格中,输入以下命令之一来设置异常报告模式: 切换到 Plain 模式(简洁输出): %xmode Plain切换回 Con…...

Mysql事件
1:查询全局事件开关是否启动 SHOW VARIABLES LIKE %sche%; 关闭状态!!!去开启如果已开启忽略 set global event_scheduler ON; ojbk 2:创建事件 step1: 链接打开自己的数据库 step2: 找…...

Unity Console 窗口输出对齐
起因:做了个工具在console窗口罗列一些信息,基本结构是 [ 文件名 :行号 ],因为文件,行号长度不一,想要做到如下效果。 初步尝试,用以下方法: string format "{0,-10} …...

leetcode198_打家劫舍
思路 动态规划 func rob(nums []int) int {if len(nums) < 2 {return nums[0]}// dp[i] 表示到第i家为止,小偷能够偷窃到的最高金额dp : make([]int, len(nums))dp[0] nums[0]dp[1] max(nums[0], nums[1])for i:2; i<len(nums); i {if nums[i] dp[i-2] &…...
C# 串口通讯怎么防止数据丢失
串口通信(Serial Communication)是计算机与设备之间进行数据交换的一种方式。在C#中进行串口通信时,防止数据丢失可以采取以下一些措施: 1.校验和(Checksum):在发送数据时,计算数据的…...

【机器学习】BP神经网络中的链式法则:解开智能背后的数学奥秘
在浩瀚的机器学习领域中,BP(反向传播)神经网络如同一座桥梁,连接着复杂的数据世界与智能的彼岸。而这座桥梁的基石之一,便是链式法则(Chain Rule)——一个看似简单却蕴含无限智慧的数学原理。今…...

MyBatis 基本操作 - 注解版
目录 一,查询 - select 1.1 全列查询 1.2 指定列查询 1.3 赋值问题 方法一:起别名 方法二:结果映射 方法三:添加配置 二,新增 - Insert 2.1 使用对象插入 2.2 获取主键 三,删除 - Delete 四&am…...

专业比例阀放大器配套选型
比例阀放大器作为液压系统中的关键组件,其技术选型对于保障系统的精确控制、稳定性和长期可靠性至关重要。下面将深入探讨比例阀放大器的技术选型要点,确保选型能满足特定的应用需求和系统性能要求: 兼容性与安装方式 阀型匹配:…...
Springboot 多数据源整合的三种方式
上链接:Springboot 多数据源整合的三种方式_springboot整合多数据源-CSDN博客...