# 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计算�
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java的区块链查询系统全部资料+详细文档.zip
共45个文件
java:19个
png:14个
txt:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 107 浏览量
2024-11-25
21:48:59
上传
评论
收藏 480KB ZIP 举报
温馨提示
【资源说明】 基于Java的区块链查询系统全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于Java的区块链查询系统全部资料+详细文档.zip (45个子文件)
CSDN
软件
项目授权码.txt 268B
付费资源基于区块链
项目授权码.txt 268B
blockchain-trace-main
mvnw.cmd 7KB
picture
10.png 34KB
9.png 12KB
3.png 18KB
12.png 35KB
1.png 24KB
11.png 29KB
13.png 32KB
6.png 83KB
5.png 30KB
4.png 16KB
8.png 46KB
7.png 34KB
2.png 17KB
14.png 36KB
pom.xml 4KB
src
test
java
com
example
blockchaintrace
BlockchainTraceApplicationTests.java 237B
main
resources
application.yml 0B
java
com
example
blockchaintrace
BlockchainTraceApplication.java 963B
controller
TestController.java 915B
pojo
TraceVO.java 523B
Trace.java 513B
Block.java 7KB
BloomFilter.java 4KB
KeyPairs.java 2KB
Information.java 1KB
BlockChain.java 1011B
service
BlockChainService.java 363B
impl
BlockChainServiceImpl.java 5KB
util
BlockUtils.java 2KB
KryoUtils.java 2KB
BlockChainIterator.java 1KB
StringUtils.java 2KB
SerializeUtils.java 902B
FileUtils.java 1KB
RocksDBUtils.java 4KB
LICENSE 11KB
.mvn
wrapper
maven-wrapper.properties 233B
maven-wrapper.jar 57KB
key.txt 635B
mvnw 10KB
.gitignore 395B
README.md 19KB
共 45 条
- 1
资源评论
Yuki-^_^
- 粉丝: 3100
- 资源: 321
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功