# blockchain-trace
该项目是使用Java实现区块链的一个学习项目,只限学习使用。
主要使用了Java1.8,mysql8,Rocks,其他的所需的依赖全在pom文件里面。
- 最新一次提交弃用了数据存mysql里面的做法,全存在Rocks里面,如果想参考数据存数据库的做法可以查看历史的commit记录
- 数据库代码为:
~~~ mysql
create database block;
use block;
create table traces(
hash varchar(256) primary key not null ,
productName varchar(40) not null ,
productPlace varchar(40) not null ,
productTime varchar(40) not null ,
producer varchar(40) not null ,
distributor varchar(40) not null ,
distributeTime varchar(40) not null ,
retailer varchar(40) not null ,
retailTime varchar(40) not null,
recordTimeStamp varchar(40) not null
);
~~~
- 该项目使用了,椭圆算法对数据进行签名加密,在取回数据时再方向进行签名的验证来判断数据的真实性。
- 在区块的内部Merkel树结构进行了优化,在每一个节点上新增了一个布隆过滤器,以在查找时对数据进行快速进行判断是否存在。
伪代码:
~~~ java
输入:产品序列号
输出:产品具体信息
Information find(String serialNumber){
for(Block block: Blocks){
if(区块头的布隆过滤器包含serialNumber){
Node node = root;//root为merkle树根节点。
if(node不是叶子节点){
if(node.left节点布隆过滤器包含serialNumber){
node = node.left;
continue;
}
if(node.right节点布隆过滤器包含serialNumber){
node = node.right;
}
}else{
return node.information;
}
}
}
return null;
}
~~~
在查找的过程不断剪枝以提高查询效率。
- 在最新一次提交新增了ArrayList结构来保存每一区块,在查询时只需查询ArrayList。而原先的使用RocksDB用前后hash值进行迭代方式历遍区块方式弃用。
# 详细思路
## 1.1 传统区块链查询方法
### 1.1.1 传统区块链结构
目前主流区块链系统的区块基础结构[10]如图1所示,在区块头中包含三组数据。第一组是通过哈希计算得出的Current Hash和指向父区块的Pre Hash,其值为父区块的Current Hash。通过Current Hash和Pre Hash链接区块链中的当前区块和前一区块;第二组由随机数(Nonce)、难度目标(Bit)和时间戳组成。这组数据与区块挖掘有关。随机值定义了区块挖掘难度,难度目标是指给定难度目标的Hash值,时间戳是指区块生成的时间,精确到秒;第三组数据是Merkle树根,它是本区块所包含的所有交易对应的Hash值两两循环计算得出的Hash值。
![avatar](./picture/1.png)
图 1 比特币区块结构图
在进行交易验证时可以通过计算Merkle Tree Root的hash值来确认区块中的数据是否合法,有无被篡改。假设交易Tx1交易出了问题时,则可以通过Merkle Tree Root到Hash1 2到Hash1最后到Tx1的这条Merkle proof来进行非法数据的定位。
### 1.1.2 传统区块链查询方法
在传统块索引结构的基础上,深入研究了传统区块链查询方法[11],并给出了算法实现。通过对时间复杂度的计算,指出了传统区块链查询方法的不足之处,与之后的优化方法进行对比,体现优化后的方法具备的使用价值。
如图2所示,为区块链结构。区块链是由区块的Hash值相链接一起的一种链表结构。当前的区块链索引结构只支持相对简单的查询,并且只支持基于唯一标识Hash值的查询。在区块链的链表结构中的查询某一数据最坏情况需要历遍整条区块链的数据才能查到数据,最优的情况只需要访问最新区块就可以查到,故其时间复杂度为O(N),其中N为区块数量。找到对应区块后需要历遍区块体中的Merkle树结构的叶子结点,最后找到对应数据。在历遍Merkle树叶子结点需要的时间复杂度为O(2(n-1))其中n为交易数量。故总的查询时间复杂度为O(2(n-1)N),忽略常数项则查询时间复杂度为O(nN)。
![avatar](./picture/2.png)
图 2 区块链结构示意图
区块链的传统查询算法如,算法1所示
~~~c++
算法1: 基于传统区块链结构的溯源查询
Require: Hash value h of transaction ticket number of transaction
Ensure: Details of transaction result
1. initialize the storage transaction details array result;
2. n = Block().num;
3. while n > 0 do
4. for j = 0 to block[n].transaction.num then
5. if h == block[n].transaction[j].hash then
6. result.add( Block[n].transaction[j]);
7. n--;
8. end
9. end
10. n = n – 1;
11. end
12. if result.num == 0 then
13. return None;
14. else
15. return result;
16. end
~~~
算法1先初始化了存储结果数据的数组result;在之后的外层while循环进行对区块的历遍,在内层的for循环中历遍该区块包含的交易数组。若找到结果则将数据存入result中。若result数组包含数据量为0则返回空的结果,表明未查询到数据,否则输出result数组。
## 1.2 基于优化区块链底层结构的溯源查询方法
为了在优化区块链查询性能的目标基础上保证区块内数据的不可篡改性与可验证性,同时不增加区块链系统的复杂度。本文选择从区块链底层的数据结构入手,以改善区块链的溯源查询性能,拓展其查询功能。
### 1.2.1 优化区块链结构的溯源查询方法
区块链的链表结构主要是通过前后区块的Hash指针值进行匹配链接,是为了保证区块链的不可篡改性与安全性。而区块对应的Hash值是通过区块内部本身数据计算得出的,再加上区块链上的区块是按照时间顺序添加到区块链上的。由此可以将“链”这一结构抽象化,把区块视为一个整体对象,区块链为一个包含合法区块的可变长数组。如图3所示:
![avatar](./picture/3.png)
图 3 区块链结构转换示意图
将链表结构转为数组结构,数组中存储“区块”对象,根据区块头中的前区块Hash(Pre Hash)和当前Hash(Current Hash)进行抽象的“链接”。将“链”的概念抽象化,由于Pre Hash和Current Hash都是根据区块数据计算得出的,所以该方案同时也保证了数据的不可篡改性。其中区块所存数据(data)具体为如图1所示。
由于将区块链底层改成了数组结构,访问区块链任意区块的时间复杂度的从O(c1n)变为O(c2n),n为区块链包含的区块数量,c1,c2为常数项,其中c1小于c2,优化了区块链的查询性能,还使得其有了随机访问任意区块能力。
同时在区块链系统中引入了缓存池的概念,假设一件商品有生产、分销、零售等流程。则设立生产缓存池,分销缓存池,分别保存商品从生产数据,分销数据。当有商品成功零售的时候,则将对应商品的生产缓存池和分销缓冲池中的商品数据取出与零售数据构成完整的溯源数据再将完整的溯源数据进行上链。这样在进行溯源查询时无需历遍全部区块的数据,只需要找到存在的唯一完整的溯源数据,减少了区块的查询次数,优化了区块链溯源查询性能。
### 1.2.2 优化Merkle树结构的溯源查询方法
Merkle树[12]本质是一种二叉树结构,曾经在文件系统和P2P网络系统中广泛应用。
如图4所示,Merkle树具备以下特点:Merkle树的叶子结点存储数据或其对应Hash值;Merkle树的非叶子结点存储由其子结点中数据通过Hash计算�
Kwan的解忧杂货铺@新空间代码工作室
- 粉丝: 4w+
- 资源: 3731
最新资源
- COMSOL混凝土碳化模型 PDE模块建立多场耦合下(湿度,温度,荷载)的混凝土碳化模型
- 基于Vue技术的鲜花订购系统设计与实现源码
- 锂离子电池 锂电池1.5GB资料大全 一个真正的能够带你从入门小白到高级工程师的锂电资料(自己本人锂电池资深工程师) 资料非常全,从锂电基础知识到,正负极,电解液,隔膜让你全方面了解锂电行业,并且包含
- 基于Laravel的PHP后台管理框架设计源码
- Govers Francis III - Artificial Intelligence for Robotics, 2nd Edition - 2024
- 20250103孙明正
- 同步发电机(VSG)并网MATLAB仿真模型 波形正确,包含有功-频率、无功-电压、电压电流双闭环、阻抗部分 需要的直接即可,看到马上,不,具有可复制性,出不 不,望理解 同步发电机仿真 VSG仿
- 基于C#和Vue的现代化仓库管理系统设计源码
- Buck-Boost双向DC-DC电源整套学习资料 功能:采用STM32F334C8T6芯片,能够根据输入电压和输出电压的大小关系,实现自动切工作模式,将参数信息进行显示,并且可以实现稳压输出 程序
- fd31c4f1816e5c0c15b04d06dc9e40b6.zip
- 基于Vue的轻量级视频播放器设计源码
- 基于Vue框架的基金助手设计源码,实时查看自选基金估值情况
- 配网10kV小电流系统接地故障 Simulink仿真 用simulink搭建仿真模型,对10kV配网系统接地故障时的故障进行仿真 1.中性点直接接地 2.中性点通过消弧线圈接地
- 基于Lua内置模块的Protobuf反射与数据结构转换设计源码
- 基于Vue的edison-uniapp UI组件与页面模板设计源码分享
- 基于JavaScript、CSS、HTML的逊克县农业农村大数据平台引导页面设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈