区块链是如何工作的——用JavaScript演示
段琰baby
发表于 2022-11-20 23:53:01
86
0
0
这听起来很棒,那它是如何工作的呢?
为了说明区块链,我们将会使用一个名为BlockchainCLI的开源命令行工具。
我同时也建立了一个基于浏览器的版本
安装命令行工具0 }8 H: P3 J8 i5 c
在此之前请先安装Node.js1 J' j/ t7 |) d& B7 W
2 @9 y! g+ o$ v1 n& S
然后在你的命令行中运行以下指令:
npminstallblockchain-cli-g
: O- ~2 ] G2 Z7 j
blockchain
% K9 H. U) n; A Q- x
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。) D J s# W7 } |9 m' G1 w
$ |1 O: b, ~8 j b+ t! @1 K
区块长什么样? I; a* T( z+ h; U
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
Index:是哪一个区块(创世块的索引是0)
3 A) N' _8 P' i! {5 {5 ?0 z5 d P
Hash:块是否有效?$ K/ _; Z' b6 S4 S8 l/ p& u5 N# t# S
PreviousHash:前一个区块是否有效?
Timestamp:什么时候添加的区块?. ~1 |7 e, }3 H% u7 r) Y
Data:什么信息存储在区块上?7 d2 ^/ A, g3 W$ d
Nonce:在找到有效区块之前,我们进行了多少次迭代?' B# ?# t( x! i. K o) x6 f0 D
创世块
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。# I8 f# R& O" g; V
当一个新的区块被开采时会发生什么?
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。4 k" N& T0 I( D2 h1 j( r
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。
+ X$ P8 o: R& L1 {/ h; u
Index:0+1=1
% V3 u0 b( h' d: S* o: D
PreviousHash:0000018035a828da0…
' C7 a8 [2 a) D) Y* p
Timestamp:区块被添加的时间6 \+ O7 a H( z4 _$ R6 Y3 U7 a, a
Data:freeCodeCamp
- e: n! l3 @+ q
Hash:???
e$ ?$ \% Z9 A* o, f v
Nonce:???
Hash是如何计算的?
哈希值是唯一标识数据的固定长度的数值。$ L9 s9 D( \! \! U y8 Y
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。
8 i0 a" A( C& Q: W6 L' o2 ^
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
1 O6 d7 T/ ^! `3 T& R+ N* T
你是否注意到区块Hash中的四个前导0?
2 Y4 z, j3 }; l; s5 m
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度) X1 ~9 o. `& G2 b i& o1 ^& E4 u
- \9 Q; A) y! I" O- {
functionisValidHashDifficulty(hash,difficulty){
2 s x% ?# r, J2 H* g! C) T
for(vari=0,b=hash.length;i=difficulty;
! W! D4 J/ m, l& O( T: S8 `' e- F6 p
}
# x+ i; |; f9 C4 Y# f% W) o+ `
这也被称为工作证明系统
Nonce是什么?9 `3 s6 w, q1 ^2 v% L
Nonce是用来查找一个有效Hash的次数。
" M) }# I- o+ R( V5 ^* ?2 o
letnonce=0;3 U7 |; T* I3 g/ L. c& c
) a2 W) T( j7 y' R: e" a
lethash;1 e' t5 _; ~% S* ?
+ ?4 f* H; u) n3 ~ p2 R2 u* N
letinput;. Y* Q) G I9 L% h
while(!isValidHashDifficulty(hash)){' n; }( o1 |4 N- |4 P ~! m" L' o
nonce=nonce+1;8 F7 W: J2 X9 x/ w
# x- B$ O* F) F6 t* N
input=index+previousHash+timestamp+data+nonce;) I* h F: f1 F' l; `$ I/ B
/ J* X6 Q) q' U6 y" x/ c
hash=CryptoJS.SHA256(input)0 ~9 V- Y3 j; H. H! V2 d2 |2 N
2 e2 p$ r" r# E8 ~$ N
}
0 l' M+ p" I1 R6 j- \$ z+ v
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
3 x4 f" i) p6 E5 J# G' p) T/ y
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。$ I$ a- @# L$ q
* S5 m9 g+ K" D: F* g% @; N
为什么这么重要?2 d; m0 S0 o6 f% N
4 s5 p f; ]7 a8 s9 J. i
这些机制非常重要,它们使区块链不可变。
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢? {9 m4 a; q& s* K
& @7 [6 h0 z' }9 W7 j
区块A上的数据改变了。
u/ t; V2 w) ?( d
区块A的hash改变了,因为数据被用来计算hash。
区块A失效了,因为它的hash不再有4个前导0。) w3 O: L0 s4 }% b7 d: Y: w
5 U! }0 z; t0 s, ]8 F
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。; T' {7 d/ a; \% f7 H9 z& Y
区块B失效了,因为它的hash不再有4个前导0。3 W' d) b* \9 h2 `
# Q: M$ y9 W; l! T' `; p
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
区块C失效了,因为它的hash不再有4个前导0。
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。' Y3 W4 ]2 n9 |8 @6 i
- a. ]# x; Z, f& z! |9 g D. X( J0 c
我希望这个教程能够对您有所帮助!
安装命令行工具# {0 K1 P L- ]% g- d4 u
. e: o( ]5 P) _& d
在此之前请先安装Node.js
; Z% X# C6 U/ ?' j
然后在你的命令行中运行以下指令:2 d8 z1 L- M1 v' w7 q$ v
npminstallblockchain-cli-g/ [* X. ^: l: ?4 B w
) a: V) f4 R) W8 v5 Q- g% B
blockchain
5 y; t" Q3 o: N, L5 f0 X* v1 f3 c
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。
- d' N4 }1 p9 R( P) E! O
区块长什么样?0 E' S# u2 T1 M1 c
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。! j7 B: @+ y* w. n3 v
8 b" Q" C( `7 {8 m7 w
Index:是哪一个区块(创世块的索引是0)?
Hash:块是否有效?
PreviousHash:前一个区块是否有效?
Timestamp:什么时候添加的区块?0 `1 Z8 t9 j0 K0 w B$ L& P
: N6 p; I' `. @( @
Data:什么信息存储在区块上?' R0 t8 D0 t3 H" r( j
6 J9 g9 o: E* O3 q: v3 [
Nonce:在找到有效区块之前,我们进行了多少次迭代?- G! f: }7 o* A9 {4 {8 z( N" D
创世块
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。$ d8 L0 N! x7 V, W9 P
当一个新的区块被开采时会发生什么?- v) P. V: K) B4 U, X3 `
- U4 l4 x) e. F6 L$ r6 o: m0 ~
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。
Index:0+1=1; ]6 w3 K. I( T% D/ q* x
, Y! a" s I% }- C
PreviousHash:0000018035a828da0…
Timestamp:区块被添加的时间9 ~5 n/ a/ I( [: E ?
Data:freeCodeCamp
# k$ |, A' C' D
Hash:???9 F1 Y' _# A2 ]
8 G3 G: Z3 _7 W: o# A
Nonce:???+ Y1 z. A% q; p
Hash是如何计算的?
哈希值是唯一标识数据的固定长度的数值。! F: A( F. z3 s) @
( d$ q, D* q9 T' n" u' z' H
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。5 ~' n E, Z( d1 F: e; }1 o. x
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)2 m6 }. r4 o- e( a( I2 }
- i1 |7 M% ~& J2 z4 d1 q
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
你是否注意到区块Hash中的四个前导0?) K/ ^! G8 M- L p5 T
. ^4 {* \* v" t0 [" b3 m
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度
functionisValidHashDifficulty(hash,difficulty){
% ?% [. B. V- a7 M( ~
for(vari=0,b=hash.length;i=difficulty;) P. m/ Z& y* H; ~6 S: P/ U" p, p
" u( T5 p6 K1 v" Z
}4 D& l) q* b3 V# j% o* _: J
8 U( @. z8 Z5 y% d2 }8 M
这也被称为工作证明系统
9 D& g0 t. h3 @' |# h
Nonce是什么?4 ]- |; f, V- B" G0 I, q
Nonce是用来查找一个有效Hash的次数。- V4 `" o4 [6 ] m/ w1 m
letnonce=0;
% v6 H: u/ A+ a
lethash;8 H# }1 Q7 F: \) N5 O4 a9 z
letinput; Y# D9 |! w9 S; i' @7 h( F6 s. x3 N
2 E- f; Q6 n- \7 R
while(!isValidHashDifficulty(hash)){
- M, d+ G7 U" H y
nonce=nonce+1;* R# i+ |5 [7 q, p1 Z- u, _
. q8 c" p* U7 {) _- V% R7 W' m) @
input=index+previousHash+timestamp+data+nonce; m1 a! v% t9 G5 p
7 g9 E$ }+ @( W4 T' \
hash=CryptoJS.SHA256(input)& H5 i" c0 }" A8 S) B. [9 \9 z2 y
( O6 a- B# W5 A1 F& d
}! m+ A% p2 M! P
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
- `+ k/ g2 x/ j
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。. l, X% N! e3 z( O6 L% S+ h* I
% k5 I5 ~2 Y" p% P$ V
为什么这么重要?. m6 }! E- S( ?8 w4 N+ T9 w- w. L8 r
这些机制非常重要,它们使区块链不可变。 B/ g1 J5 x: f5 H
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?
区块A上的数据改变了。
区块A的hash改变了,因为数据被用来计算hash。1 g6 @0 L* ~" z/ n# E" W" } a
5 `, O+ c6 j6 j) E9 U) G8 l3 S$ @; w
区块A失效了,因为它的hash不再有4个前导0。
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。" W5 X( B9 ^* @
$ D2 [& ]# o5 p4 l* O& m
区块B失效了,因为它的hash不再有4个前导0。
, E: ?4 q2 n, N0 X3 X" J7 A; R( \
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
区块C失效了,因为它的hash不再有4个前导0。
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。& j7 G. s4 N2 n: d
成为第一个吐槽的人