区块链是如何工作的——用JavaScript演示
段琰baby
发表于 2022-11-20 23:53:01
137
0
0
这听起来很棒,那它是如何工作的呢?( g( q5 H7 e# B
1 x% U+ m s7 f- U0 ]
为了说明区块链,我们将会使用一个名为BlockchainCLI的开源命令行工具。$ n+ L+ [9 r5 E, Y8 |
5 q6 I* I9 ^) E- P0 D
我同时也建立了一个基于浏览器的版本
安装命令行工具3 i+ n" j) Q9 p' v
" {/ H" C0 r/ L. ?! l4 `; _9 W
在此之前请先安装Node.js6 Q4 i, d0 e4 m) [
然后在你的命令行中运行以下指令:7 O9 K% U' N) |* o1 t' f4 m! Z- L
npminstallblockchain-cli-g
blockchain- d* p/ D4 e+ i5 a6 G N4 z
7 U1 t2 q. H7 U8 v: p5 J/ y
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。/ o! s' T. Q3 B
区块长什么样?3 P; z" X/ U) v8 a( f) m3 o
) [$ K! q. e- `4 J
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
5 p& }# h V5 f" Z/ n6 \
Index:是哪一个区块(创世块的索引是0): X. v* k% }) u- E
4 Y1 a; a$ W: q7 Y; N- G5 E/ O
Hash:块是否有效?" d, u' m5 ^0 X7 ^6 }
- [9 B* u* \, X4 n
PreviousHash:前一个区块是否有效?4 I, |1 J4 M$ {* T) v6 z8 E" Y
Timestamp:什么时候添加的区块?
- r9 k! D: X- @& k8 W' w6 w5 V/ V
Data:什么信息存储在区块上?3 o8 H7 D) w/ I7 T6 L
; Y7 p3 u" U# M- `# H
Nonce:在找到有效区块之前,我们进行了多少次迭代?/ T9 I$ F1 p5 b! I! `3 O5 K
创世块
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。5 t" \% B' `0 V% u
当一个新的区块被开采时会发生什么?
! j V3 F, I- ] J4 Z1 }6 R
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。5 a- |% @, r! o) |# l0 m# w' a t
6 T- _, y- k, p9 }. p
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。! x6 W. w' I( g, s8 t8 b: {" }
Index:0+1=1' m# X. ^+ N. q2 R
# e2 T# Y; N" f3 R, L: }/ j
PreviousHash:0000018035a828da0…
Timestamp:区块被添加的时间
+ _/ Z8 v7 G4 I
Data:freeCodeCamp& E" S# q: H; T! a% t; k0 ^
Hash:???
5 ~% j' C- O" ~% P
Nonce:???
Hash是如何计算的?( D7 Y* w0 Z* E$ S" |
7 n$ J$ T8 H# g. n
哈希值是唯一标识数据的固定长度的数值。. t7 v" I B+ Q
, i; _2 N; m! {; j' Y
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。; z8 D) N7 F# `1 c
* o; X) V6 K4 }5 G- a- M
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)+ ]1 L8 w; M9 T \2 U- F Y
. R. W7 Q. U8 Q7 w# G* C, o, f4 e) ?
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。9 W' l4 T- l( a+ E* ]
你是否注意到区块Hash中的四个前导0?+ ?8 }0 u4 }/ R/ K8 F* s& X
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度
functionisValidHashDifficulty(hash,difficulty){
2 n0 Y$ v9 m! m; `; t
for(vari=0,b=hash.length;i=difficulty;
}
这也被称为工作证明系统
Nonce是什么?; W$ g4 q: J6 Y+ i; i, ?7 e1 D
) ]( N" I* U* H9 y @
Nonce是用来查找一个有效Hash的次数。+ J" M0 W/ ]# D2 a6 Z! W3 E( b
+ b7 h( z& N3 s% Z! e, v
letnonce=0;( i) I) U4 G# m8 ^( b
& Z5 L6 o' Y/ P5 u3 A9 F
lethash;" K: T5 S( e0 s( c- r# B9 M
* x3 Z. Y/ X2 m. L" c
letinput;; S, r6 z) Y) w
$ P2 l+ G, a# B5 n4 X
while(!isValidHashDifficulty(hash)){+ D' t3 L6 U% c: K! ^
nonce=nonce+1;
input=index+previousHash+timestamp+data+nonce;
hash=CryptoJS.SHA256(input)3 _9 [! K9 q. W+ P
( s0 r/ Q! H/ N& W) b+ T5 ?
}2 t+ x0 u' x; [- v: f4 o
! b. p1 D/ @: w
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。8 D: `- s. Q8 P2 Y4 K4 @" n
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。8 u( M( ~) D* Y) v( Y. x. V& b4 Y
& Q" X g3 m8 J4 P \9 K( A8 |
为什么这么重要?/ ?/ R% c. Q H( t
这些机制非常重要,它们使区块链不可变。$ ~" z$ x' _( X" v
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?" L9 K9 }4 W+ o" t; R
: l% g0 a- x7 r, s) Z5 w
区块A上的数据改变了。/ j7 H) O9 C8 ^4 v" O; k1 t
区块A的hash改变了,因为数据被用来计算hash。
0 q2 O1 O* P" [
区块A失效了,因为它的hash不再有4个前导0。+ c, T( C: {( `$ ~% f0 F
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。* j9 L) @9 q" E7 _7 K# V. e! M1 ?+ T
区块B失效了,因为它的hash不再有4个前导0。3 a. `2 \ f' \- l
) O' j# i5 J% }( c8 U1 U# d
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
区块C失效了,因为它的hash不再有4个前导0。% I5 g" @! l; C- v# ?4 U
* y& y1 Q$ B' v' W) _
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。9 Z/ K2 w+ m! n, z
我希望这个教程能够对您有所帮助!" k1 }- t. r/ ]' n3 Z/ {
安装命令行工具" {7 y& ?; M; `9 \2 {
`2 \$ x0 n. k+ o& P6 j
在此之前请先安装Node.js- ~) J6 @9 z: J8 w T* H
然后在你的命令行中运行以下指令:
0 J4 P- g* ~+ x' r( y% |1 G
npminstallblockchain-cli-g
" G4 d; v. V! b% h
blockchain
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。1 q' D5 f8 z! d* a
/ v+ k6 T" X8 ?: `" H8 g: S
区块长什么样?
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。: K7 `/ M" z3 q8 F0 C
Index:是哪一个区块(创世块的索引是0)?7 c5 ^" o7 d8 X. @) p
' F# g. O0 Z( s9 ~, F3 K
Hash:块是否有效?$ J; Y/ {! u6 I' G$ i. {
PreviousHash:前一个区块是否有效? O4 B9 w; v! R& O6 `9 R( l- n4 A
Timestamp:什么时候添加的区块?
7 [0 t( B8 L0 c! Q g* v2 ]! v
Data:什么信息存储在区块上?2 Z' v) h! q; W$ j x3 z( Q6 @
Nonce:在找到有效区块之前,我们进行了多少次迭代?
0 O& w7 m" P% k+ H* n
创世块7 p3 M9 a6 ]# A' w: B8 n: |
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。6 l( j8 N5 o6 D, ?" Z% O
: e* @# t% I x' x2 f
当一个新的区块被开采时会发生什么?
1 C3 l2 K8 z$ q! N$ A( ~. ]5 y. v
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
. j- B' L) _6 }0 z0 O/ v% F" G! m
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。4 x2 B. o+ U4 b& {
5 G( p; ]. M- X. V: G6 D
Index:0+1=1; g1 g9 g: C- p4 s
; k. \& j; r+ j2 _% w; p; |
PreviousHash:0000018035a828da0… K: @* M% _% a
Timestamp:区块被添加的时间) e- X/ m1 V2 A% ?2 T# E
; f5 g* F- H" Y9 Z! h
Data:freeCodeCamp
Hash:???
$ @" @- F- X# M( J
Nonce:???
Hash是如何计算的?- r2 {" _- `3 [% l# B
哈希值是唯一标识数据的固定长度的数值。3 g8 P+ {! n8 n2 z* |
$ M1 m: i/ N$ O7 g' ]" T
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。$ d- H9 P- a4 ~2 S, `6 z/ Q
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)$ \/ ]# J0 l7 L9 o. y9 W
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
3 r9 B% H8 P) U8 \: g1 m
你是否注意到区块Hash中的四个前导0?! K: X( V5 k3 G( F& u
9 v1 J; l; Z) q7 b/ Y' _
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度/ z3 ` h4 k& H8 g
" a) R* f& C3 v+ ?
functionisValidHashDifficulty(hash,difficulty){; q, `& i4 c. M! A3 ^
3 I. k1 g( ^. [9 [
for(vari=0,b=hash.length;i=difficulty;7 ?# D k& E! {3 V
x, }+ p; z& j. f, U/ l$ B
}7 N6 H5 G1 Z+ W! ^+ V) q' K/ w3 G' o
这也被称为工作证明系统4 q7 K' ^2 [' S8 r; y
Nonce是什么?% J7 a7 u! d) Q9 a. S
2 e" v( G' s% D1 \; w2 t' w
Nonce是用来查找一个有效Hash的次数。# L q) E- @" R# K( a
. |0 C) I2 l% d' l0 S$ }
letnonce=0;
lethash;0 c, k0 U- H$ y5 a
$ i+ @0 w% z" C. \+ D0 ?- ]
letinput;
, B0 C' g0 \0 o, }6 p$ J, Y/ x# ]
while(!isValidHashDifficulty(hash)){
4 w, u7 w4 V1 @4 _# z
nonce=nonce+1;
input=index+previousHash+timestamp+data+nonce;2 \0 I9 _- M! `- `7 d
' {& k) K+ @! m: U7 F
hash=CryptoJS.SHA256(input)& Y" j4 Z1 `9 C A9 W# k7 P) z2 { m
, z1 j6 A$ K8 D. i t" f
}& y; i! C: Y' n* j
5 P) K4 U' f$ t c1 K8 G
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。3 c; n9 m r' \8 w) Z" D" r9 g, C( m
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。
& j0 L) U7 _7 s5 k1 q* D" |
为什么这么重要?
这些机制非常重要,它们使区块链不可变。& x- ?4 S: w; }
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?6 H' z* T7 R+ f8 H9 I% D
- k$ ]+ i( C5 v2 P: y( O
区块A上的数据改变了。0 G# x3 [5 K l9 C1 D6 {1 L
区块A的hash改变了,因为数据被用来计算hash。
2 V% r8 W3 ?! L1 Y- K
区块A失效了,因为它的hash不再有4个前导0。* i1 Y& o- R ^8 A' |
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。2 l/ S8 c( f" n
区块B失效了,因为它的hash不再有4个前导0。2 Q" {3 @* ~) l. W$ p) |8 k2 t
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
; x# \. u Q3 x
区块C失效了,因为它的hash不再有4个前导0。8 z3 g. _+ F( L8 [9 P
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。
成为第一个吐槽的人