3分钟通过一个App的演示深入理解区块链运行原理
文章分类:APP热点新闻 发布时间:2018-01-10 原文作者:Shi Yongfeng 阅读( )
安装命令行工具
-
打开终端,输入
npm install blockchain-cli -g
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
-
终端输入
blockchain
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
区块(block)长什么样子?
在blockchian ->
后面输入blockchain
或者bc
查看创始区块结构。
-
Index (Block #):
第几个区块? (创世区块链的索引为0) -
Hash:
当前区块的hash值 -
Previous Hash:
上一个区块的hash值 -
Timestamp:
当前区块创建时的时间戳 -
Data:
存储在当前区块上的交易信息 -
Nonce:
在找到有效区块之前,我们经历的迭代次数
创世区块(Genesis Block)
每个区块链都是由一个创始区块「�� Genesis Block」
开始。后面你所看到的区块都依赖于上一个区块。因此,创始区块是我们挖取第一个区块的基础。
当一个区块挖矿时都发生了什么?
我们在blockchain →
中输入mine liyc1215
,「liyc1215
是春哥微信号,添加我微信,拉你进区块链技术交流群」挖取我们的第一个区块。
-
Index:
o+1 = 1 -
Previous Hash:
0000018035a828da0… -
Timestamp:
这个区块创建的时间 -
Data:
liyc1215 -
Hash:
?? -
Nonce:
??
Hash是怎么计算的?
Hash
值是一个十六进制
固定长度为64位
的唯一的标识。
hash
值是由index
, previous block hash
, timestamp
, block data
, 和 nonce
作为输入数据计算而得。
- 1
The SHA256 algorithm will calculate a unique hash, given those inputs. The same inputs will always return the same hash.
SHA256
算法将根据给出的输入数据计算出一个唯一的hash值,只要输入值不变,永远返回相同的结果。
输入数据为liyc1215
时,它的hash值永远为dca0762d726738ebb8e6b7b43a4ba4186588a1b711f94ba9c694bffda8fcccf9
你是否注意到块哈希中的四个前导0?
四个前导0是有效散列的最低要求。 所需的前导0的数量称为难度
。
下面的方法验证hash难度是否有效。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
这就是我们所熟知的工作量证明系统 - Proof-of-Work system。
什么是nonce
?
nonce
是一个用来找到满足条件的hash
值的数字。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
nonce
值一直迭代,直到hash
值有效为止。在我们案例中一个有效的hash值是最少有4
个前导0
。找到nonce
值以满足合适条件的hash
值的过程就叫做挖矿。
随着难度的增加,可能的有效散列数减少。 使用较少可能的有效散列,需要更多的处理能力才能找到有效的散列。
Hash为什么如此重要?
hash
散列很重要是因为它可以使区块链不能被改变。
如果我们有三个区块链1 -> 2 -> 3 -> 4 -> 5
,当某个人想要试图修改区块A时,下面几点将是会发生的几种情况。
- 区块3上的区块链被修改。
- 区块3上的hash值将发生改变,因为hash值是通过数据计算而得。
- 区块3变得无效,因为它的hash值不再具备4个前导0的条件。
- 区块4的hash值将发生改变,因为区块3的hash值用来参与计算区块4的hash值。
- 区块4变得无效,因为它的hash值不再具备4个前导0的条件。
- 区块5的hash值将发生改变,因为区块4的hash值用来参与计算区块5的hash值。
- 区块5变得无效,因为它的hash值不再具备4个前导0的条件。
如果想要无效的区块3、4、5
变得有效,必须从区块3开始再一次重新依次挖矿,当你的区块链足够长,节点足够多时,就算你将这条链上的区块链改变并且重新挖矿成功,但是因为超过50%的节点的数据和你的节点的数据不一致,你这个被改变的节点的数据也依然无效。
在这个demo的演示中,一共有三个节点,我修改了节点2的区块链5并且重新挖矿取得合法的hash值,但是因为节点A
和节点C
中区块5的hash值为0000e4b9052fd8aae92a8afda42e2ea0f17972ea67cead67352e74dd6f7d217c
,而节点B
中的hash值为0000184634edadb8fc7f4bdee87aa9d7d2a46b0c26db221998e35c1f57c0b42c
,少数服从多数,所以以节点A和C的区块数据为准。