# blockChain_java **Repository Path**: zj-zhangjie/blockChain_java ## Basic Information - **Project Name**: blockChain_java - **Description**: 这是一个使用Java语言编写的区块链实例程序 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-01-17 - **Last Updated**: 2021-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java简单实现区块链 1. [【译】用Java创建你的第一个区块链-part1](https://longfeizheng.github.io/2018/03/10/%E7%94%A8Java%E5%88%9B%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%BA%E5%9D%97%E9%93%BE-part1/) 2. [【译】用Java创建你的第一个区块链-part2:可交易](https://longfeizheng.github.io/2018/03/11/%E7%94%A8Java%E5%88%9B%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%BA%E5%9D%97%E9%93%BE-part2/) # 区块链数据结构 区块作为区块链的基本结构单元,由包含了三组元数据的**区块头**和包含交易数据**区块体**两部分组成(由于不同区块链系统采用的数据结构会有不同,所以下面以比特币为例)。 ![image.png](https://images.gitee.com/uploads/images/2020/0117/201713_0dc8ccbd_5421355.png) ## 区块头 区块头主要包含的三组元数据分别是:(1)用于连接前面的区块、索引自上一区块的**哈希值**;(2)**挖矿难度**、**时间戳**、**Nonce**(随机数,用于工作量证明算法的计数器,也可理解为记录解密该区块相关数学题的答案的值);(3)能够**总结**并快速**归纳**校验区块中所有交易数据的**Merkle****(默克尔)树根数据**。当然区块头不仅仅包含这些元数据,还有其他比如:**版本号、难度值**等(以上这些生涩的名称不懂没关系,后面几篇文章都会分析这些技术)。 从这个结构来看,**区块链的大部分功能都由区块头实现。** ## 区块主体 区块主体所记录的**交易信息**是区块所承载的任务数据,具体包括交易双方的私钥、交易的数量、电子货币的数字签名等。 # 区块链的形成 在当前区块加入区块链后,所有矿工就立即开始下一个区块的生成工作:(1)把在本地内存中的交易信息记录到区块主体中;(2)在区块主体中生成此区块中所有交易信息的Merkle树,把Merkle树根的值保存在区块头中;(3)把上一个刚刚生成的区块的区块头的数据通过SHA256算法生成一个哈希值填入到当前区块的父哈希值中;(4)把当前时间保存在时间戳字段中;(5)难度值字段会根据之前一段时间区块的平均生成时间进行调整,以应对整个网络不断变化的整体计算总量,如果计算总量增长了,则系统会调高数学题的难度值,使得预期完成下一个区块的时间依然在一定时间内。 # Java实现 ## part 1 部分 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0117/201727_9ec4f290_5421355.png "屏幕截图.png") ## part 2部分 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0117/201741_55e2da7a_5421355.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/0117/201752_7f5dc4c1_5421355.png "屏幕截图.png")