区块链是如何工作的——用JavaScript演示
段琰baby
发表于 2022-11-20 23:53:01
83
0
0
这听起来很棒,那它是如何工作的呢? {" j2 O# Z$ R N, c5 s
5 G: i5 _9 P% X% }7 d5 j) ?
为了说明区块链,我们将会使用一个名为BlockchainCLI的开源命令行工具。
我同时也建立了一个基于浏览器的版本) n4 V. z! c5 w+ u) l& @# J6 u
. a, Q! ^! D. `, g, u! z% d
安装命令行工具& F1 X# C5 d% F9 x5 L$ J0 l" Q
+ e) ^; }; f- m0 ?# F
在此之前请先安装Node.js- ^7 n' Q! y% b$ t
然后在你的命令行中运行以下指令:
npminstallblockchain-cli-g
; P% e: x( M. U, m2 U: j
blockchain
- ?: I+ F! F5 [ r/ S& ]
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。
1 J5 W# R+ i/ n7 n
区块长什么样?: i) L( v8 [$ ^8 ^" f9 f5 h- B
|) ^7 y9 {# @. z y+ u/ D/ k+ @
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。' ~: z6 [' D1 y7 D/ x
; Z! G4 Y) e; `0 `& P$ m
Index:是哪一个区块(创世块的索引是0)
Hash:块是否有效?! h5 B! G, @; c
PreviousHash:前一个区块是否有效?
Timestamp:什么时候添加的区块?0 ]" Q+ d S( K3 _9 k$ L$ T
* u/ c/ Z6 ^9 l" z7 x$ X
Data:什么信息存储在区块上?& ]# g9 G- a K9 y/ h
7 C* s$ z/ \' J3 Z
Nonce:在找到有效区块之前,我们进行了多少次迭代?
( _ v9 P! k! V; Y
创世块+ x; J4 M1 p9 X% v+ I
0 x- O" V( H% ]8 E+ l0 b5 F: A
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。
2 T6 J9 y& ~' S% ~
当一个新的区块被开采时会发生什么?
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
: g" t+ ^4 f6 d3 h+ S+ ~) n' O
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。
Index:0+1=1
PreviousHash:0000018035a828da0…
Timestamp:区块被添加的时间
4 f, U4 L( U3 w- M$ C5 p& z
Data:freeCodeCamp, r" q* N1 q4 d% V4 O3 ]
Hash:???
Nonce:???
Hash是如何计算的?( C9 \) Y. [6 D1 i2 z0 h1 T& \! w
9 B; j$ I3 u& V6 N; X
哈希值是唯一标识数据的固定长度的数值。
]' u. ?( P( r" \* ~
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)
% ?+ i, f3 z+ o6 M7 k& C
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
你是否注意到区块Hash中的四个前导0?1 F& u0 D% `: K
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度# J% n A& Q3 K- c
3 O8 }. W- W: ~ V0 M2 x' l1 c
functionisValidHashDifficulty(hash,difficulty){
for(vari=0,b=hash.length;i=difficulty;: E8 _( k1 C! W
4 J4 j' X% d' m7 H7 }
}
这也被称为工作证明系统
Nonce是什么?6 l, B/ `) g P2 l# t
Nonce是用来查找一个有效Hash的次数。
letnonce=0;
lethash;
0 q; f9 ]9 L& i
letinput;7 g9 x$ b; O; \* U
9 E& u3 o0 b$ X) Z& P r
while(!isValidHashDifficulty(hash)){ n [+ W9 N* U' s- C+ _
* `7 u4 M6 G0 \( B8 F
nonce=nonce+1;% N- {; ]- P/ w( p( z. o
input=index+previousHash+timestamp+data+nonce;# S( a2 _3 y$ A9 `6 R9 P6 a
hash=CryptoJS.SHA256(input)- e) N$ n" j% I; l$ h
}
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
' m, b/ q3 W9 X6 K% s
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。( ~5 t* [# b& s2 q- E: z
为什么这么重要?7 m" z' F" {$ F' l
2 v2 g9 Q) b# Y6 ~$ m* s5 m0 Y
这些机制非常重要,它们使区块链不可变。
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?
区块A上的数据改变了。6 D6 |3 Y3 r! u% P5 z1 k5 {
' L) u f+ b) N3 |/ {* Y$ C) u
区块A的hash改变了,因为数据被用来计算hash。* E: ^2 d& g9 K- n; O7 F; x
区块A失效了,因为它的hash不再有4个前导0。
, Y: J/ g1 y7 R1 f+ m1 B
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。& K. `' W1 G- R d* S5 S' ^( x ~
8 V- H7 Z9 J; g8 r
区块B失效了,因为它的hash不再有4个前导0。( w, B/ q9 H, A" V
, e3 X9 l5 l* s2 N
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。6 e$ Y. R, r2 j! B g
! F: @( `$ X: H6 Z3 |
区块C失效了,因为它的hash不再有4个前导0。
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。
我希望这个教程能够对您有所帮助!9 Z/ i% B! w3 Z4 B& |3 t! M1 S4 ~
+ p8 h0 \% J+ v' e- q
安装命令行工具: t% g% a3 R. V# \5 m( ?
/ M! d. s$ ]. d% A5 |2 v+ |8 w
在此之前请先安装Node.js
然后在你的命令行中运行以下指令:
npminstallblockchain-cli-g$ @4 R( ^1 _+ u2 X \
blockchain
# X+ _2 Z# J7 D
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。- s, n6 x7 ?) g: C) M/ o
9 f |/ d. W5 B5 |+ F _
区块长什么样?
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。$ D0 w. g/ ?' b
Index:是哪一个区块(创世块的索引是0)?" V- T7 c9 w; b/ [ z5 N
Hash:块是否有效?* \, ^* g5 l# M
PreviousHash:前一个区块是否有效?1 m& _0 M2 h4 f2 c8 j0 u9 {! A: o
Timestamp:什么时候添加的区块?
o/ z0 F# v! Q$ G1 `2 l
Data:什么信息存储在区块上?+ p# h5 L! M( m5 G5 |
/ V! O8 `, P; p5 V+ `- j; I
Nonce:在找到有效区块之前,我们进行了多少次迭代?8 u$ I: |9 F% u) e
创世块7 D- W* ?# S' e$ g3 x+ ~) z
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。8 U B, |& ?, z$ e! M4 b: F
D" a6 v" I" p3 C# W! J, W8 K
当一个新的区块被开采时会发生什么?/ @/ C# B; i+ ? A$ q* z: Z, Q& g
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。. q+ W8 }: E# N
) h# |+ n1 ^2 A! P) o! n5 F
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。( t8 r# K9 E/ j' Q) r
- ~5 h' B% C$ u9 W& h
Index:0+1=1
$ J; g8 d# f) P! t7 r. T! W/ Y
PreviousHash:0000018035a828da0…
' K4 | H/ _4 T( `5 f5 T- [* ~2 q/ d
Timestamp:区块被添加的时间
, _! j, c1 {9 C8 L( E0 Z. f7 G+ ?
Data:freeCodeCamp, X& h7 l$ F& I) r3 o, L
Hash:???
Nonce:???6 u: l$ U. B, t( u
# f3 }$ p, p& e( @ S
Hash是如何计算的?( T' q; F' n% L* t6 ~& l
# \3 y/ ?/ ]2 U; L* p+ @8 g$ ~
哈希值是唯一标识数据的固定长度的数值。
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。1 O9 E" Z$ T+ m$ n0 U( }& Q
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)
' Z' w2 u8 Z! I, c
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
你是否注意到区块Hash中的四个前导0?
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度 `5 i5 Q7 ]3 y1 [ a, W j
functionisValidHashDifficulty(hash,difficulty){
9 S) B% U9 Z7 E; f1 Y$ s* F5 t
for(vari=0,b=hash.length;i=difficulty;* K1 h" w) `* w k& p" W
1 O. ?. O8 _8 A3 e% Y
}2 Q) s) Q0 p0 ?2 p
这也被称为工作证明系统4 }1 d$ G7 j! W
! g }7 f9 x; k0 u! y) Y
Nonce是什么?
Nonce是用来查找一个有效Hash的次数。
letnonce=0;. ^! U9 w* V. a, D
lethash;
6 B% Z9 S: P u* J' y7 O8 j- `6 B1 u
letinput;
% N# U2 o% r) u1 D* A$ d
while(!isValidHashDifficulty(hash)){6 M- E+ {) z9 h3 P
nonce=nonce+1;
7 S) F- j8 l! o" O9 J
input=index+previousHash+timestamp+data+nonce;% O' i. ?" K" W
& K N1 f: K* ^& Z1 h% S
hash=CryptoJS.SHA256(input)
}
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。. \! F; N# ?8 u5 C- o: N3 [* c
2 B' x& @) z4 }% ^, z5 ~$ w4 A5 N) l/ p
为什么这么重要?" f' T) `1 c/ I! D# h8 H' u: H
这些机制非常重要,它们使区块链不可变。
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?
, L3 v& C. r5 z* c3 U p8 P/ J
区块A上的数据改变了。4 F7 m- A1 ^# J
$ c2 M: u- j- y" q- x# A( ?
区块A的hash改变了,因为数据被用来计算hash。
( c9 ]# u; [9 g: f
区块A失效了,因为它的hash不再有4个前导0。
& d1 [% F+ F8 d- D- ~# } d
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。 N) b1 C6 D$ o$ w5 t
# i0 ~6 n6 O2 T6 Q5 N
区块B失效了,因为它的hash不再有4个前导0。& l; [) v8 O6 q4 J7 R7 q6 O6 M& a
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。& L" y& p, n. m8 W8 h
区块C失效了,因为它的hash不再有4个前导0。
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。6 T( @4 `& r" W. y% I
成为第一个吐槽的人