# 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计算�
Yuki-^_^
- 粉丝: 3112
- 资源: 4587
最新资源
- 汽车制动防抱死ABS仿真 MATLAB搭建电动汽车直线制动abs模型,采用逻辑门限值控制abs增压、保压、减压过程 仿真出图:制动力矩,制动时间、轮速、车速、滑移率等
- 非线性七自由度模型验证结果良好
- PLL 160M AMS仿真 gpdk 90nm 45nm 新旧两个版本 cadence管方学习教程电路 一百九十多页文档 还包括PLL的VerilogA完整的建模 都有testbench安装好就可以
- FPGA sobel 边缘检测 中值滤波 基于灰度图像处理 ,开发板采用正点原子的,摄像头为ov5640 只有源码只有源码只有源码
- 齿轮啮合刚度傅立叶级数展开程序,注释给全,附带一个例子
- multisim简易走廊声光双控延时照明灯电路仿真设计 功能: 1.白天有声音时,灯不亮 2.黑天,无声音时,灯不亮 3.只有在黑天且有声音时,灯亮起 4.声音消失后,灯亮一段时间后,自动熄灭
- bms动力电池管理系统仿真 Battery Simulink电池平衡控制策略模型 动力电池管理系统仿真 BMS + Battery Simulink 控制策略模型, 动力电池物理模型,需求说明文档
- HVDC-MMC互连(1000MW,±320KV)使用聚合MMC模型进行优化的SPS模拟 作者:Pierre Giroux、Gilbert Sybille、Patrice Brunelle 魁北克水电
- 5MW海上永磁风电直驱+1200V风电并网simulink仿真 采用矢量控制,混合储能采用超级电容与锂电池,采用滑动平均滤波算法分配高频与低频功率 有参考
- 燃料电池电池超级电容复合能量管理策略simulink仿真模型 燃料电池 电池 超级电容复合能量管理策略 1、传统PI; 2、等效燃油(氢)耗最低(ECMS); 3、等效能耗最低(EEMS); 4、分频
- 基于MATIAB的同步发电机突然短路的暂态过程的仿真 文档 模型 图 都有
- 单电阻foc版本STM32低成本MD500E永磁同步pmsm,单电阻foc,无感算法方案,高性价比变频器方案 md500e单电阻采样:精简移植了md500e的无感svc部分到f103中,值得研究学习
- 电磁力波阶次计算表,永磁同步电机径向电磁力波阶次数计算表 #永磁同步电机噪声分析
- multisim简易交通灯电路仿真设计 功能1: 1.状态00:东西方向绿灯亮,南北方向红灯亮,持续时间20s; 2.状态01:东西方向黄灯亮,南北方向红灯亮,持续时间5s; 3.状态10:东西方向红
- 三相维也纳Vienna架构SVPWM整流器Matlab仿真模型文件 PF大于0.99,THD小于3%, 输入380V输出800V纹波小于1v,功率30kw,SVPWM,羊角波马鞍波合成,中点电位平衡
- 双馈风机并网储能 电网频率一次调频仿真 双馈风力发电机结合并网储能系统实现电网频率支撑仿真,包含完整的MATLAB Simulink仿真文件,到手可运行 有一篇6页的英文参考文献,仿真模型采用的控制
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈