区块链2024

项目名称:基于区块链的物资管理系统

技术栈:SpringBoot + SpringSecurity + MyBatis-Plus + MySQL + Redis+ CouchDB + Hyperledger Fabric + RabbitMQ + Docker

项目描述:在自然灾害期间,物资管理常面临信息孤立和不透明等问题。为此,我们采用区块链技术开发了一个灾害救援物资管理系统。该系统通过区块链的分布式账本和智能合约确保物资信息真实、透明且不可篡改。通过实时追踪物资流向,提升了捐赠者和受援者之间的信任,优化了物资分配效率,为有效救援提供了坚实的技术支持。

职责描述: 主要负责登录认证数据上链以及物资追踪模块的开发工作。

1.通过 SpringSecurity 和 JWT 双 token 刷新机制实现用户登录认证和授权。

2.实现物资从入库、运输到分发的整个生命周期管理。编写智能合约代码,打包成链码,安装并部署到区块链网络。通过Java SDK 调用链码, 实现在区块链上记录每一笔物资的流动。

3.通过 Hyperledger Fabric 技术在区块链网络中搭建 peer 节点、orderer节点的集群,实现身份和权限的校验,将交易列表排序并打包成区块,最后通过PBFT共识算法决定区块是否上链。

4.利用 Redis 缓存热点数据,优化了频繁的物资和用户信息查询,显著降低了数据库负载并提高了系统响应速度。

5.使用 RabbitMQ 异步处理数据上链请求,利用 RabbitMQ 的发布订阅模型,在物资入库、运输到达等关键流程节点自动触发更新通知。

6.客户端通过调用智能合约的查询接口来获取物资的溯源信息,并以列表的形式呈现物资的流通路径和历史记录。

登录模块:

1.SpringSecurity 和 JWT 双 token流程

用户首次登录时,我们将用户名密码封装到UsernamePasswordAuthenticationToken对象当中,其次需要实现UserDetailsService接口并重写loadUserByUsername根据用户名获取用户信息,最后我们会调用AuthenticationManager对象的authenticate方法并传入封装了用户名密码的UsernamePasswordAuthenticationToken对象,内部会比较前端传入的用户名密码和数据库查询的用户名密码是否一致。

如果一致就登陆成功,这个时候会将用户信息权限信息封装到一个LoginUser对象当中并缓存到Redis。同时根据用户id生成双token,access_token用于免登录的认证,refresh_token用于刷新过期时间,refresh_token缓存到redis。用户再次访问资源时会先携带access_token,拦截器会对请求进行拦截并判断access_token是否合法是否过期,过期的话就会通知前端,前端会携带refresh_token再次发送请求,refresh_token没有过期就会刷新双token的过期时间,采用的是先删除redis中refresh_token,然后根据JWT生成俩个全新的双token,将新的refresh_token缓存到redis并将新的双token响应给前端。

2.为什么使用双token,有什么好处?

单token存在一些缺陷,过期时间设置太短比如30分钟,用户的体验就很差。过期时间设置太长,token就容易被盗取不安全。双token可以实现用户在access_token过期后,通过refresh_token来续期,用户体验好,同时刷新也保证了安全性(每次刷新会创建全新的token)。

区块链基础

1.如何实现防止数据篡改的?

区块链的不可篡改性是通过使用加密哈希函数共识算法去中心化的网络结构区块确认机制来实现的。这些机制共同确保一旦数据被添加到区块链中,就无法被更改或删除。

区块链基本单位是区块,区块由区块头和区块体组成。

区块头保存了上一个区块的区块哈希,相当于指针;还保存了当前区块的一个merkle树的根哈希值,防止数据篡改就是通过这个merkle树来保证的。merkle树构建过程:区块体保存交易列表,我们计算每个交易数据的hash值并两两组合再次计算哈希值,最终就得到了merkle树的根hash值。后期如果我们需要获取该区块的交易信息,就会提前验证数据是否被篡改,验证方式就是对获取的区块交易列表重新构建merkle树得到一个根hash值,然后和原来的根hash进行对比,如果一致就代表没有被篡改,不一致就代表被篡改了。

你知道哪些哈希函数的构造方法呢?解决哈希冲突有哪些方法呢?

哈希函数构造方法:除留取余法 直接定址法 平方取中法 数字分析法 折叠法

哈希冲突解决方法:链地址法 开放定址法(线性探测 平方探测) 再哈希法 建立公共溢出区

https://blog.csdn.net/weixin_46486402/article/details/139132744

常见的对称加密和非对称加密有哪些?

对称加密
  • 定义:使用相同的密钥进行加密和解密。
  • 常见算法
    • AES(Advanced Encryption Standard):广泛应用,提供128、192、256位密钥。
    • DES(Data Encryption Standard):已被AES取代,使用56位密钥。
    • 3DES(Triple DES):对DES进行三次加密,提高安全性。
    • Blowfish:密钥长度可变(32-448位),适用于大数据量加密。
    • RC4:流加密算法,简单且快速,但已不推荐使用。
非对称加密
  • 定义:使用一对密钥(公钥和私钥)进行加密和解密。
  • 常见算法
    • RSA(Rivest-Shamir-Adleman):广泛用于安全通信和数字签名,高安全性但速度较慢。
    • ECC(Elliptic Curve Cryptography):提供高安全性和高效能,使用椭圆曲线提供相同安全性的密钥长度较短。
    • DSA(Digital Signature Algorithm):主要用于数字签名,基于离散对数问题。
    • Diffie-Hellman:用于安全密钥交换,不直接用于加密和解密。

总结

  • 对称加密适用于需要速度和效率的数据传输场景。
  • 非对称加密适用于密钥交换、数字签名等需要高安全性的场景。

2.如何保证不同组织账本数据一致性?

通过fabric网络中的orderer节点的共识机制来保证。PBFT拜占庭,超过2/3组织数通过提案就广播并将新的区块加入到各个组织的本地区块链账本当中。

3.智能合约有什么作用?

编写数据上链(增删改)操作 和 数据追踪(区块链区块历史记录查询) 的API接口,以及库存等判断。

4.CouchDB有什么用?

用来存储本地区块链账本数据的副本,因为区块链是链表,查询效率低,CouchDB是一个分布式的文档型数据库, 区块链数据通常以JSON格式进行存储和交换,而CouchDB天生支持JSON文档的存储和查询。这使得CouchDB能够直接存储区块链数据而无需进行复杂的数据转换,简化了开发和集成的过程。CouchDB具有灵活的MapReduce查询引擎,可以对存储在其中的JSON文档进行复杂的查询和分析操作。这使得开发人员可以方便地进行区块链数据的查询和分析。

将CouchDB用于存储区块链副本而不是MySQL有几个原因:

  1. 分布式设计: CouchDB是一个分布式的文档型数据库,具有内置的复制和分片功能。这使得它可以轻松地实现区块链副本的分布式存储和复制,从而提高了系统的可用性和可靠性。相比之下,MySQL通常是单节点部署,需要额外的复制和分片方案来实现分布式存储,这增加了部署和维护的复杂性。
  2. JSON文档存储: 区块链数据通常以JSON格式进行存储和交换,而CouchDB天生支持JSON文档的存储和查询。这使得CouchDB能够直接存储区块链数据而无需进行复杂的数据转换,简化了开发和集成的过程。
  3. MapReduce查询引擎: CouchDB具有灵活的MapReduce查询引擎,可以对存储在其中的JSON文档进行复杂的查询和分析操作。这使得开发人员可以方便地进行区块链数据的查询和分析,从而实现更丰富的功能和应用。
  4. 高并发和扩展性: CouchDB的设计目标之一是高并发和水平扩展,可以轻松地处理大规模的数据和请求。这使得它适用于存储区块链副本,能够应对不断增长的区块链数据和用户请求。

综上所述,CouchDB作为一种分布式、灵活和高性能的文档型数据库,非常适合用于存储区块链副本。它提供了简单的部署和维护方式,同时具备强大的查询和扩展能力,能够满足区块链系统对于高可用性、可靠性和性能的要求。

数据上链及物资追踪模块

1.代码层面的实现过程

实现物资从入库、运输到分发的整个生命周期管理。编写智能合约代码,打包成链码,安装并部署到区块链网络。通过Java SDK 调用链码, 实现在区块链上记录每一笔物资的流动,确保物资的追溯可靠性和供应链的透明度,以提高捐赠者和受赠者的信任度。

2.Fabric网络架构

一个Fabric网络通常包含多个组织

每个组织有多个Peer节点,共享一个或多个Orderer节点来提供交易排序和区块打包服务。

peer节点又分为 背书节点 和 commit提交节点,其中背书节点用于提案(上链数据的操作)的身份验证 权限验证 以及交易的有效性,不同组织的背书策略不同;commit节点负责验证区块交易有效性,共识通过就将区块加入到该组织本地区块链上。

Orderer节点可以属于一个单独的Orderer组织,或由多个组织共享,不必每个组织都有。orderer节点用于对验证通过的交易列表进行排序并打包成区块,然后进入共识阶段,将区块广播给其他组织的peer的commit节点进行验证,只有有足够多的节点通过了这个提案达成共识,当前的orderer节点就会将这个提案通过的信息广播给所有组织,这样,所有组织(通过commit节点)都会将区块加入的各自本地的区块链账本上,保证了不同组织区块链账本数据的一致性。

Fabric搭建步骤:搭建流程

  1. 生成加密材料:使用cryptogen工具生成组织的MSP(身份校验 授权)和TLS(数据加密)材料。
  2. 配置configtx.yaml:定义组织的MSP和策略信息。
  3. 配置docker-compose.yaml:定义并启动OrdererPeer节点。
  4. 创建并加入通道:使用CLI命令创建通道并让各个Peer节点加入通道。
  5. 部署智能合约:编写、打包、安装并提交智能合约。
  6. 调用智能合约:通过Fabric SDK调用智能合约,实现业务逻辑。

3.结合Fabric网络实现数据上链的过程:

在一个物资管理系统中,假设有多个组织参与,每个组织都有自己的Peer节点和Orderer节点,彼此之间通过Hyperledger Fabric网络进行通信。以下是物资入库操作的整个过程:

  1. 客户端发起交易请求

    • 首先,某个组织的客户端(例如物资管理系统的用户)会发起一个物资入库的交易请求,请求将某批物资入库到系统中。
  2. 交易传递到客户端的Peer节点

    • 客户端所属组织的Peer节点会接收到该交易请求。
  3. 背书策略

    • 在交易被写入区块链之前,需要经过背书阶段。这个阶段涉及到与参与背书的各个组织的智能合约的交互。对于物资入库操作,可能会有多个组织参与背书,确保交易的有效性。
  4. 背书结果提交给客户端的Orderer节点

    • 一旦交易得到了足够的背书,客户端的Peer节点会将背书结果提交给所属组织的Orderer节点。
  5. Orderer节点进行排序和打包

    • Orderer节点负责将接收到的交易按照顺序打包成区块,并进行排序。
  6. 区块传递给各个组织的Peer节点

    • 一旦形成了新的区块,Orderer节点会将该区块传递给各个组织的Peer节点。
  7. 共识过程

    • 在交易被验证后,会进入共识阶段。在这个阶段,Orderer节点会协调各个Peer节点就交易进行共识,以确保所有节点都同意将该交易写入区块链。这个共识过程通常涉及到拜占庭容错算法(如Kafka或Raft)或其他共识机制,以确保网络中的每个节点都达成一致意见。
  8. 提交到本地账本

    • 一旦交易通过共识,Orderer节点会将交易打包成区块,并将区块广播给所有Peer节点。然后,每个Peer节点会将收到的区块验证后写入本地账本。这样做是为了确保每个节点都有一份完整且一致的账本副本,以保持系统的一致性和可靠性。

4.追踪模块的实现:

客户端可以通过调用区块链上的智能合约或者使用专门的查询接口来查询物资的溯源信息。这些接口可能会提供按照物资编号、生产日期、流通路径等条件进行查询,并返回相应的物资信息及其历史记录 交易的事务id。

数据可视化:获取到的物资溯源信息可以被客户端应用程序进行处理和展示。可以通过数据可视化的方式,以图表、列表等形式呈现物资的流通路径和历史记录,使用户能够清晰地了解物资的来源和去向。

溯源信息:

溯源信息则更加全面和深入,它不仅包括流通路径的信息,还包括关于物资本身的详细数据,如生产批次、生产日期、成分或原料来源等。溯源信息的目的是提供足够的信息来追踪物资回到其原始来源,这在食品安全、药品监管和高价值商品中尤其重要。它有助于验证物资的真实性和质量,确保符合安全标准。

RabbitMQ

1. 异步处理数据上链请求

物资信息更新到区块链是一个资源密集型的过程,可能需要一些时间来完成。使用 RabbitMQ,您可以将数据上链的请求异步处理:

  • 生产者:应用服务器接收到上链请求后,不直接调用区块链服务,而是将这些请求作为消息发送到 RabbitMQ。
  • 消费者:后端服务作为消费者从队列中拉取消息,并处理数据上链的过程,然后将结果通知到前端或进行日志记录。
  • 这种方式可以减少用户等待时间,提高用户体验,并通过背景处理提升系统的整体性能。

2. 事件驱动的通知

在物资管理和分发过程中,各个阶段完成后需要通知相关的利益相关者(如供应商、受赠者、监管机构等):

  • 使用 RabbitMQ 发布订阅模型,系统可以在完成如物资入库、运输、到达等关键节点时,发布消息到不同的消息通道。
  • 各利益相关者通过订阅相关通道,可以即时收到更新,从而做出响应或进行下一步操作。

消息队列

熟悉 RabbitMQ 的使用,有处理消息丢失重复消费消息顺序性问题,以及延迟队列的实现的实战经验。

1.RabbitMQ-如何保证消息不丢失?(重要)

主要从三个层面考虑:

第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据。

第二个是开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化。

第三个是开启消费者确认机制为auto,由spring确认消息处理成功后完成ack,当然也需要设置一定的重试次数,我们当时设置了3次,如果重试3次还没有收到消息,就将失败后的消息投递到异常交换机,交由人工处理。

2.RabbitMQ消息的重复消费问题如何解决的?(重要)

消费者是设置了自动确认机制,当服务还没来得及给MQ确认的时候,服务宕机了,导致服务重启之后,又消费了一次消息。这样就重复消费了

因为我们当时处理的支付(订单|业务唯一标识),它有一个业务的唯一标识,我们再处理消息时,先到数据库查询一下,这个数据是否存在,如果不存在,说明没有处理过,这个时候就可以正常处理这个消息了。如果已经存在这个数据了,就说明消息重复消费了,我们就不需要再消费了。

其实这个就是典型的幂等的问题,比如,redis分布式锁、数据库的锁都是可以的解决这个问题的。

3.其他的解决方案吗?

4.RabbitMQ中死信交换机 ? (RabbitMQ延迟队列有了解过嘛)(重要)

延迟队列就是用到了死信交换机和TTL(消息存活时间)实现的。

如果消息超时未消费就会变成死信,在RabbitMQ中如果消息成为死信,队列可以绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间,这样就实现了延迟队列的功能了。

我记得RabbitMQ还有一种方式可以实现延迟队列,在RabbitMQ中安装一个死信插件,这样更方便一些,我们只需要在声明交互机的时候,指定这个就是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对于死信交换机+TTL要省略了一些步骤。

5.如果有100万消息堆积在MQ , 如何解决 ?

我在实际的开发中,没遇到过这种情况,不过,如果发生了堆积的问题,解决方案也所有很多的

第一:提高消费者的消费能力 ,可以使用多线程消费任务

第二:增加更多消费者,提高消费速度

使用工作队列模式, 设置多个消费者消费消费同一个队列中的消息

第三:扩大队列容积,提高堆积上限

可以使用RabbitMQ惰性队列,惰性队列的好处主要是

①接收到消息后直接存入磁盘而非内存

②消费者要消费消息时才会从磁盘中读取并加载到内存③支持数百万条的消息存储

6.RabbitMQ的高可用机制有了解过嘛?

我们当时项目在生产环境下,使用的集群,当时搭建是镜像模式集群,使用了3台机器。镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节点,如果主节点宕机后,镜像节点会替代成新的主节点,不过在主从同步完成前,主节点就已经宕机,可能出现数据丢失。

7.那出现丢数据怎么解决呢?

我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft协议,强一致。并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定

这个是仲裁队列即可。

8.RabbitMQ,实现消息的异步解耦?

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

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

相关文章

象战----第十二届中山市邀请赛正赛

本次的题解一定让大家享受脑细胞碰撞与再生死亡的感受!定然酣畅淋漓!请耐心的读完 简称:让脑袋死机。。。 象战 老规矩先分析在打码: 注意到题目告诉我们:四个角落是不能放的 那么 我们设象在(i,j).(注意&#xff1a…

uniapp实现幻灯功能方法及代码

在 UniApp 中实现幻灯功能&#xff0c;通常可以使用 swiper 组件&#xff0c;该组件用于滑动视图容器&#xff0c;常用于制作轮播图效果。以下是一个简单的幻灯功能实现方法及代码示例&#xff1a; 步骤 1&#xff1a;在页面的模板部分添加 swiper 和 swiper-item 组件 <t…

解决双击bootstrap.bat没有生成b2.exe文件

双击bootstrap.bat但是并没有没有生成b2.exe文件&#xff0c;会报如下错误&#xff1a; "cl" 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。D:\cppsoft\boost_1_85_0\tools\build\src\engine>dir *.exe 驱动器 D 中的卷是 Data 卷的序列号是…

eNSP学习——配置基于全局地址池的DHCP

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、配置基于全局地址池的 DHCP Server 3、配置DHCP Client 主要命令 [R1]dhcp enable //开启 DHCP功能//创建一个全局地址池&#xff0c;地址池名称为huawei1 [R1]ip pool h…

Linux系统开机自启动脚本(案例:Raspberry Pi 4B脚本)

前言&#xff1a;本篇博客为手把手教学的 Linux 系统开机自启动脚本教程&#xff0c;且额外包含有 Raspberry Pi 4B 的开机自启动案例。日常工程项目中往往需要 Linux 系统能够自启动一些代码程序&#xff0c;本篇博客利用虚拟机下的 Ubuntu 自启动脚本来进行教学&#xff0c;且…

力扣240.搜索二维矩阵II

力扣240.搜索二维矩阵II 因为原数组是从上到下从左到右增加的 在左下(和右上角)时有特性&#xff1a;i减小则a[i]减小&#xff0c;j增大则a[j]增大因此从左下角开始遍历 找到结果return即可 class Solution {public:bool searchMatrix(vector<vector<int>>&…

vue canvas学习

说明 在vue里试用一下canvas&#xff0c;记录一下 代码 <template><div><canvas ref"canvas1" height"500" width"500"></canvas><button click"draw">画图</button></div> </templa…

深入解析Transformer:大模型核心技术揭秘

在大模型发展历程中&#xff0c;有两个比较重要点&#xff1a;第一&#xff0c;Transformer 架构。它是模型的底座&#xff0c;但 Transformer 不等于大模型&#xff0c;但大模型的架构可以基于 Transformer&#xff1b;第二&#xff0c;GPT。严格意义上讲&#xff0c;GPT 可能…

【网络安全的神秘世界】docker启动失败?看我如何成功启动

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 &#x1f64b;‍♂️问题描述 关闭docker后再启动就发现启动失败了 错误信息&#xff1a;Job for docker.service failed b…

2020C++等级考试二级真题题解

202012数组指定部分逆序重放c #include <iostream> using namespace std; int main() {int a[110];int n, k;cin >> n >> k;for (int i 0; i < n; i) {cin >> a[i];}for (int i 0; i < k / 2; i) {swap(a[i], a[k - 1 - i]);}for (int i 0…

Unity定时(延迟)管理器实现

前言 Unity中实现定时功能的方法有很多&#xff0c;比如协程、Update、Invoke、Async等&#xff0c;可以说是五花八门&#xff0c;对于这类实现方法多、需求频繁的功能还是需要一个管理器来统一处理。 功能 下面列出了该管理器支持的功能&#xff0c;可以根据根据所列功能判…

tron-passwd写入提权

troneasy敏感信息收集、Brainfuck解密、替换密码、ssh利用、passwd提权机发现 **后续需要虚拟机的私信我&#xff0c;我会打包进行文章发布链接&#xff0c;请持续关注&#xff01;&#xff01;&#xff01;** 主机发现 netdiscover -i eth0 -r 192.168.44.0/24端口服务 nm…

注解详解系列 - @Profile:基于环境的配置切换

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨Profile注解。Profile是Spring框架中的一个重要注解&#xff0c;用于根据不同的环境配置有选择性地启用或禁用特定的bean。通过Profile注解&#xff0c;可以方便地在开发、测试、生产等不同环境中切换配置。 注解定义 …

速盾:cdn加速什么好?

CDN加速是一种通过使用内容分发网络&#xff08;Content Delivery Network&#xff09;来提高网站速度的技术。在了解CDN加速的好处之前&#xff0c;首先需要明白什么是CDN。CDN是一种分布在全球不同地理位置的服务器网络&#xff0c;用于存储和交付网站的静态和动态内容。当用…

AI语言文字工具类API实现自动化的写作

热门实用的AI语言文字工具类API是当今开发者们追逐的宝藏。这些API利用先进的人工智能和自然语言处理技术&#xff0c;为开发者提供了一系列实用而强大的语言文字处理能力。这些API包括了文本翻译、情感分析、智能写作、关键词提取、语言检测等功能&#xff0c;使得开发者能够轻…

timescaledb:创建real-time aggregate

创建hypertable【chz_a】 create table chz_a (time timestamp,device_id int8, value double precision,primary key (time) ); SELECT create_hypertable(chz_a, by_range(time) );往表里面写入数据 # 当天的数据 insert into chz_a (time, device_id, value) values (now(…

【Python爬虫】爬取名人名言页面并进行简单的数据清洗(入门级)

目录 资源链接 一、网站选择 二、数据爬取要求 三、数据清洗要求 四、实现代码 1.数据采集 2.数据清洗 资源链接 下面有笔者所放的源码下载链接&#xff0c;读者可自行下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1YmTdlnbSJLvLrrx92zz6Qg 提取码&…

Python酷库之旅-第三方库openpyxl(03)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

DDA直线算法

理论部分 假设给定直线段的起点坐标 ( x 0 , y 0 ) (x_0,y_0) (x0​,y0​)和终点坐标 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​),则该直线的直线方程为: y = k x + b y=kx + b y=kx+b 其中 k = y 1 − y 2 x 2 − x 1 , b = y 0 − k x 0 k=\frac{y_1-y_2}{x_2-x_1},b=y_0-kx_0 k…

tdlib自定义Telegram客户端电报客户端

之前做过多个电报机器人 最近闲来无事,顺手了解了下tdlib,打算使用dart做一个pc和移动端的tg客户端,顺便解决官方无法下载某些视频图片文件的问题. 前期踩了不少坑,花了3天时间完成了pc端的基本功能 效果展示