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

news2024/11/24 19:42:15

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

一 、环境准备

(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/profile

source /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.zip

unzip webase-front.zip

cp -r nodes/127.0.0.1/sdk/* webase-front/conf/
启动webase-front服务
cd webase-front

bash 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, address
                        destination, 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) public
                    returns(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;
                  }
               }
                // 把全部记录查询次数增加1
                queryCount = 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 web

mkdir contract && cd contract

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

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

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

相关文章

一键编译并启动一个 ARM Linux qemu 虚拟机

需要事先自己编译 qemu-system-arm 可执行文件&#xff1b; 1&#xff0c;编译创建ARM 虚拟机 1.1 一起从头开始版 cd 进一个空文件夹&#xff0c;然后 $ vim buildup.sh $ bash buildup.sh 访问github网络没什么问题&#xff1a; 硬编码了一个路径/home/hipper/ex_vexpre…

Java对象内存布局和Synchronized锁升级(二)

目录 对象内存布局对象头实例数据对齐填充锁在内存布局中的标志位 锁升级无锁偏向锁偏向锁升级 轻量级锁重量级锁 锁消除和锁粗化锁消除锁粗化 锁升级总结 对象内存布局 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(I…

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

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

应用商店故障(UOS系统)

应用商店故障&#xff08;UOS系统&#xff09; 1. 安装应用商店内的应用无法下载&#xff0c;更新系统时提示依赖关系被破坏&#xff0c;怎么办&#xff1f; 问题描述 安装应用商店内的应用无法下载&#xff0c;更新系统时均提示依赖关系被破坏 解决方案 1、可先建议用户尝试修…

day 22线程间通信

一、互斥锁 1、资源&#xff1a; 资源是有限的&#xff0c;在程序运行过程中&#xff0c;一段代码、一段空间、一个变量、CPU、内存都可以看做资源 2、互斥锁&#xff1a; 是一种资源,当一个线程任务加锁,其余线程任务无法再次加锁,直到解锁后才能加锁&#xff0c;互斥…

数据机房防静电措施有哪些?安装防静电地板时记住这几点

生活中静电无处不在&#xff0c;一般情况静电不会对我们有什么影响&#xff0c;但在一些特殊场合&#xff0c;比如数据机房、配电室、消控室、电子厂房等&#xff0c;静电的危害必须要引起重视&#xff0c;因为这些场合通常有比较多的电子设备&#xff0c;电子设备中有比较多的…

priority_queue模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾什么是适配器模式&#xff1f;准备工作包含头文件定义命名空间类的成员变量什么是仿函数&#xff1f;比较仿函数在priority_queue中的作用通过传入不同的仿函数可以做到大堆和小堆之间的切换通过传入不同的仿函数可以做到改变priority_qu…

[Leetcode][Medium]-面试题 17.14.最小k个数-TOP K问题-快排/大根堆

一、题目描述 原题地址 二、整体思路 (1)、快排 数组中最小的k个数就是说把数组升序排列&#xff0c;求[0,k-1]区间上的数。 快排可以得到一个元素在升序排序的数组中的正确位置。在这个位置的左边区间[l,l2-1]上的元素都比它小&#xff0c;在这个位置的右边区间[r2,r]上的元素…

zabbix 监控软件

zabbix 监控软件 自带图形化界面&#xff0c;通过网页就可以监控所有的服务器的状态。 事件告警&#xff0c;邮箱通知&#xff08;噩梦&#xff09;。 zabbix是什么&#xff1f; web界面提供的分布式监控以及网络监控功能的开源的企业级的软件解决方案。 服务端 监控端 客…

App安装来源追踪的四大方案解析

App的开发者和运营商&#xff0c;都会研究分析渠道的效果&#xff0c;而对渠道来源的追根溯源是一切分析的基础。假如没有明确的安装来源数据&#xff0c;至少会造成以下几种后果&#xff1a; 没有安装来源数据&#xff0c;我们无法判断各个投放渠道流量的价值&#xff0c;也就…

全网首发!鸿蒙OS登上PC,冒风险流出内测,系统界面截图,过会儿就删

开玩笑的啦&#xff0c;其实这是Deepin操作系统的截图&#xff0c;很漂亮吧&#xff0c;这是deepin v23 rc2 的主题之一 鸿蒙还没有发&#xff0c;不知道24年末还能不能上&#xff0c;emmm

Python实战:基础语法

一、求解列表中的最大元素 import random#定义函数 def get_max(lst):x lst[0] #x存储的是元素的最大值#遍历操作for i in range(1,len(lst)):if lst[i] > x:x lst[i] #对最大值进行重新赋值return x#调用函数 lst [random.randint(1,100) for item in range(10)] print…

基于SiliconCloud快速体验GraphRag.Net

SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型&#xff0c;提供高性价比的 GenAI 服务。 不同于多数大模型云服务平台只提供自家大模型 API&#xff0c;SiliconCloud上架了包括 Qwen、DeepSeek、GLM、Yi、Mistral、LLaMA 3、SDXL、InstantID 在内的多种开源大语言模…

sgetrf M N is 103040 时报错,这是个bug么 lapack and Openblas the same,修复备忘

1,现象 MN103040时&#xff0c;调用 sgetrf_ 时&#xff0c;无论是 LAPACK 还是 OpenBLAS&#xff0c;都出错&#xff1a; openblas&#xff1a; lapack&#xff1a; 2, 复现代码 出现问题的应该是由于M和N相对数字太大&#xff0c;乘积超出32bit整数的表达范围&#xff0c;…

【踩坑】TypeScript 中使用 sass 动态设置样式

问题 在从 Vue2 项目转向 Vue3 项目时&#xff0c;不得不将已经封装好的 echarts 图表也升级成 Vue3 适配的版本&#xff0c;遇到了一个有些诡异的问题&#xff0c;在此记录一下。 背景&#xff1a; 在 Vue2 的项目中&#xff0c;为了动态设置 echarts 的相关配置&#xff0c;于…

trie算法

1、定义 高效的存储和查找字符串集合的数据结构 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最大限度地减少无谓的字符串比较&#xff0c;查询效率比哈希树高 2、构建 我们可以使用数组来模拟实现Trie树。 我们设计一个二维数组 son[N] [26] 来…

WhatsApp收不到验证短信的原因及解决方案

在使用WhatsApp进行账号注册或验证过程中&#xff0c;有时会遇到无法收到验证短信的情况。这种情况可能会给用户带来诸多不便&#xff0c;但通常可以通过一些简单的方法来解决。本文将详细分析收不到验证短信的可能原因&#xff0c;并提供相应的解决方案&#xff0c;帮助用户顺…

LeetCode_sql_day15(262.行程与用户)

描述&#xff1a;262. 行程和用户 - 力扣&#xff08;LeetCode&#xff09; 取消率 的计算方式如下&#xff1a;(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 编写解决方案找出 "2013-10-01" 至 "2013-10-03" 期间非禁止…

EMF矢量图工具Graphpad Prism(棱镜科研绘图工具)

Graphpad Prism 是一款功能强大、专业实用的棱镜科研绘图软件&#xff0c;专为科研工作者而设计研发&#xff0c;可帮助用户进行专业便捷的科研图像绘制&#xff0c;通过该款软件用户可以进行新型子列图进行创建&#xff0c;可以进行平滑的线性图进行绘制&#xff0c;可以说是一…

【汉明距离总和】python刷题记录

R4-数与位篇 class Solution:def totalHammingDistance(self, nums: List[int]) -> int:#创建计数器trieCounter()max_bitlen(bin(max(nums)))-2ret0for i,num in enumerate(nums):for j in range(max_bit):#一位位地取出来bit(num>>j)&1if bit:reti-trie[j]trie[…