Java实现区块链 --- 原理篇

Posted 陈美丽工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现区块链 --- 原理篇相关的知识,希望对你有一定的参考价值。

什么是区块链?

区块链是由一个个记录着各种信息的小区块链接起来组成的一串链条,和链表类似,是一种数据结构。应用于未来互联化的社会。

区块链特性

去中心化:区块链是分布式存储的,不存在中心点,所有每个节点都可以是中心。在生活中像银行、支付宝就属于中心点。

开放性:区块链中的数据是公开透明的,每个人都可以参与进来。比如未来没有银行帮忙记账,我们的交易会记录在区块链中,里面有我们的交易流水,账户余额等,涉及到个人隐私的部分会加密。在共识的范围内,规则和机制完全透明,避免暗箱操作。

自治性:区块链采用基于协商达成一致的规范和协议(一套公开透明的算法)。比如一个画家想卖掉他的画,委托了一个画商帮他卖,约定卖出一幅画画商分得30%的佣金。这里就可能出现一个问题:(画商出售了10000块的画,给作者画家报价卖了8000,先吃掉2000,再加上8000的30%提成一共4400),但是使用区块链之后就不会出现这种问题,在交易之前会约定好,售价的30%做为佣金,这一条写入区块链之后就无法修改,画家就不担心暗箱操作的问题。

匿名性:区块链上的个人信息都是加密之后的,是一串数字和字母组成的字符串,不会出现信息泄露的问题。

区块链的结构

区块头(Head):记录当前区块的元信息。区块中包含上一个区块的标志位(可以是加密之后的字符串),即它链接在谁后面,本身的标志位,给下一个区块使用。

区块体(Body):实际的数据。每一个区块(大小1M左右),记录了一些信息,按照数据产生的时间顺序,存储在区块中。一个区块存满了,会生成一个新的区块,通过链(哈希指针)找到下一个区块。

区块链是如何工作

目前我们转账都是中心化的,银行是一个中心化账本,例如 A 账号里有 400 块钱,B 账号里有 100 块钱。当 A 要转 100 块钱给 B 时,A 要通过银行提交转账申请,银行验证通过后,就从 A 账号上扣除 100 块,B 账号增加 100 块。计算后 A 账号扣除 100 后余额为300元,B 账号加上 100 后余额为 200 元。

区块链上转账的步骤则是:A 要转账给 B 100 块钱,A 就会在网络上把要转账的这个信息告诉大家,大家会去查看 A 的账户上是否有足够的钱去完成这个转账,如果验证通过后,大家就把这个信息都记录到自己的电脑上区块链中,且每个人记入的信息都是同步一致的,这样 A 就顺利将 100 块钱转移到了 B 的账户上。(去掉了银行在交易中发挥的作用)

比特币技术原理----区块链的本质

比特币技术原理----区块链的本质 

比特币白皮书

2008年10月31日,一个密码学极客中本聪在“metzdowd.com(密码朋克)”网站的邮件列表中发表了一篇论文,题为《比特币:一种点对点式的电子现金系统》

 

创世区块

2009年1月3日,区块链里的第一个区块,创世区块被挖出。
他在区块中留下:The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.(2009年1月3日,财政大臣正处于为银行实施第二轮紧急救助的边缘.)
创世区块的哈希值为: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

 

比特币:点对对货币的开源实现

2009年2月11日,中本聪在P2P Foundation这个论坛上发布了一篇长文《比特币:点对对货币的开源实现》

他向大家宣布:
我开发了新的开源的点对点电子现金系统,叫做比特币。它是一个完全去中心化的,无需中央服务器或者受信任方,因为比特币的一切都是建立在密码学证明的基础上,而不是信任的基础上。

 

区块链 

区块链是由包含交易信息的区块从后向前有序链接起来的数据结构,其本质是去中心化的分布式账本。
 

单向链接性

对每个区块头进行 SHA256 二次哈希加密,可生成一个哈希值。 

区块头哈希值    Hash () = sha256(sha256((block_header))
每个区块链接到各自父区块的哈希值序列就创建了一条一直可以追溯到第一个区块(创世区块)的链条。(溯源)
 

 

最长链原则

由于最长链原则要想篡改数据需重新计算耗费巨大的计算量,所以一个长区块链的存在可以让区块链的历史不可改变,这也是比特币安全性的一个关键特征。(不可篡改)

 

区块

区块是一种被包含在公开账簿(区块链)里的聚合了交易信息的容器数据结构,由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。

 

区块头

区块头由三组区块元数据组成。
首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。
第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关。
第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构)。

区块头结构

 

构成区块主体的一长串交易

构成对应区块所有交易详情,以区块高度639230为例,在此区块发生的交易详情如下:

 

Merkle 树

Merkle 树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。

在比特币网络中,Merkle 树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。

当 N 个数据元素经过加密后插入 Merkle 树时,你至多计算 2*log2(N)次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。

 

起始时所有的交易都还未存储在 Merkle树中,而是先将数据哈希化,然后将哈希值存储至相应的叶子节点。以叶子节点分别是 HA、HB、HC 和 HD为例:
H~A~ = SHA256(SHA256(交易 A))

通过串联相邻叶子节点的哈希值然后哈希之,这对叶子节点随后被归纳为父节点。 例如,为了创建父节点 HAB,子节点 A 和子节点 B 的两个 32 字节的哈希值将被串联成 64 字节的字符串。随后将字符串进行两次哈希来产生父节点的哈希值:

H~AB~=SHA256(SHA256(H~A~ + H~B~))

 

 

为了证明区块中存在某个特定的交易,一个节点只需要计算 log2(N)个 32字节的哈希值,形成一条从特定交易到树根的认证路径或者 Merkle 路径即可。有了 Merkle 树,一个节点能够仅下载区块头(80 字节/区块),然后通过从一个满节点回溯一条小的 Merkle 路径就能认证一笔交易的存在,而不需要存储或者传输大量区块链中大多数内容,这些内容可能有几个 G 的大小。

 

Merkle 树和简单支付验证(SPV)节点

一个节点能够通过生成一条仅有 4 个 32 字节哈希值长度(总128 字节)的 Merkle 路径,来证明区块中存在一笔交易 K。该路径有 4 个哈希值(由蓝色标注)HL、HIJ、HMNOP 和 HABCDEFGH。由这 4 个哈希值产生的认证路径,再通过计算另外四对哈希值 HKL、HIJKL、HIJKLMNOP和 Merkle 树根(在图中由虚线标注),任何节点都能证明 HK(在图中由绿色标注)包含在 Merkle 根中。 

 

 注:本文虽然在别的论坛发表过,但属于原创,皆为作者喜欢数学的女孩同一人

以上是关于Java实现区块链 --- 原理篇的主要内容,如果未能解决你的问题,请参考以下文章

JAVA区块链项目实战

只用120行Java代码写一个自己的区块链

区块链记账原理

区块链记账原理

比特币技术原理----区块链的本质

比特币技术原理----区块链的本质