区块链是如何工作的——用JavaScript演示
段琰baby
发表于 2022-11-20 23:53:01
139
0
0
: e3 o! U! q' c! Z3 A$ m, [- D
这听起来很棒,那它是如何工作的呢?
, F) c' o4 s; _; c/ \ K
为了说明区块链,我们将会使用一个名为BlockchainCLI的开源命令行工具。
我同时也建立了一个基于浏览器的版本
4 y2 U( F( P, k
安装命令行工具) N; |. D% s) j6 H( M# ^8 B3 x
: N* C+ c9 G- X* D* t. ]1 A9 O
在此之前请先安装Node.js, @3 T4 o" G u- ?/ M* G
然后在你的命令行中运行以下指令:+ h" |5 U1 g6 W+ t
npminstallblockchain-cli-g
blockchain- f+ g. J8 y5 e/ R0 I( A( d
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。
9 h I, _9 R6 Z u
区块长什么样?$ w7 O3 \8 U+ l. D# e; D; R5 G
1 Q) n w- G5 z1 U+ ~) g5 C* H
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
6 _- J3 U" q, H7 x+ x" _
Index:是哪一个区块(创世块的索引是0)/ ^' Y& Y5 G6 Z9 u1 w1 y8 i, g: _
Hash:块是否有效?
/ o+ W- {3 k. x! H
PreviousHash:前一个区块是否有效?
Timestamp:什么时候添加的区块?
Data:什么信息存储在区块上?6 |! h" U; \/ t& u8 N6 o, l
6 x7 l {( R K/ V) E2 e" x
Nonce:在找到有效区块之前,我们进行了多少次迭代?- i1 r% B# l0 `/ K$ B. N
, G+ z& U; `! A) ]
创世块; ^. w( y0 \3 s6 ~) H! o
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。
当一个新的区块被开采时会发生什么?% }* p+ C* j& |2 k
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。
Index:0+1=1) y/ A* _$ \; P4 k. C# {
PreviousHash:0000018035a828da0…
C! g; m! ^: x
Timestamp:区块被添加的时间
Data:freeCodeCamp
Hash:???
; n5 e! g O4 a
Nonce:???3 c- G W/ b+ m* i9 B
3 \; x: i2 p: b
Hash是如何计算的?; u. \4 F B- k3 {3 @: S
. g1 X0 O2 O: @6 W; W* ]1 Q
哈希值是唯一标识数据的固定长度的数值。. f. N0 M5 W B( H! [- a) S
7 }# O$ [: y4 P; T' b( `' V
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。
8 | v, N2 U0 d3 d( X3 R, l, L
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)+ @% F- U/ W" o8 Z N
; w* v8 R2 ^2 J5 f: u% M- x
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
3 d1 b: [6 d# `+ L& \
你是否注意到区块Hash中的四个前导0?
" p B8 ~. ~3 u5 R4 F
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度1 O4 e( H1 c4 H! t- Y) g
5 |( Z2 j$ z0 e& g# S" l( L
functionisValidHashDifficulty(hash,difficulty){3 n L" Y* {1 }+ j
for(vari=0,b=hash.length;i=difficulty;5 X, ^3 x" ?( X( ^) d
2 K0 A$ _9 S% Y/ v- k
}
6 D; |! `9 C8 b5 F( ?
这也被称为工作证明系统
Nonce是什么?
& d; x) H: Z, g+ f5 T4 ^% ~
Nonce是用来查找一个有效Hash的次数。
/ H- V4 X U# J8 l6 x4 ]8 L0 W4 L
letnonce=0;0 N- ? r2 ^" m! e8 t1 ^
lethash;
: p3 D: b/ m4 a: L7 v
letinput;
while(!isValidHashDifficulty(hash)){+ C3 D/ }' r: i# m t. a
* }; d U; x+ Z: J! ^
nonce=nonce+1;
input=index+previousHash+timestamp+data+nonce;( y# h9 r" N! U
0 A# b* g& {9 S5 c
hash=CryptoJS.SHA256(input)9 u( ?' Y |$ p; ~! b
}: u5 D* W V% y! G* S& i# c
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。: ?/ E0 C( s. w: i7 ~2 E% p. h
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。
为什么这么重要?
6 x1 L2 z/ l/ S
这些机制非常重要,它们使区块链不可变。2 e8 `# l/ Y; ~% h# q7 q
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?
) @( ]9 S7 [: ?7 g
区块A上的数据改变了。
$ U& m' L( }+ V4 C3 C+ ~7 l) s
区块A的hash改变了,因为数据被用来计算hash。+ ^* C. s: F( d" U. Y
9 \- K& S/ c! [& c2 h: m+ H' c
区块A失效了,因为它的hash不再有4个前导0。
2 s3 ^. `' d* @( Q
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。% E8 f# |% Z0 p: |* X' _
区块B失效了,因为它的hash不再有4个前导0。
; i- v( {) Z) }% o
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
区块C失效了,因为它的hash不再有4个前导0。7 {1 ~5 i5 i% J9 N3 o
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。9 X5 J/ c$ d9 c* E5 X
# J9 q5 C* F% R. g
我希望这个教程能够对您有所帮助!; a- K7 }2 J$ z0 K6 m
3 T6 X" `$ N+ ?2 k1 V8 d- ^! B
安装命令行工具0 g" ^9 i% [+ a2 S' o8 w
`$ ?3 \3 _. F' Z7 w9 _0 M
在此之前请先安装Node.js3 {. C( f1 @9 B; {* M
1 b4 \6 S i, O4 @* {' L* B
然后在你的命令行中运行以下指令:
npminstallblockchain-cli-g
" ?" n, q0 c: d9 D- v
blockchain
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。0 u! W h% h5 z: P; Z4 e
区块长什么样? z; h# A5 [& B+ S3 [, ~
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
Index:是哪一个区块(创世块的索引是0)?
& P% l" |/ i& ^! @
Hash:块是否有效?; _1 l: H; G# n6 v1 O
PreviousHash:前一个区块是否有效?
Timestamp:什么时候添加的区块?
Data:什么信息存储在区块上?
Nonce:在找到有效区块之前,我们进行了多少次迭代?# @+ v# S! _. I
创世块
, b. z- P# _8 ]
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。1 {- p8 p+ W; Z4 b, h
当一个新的区块被开采时会发生什么?4 A4 W/ c2 h# O# U! N3 j! f
2 _7 x/ z0 k g& u' y
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。
* B0 e) D# u7 \
Index:0+1=1
?. ~8 R5 j4 D# U! t/ B
PreviousHash:0000018035a828da0…
Timestamp:区块被添加的时间3 X/ v6 f8 |$ E
Data:freeCodeCamp
( Z4 F* m% G7 r# n# G8 w$ w0 |+ A6 o
Hash:???
Nonce:???. J+ |. a C2 e$ a1 B
8 H, X, q) a' X; e
Hash是如何计算的?
& U& r' k/ T: l `4 ]" e% h; V
哈希值是唯一标识数据的固定长度的数值。 A6 i2 T) W7 m$ f
% t2 p C! X5 v* @6 W: O0 a. s% S2 F
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。: Y3 _. x" E" h* u' }
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)# a! U, z- n4 \9 K$ b1 L8 J$ ~
7 Z+ J: q5 T7 U
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
9 M$ x ]+ Q! Q; L' x$ U5 t
你是否注意到区块Hash中的四个前导0?% W/ C! L# t4 a5 m T& F k
# {4 B$ h) P% R
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度
) w m# h/ [8 ]9 E
functionisValidHashDifficulty(hash,difficulty){/ n8 Z1 V+ K( [: d
for(vari=0,b=hash.length;i=difficulty;* Y a/ @9 v% l' t# b; p
}
这也被称为工作证明系统
1 U8 Z, q" Z' Z$ u
Nonce是什么?
Nonce是用来查找一个有效Hash的次数。
( w/ U; l( j4 m; H% q, E4 g: z( P
letnonce=0;
lethash;
3 f# Z+ p/ F6 @( C/ X# E3 ?
letinput;
while(!isValidHashDifficulty(hash)){9 G/ z0 T4 h) l, S* w( `
( ~; R2 q0 a5 u4 Z- b0 E
nonce=nonce+1;3 g9 t# w9 z3 @7 U& n/ {2 I
input=index+previousHash+timestamp+data+nonce;1 X/ O! e. F N9 v6 ~
hash=CryptoJS.SHA256(input)
4 x6 ~: \) D( I$ u! P; ]: G
}
: g: g% c: `- l; g1 y6 k
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。/ O6 G+ H$ T7 Q' ~7 J9 w/ p' A
为什么这么重要?
1 _# }8 ~- t5 ?3 [1 T( n) K
这些机制非常重要,它们使区块链不可变。 f+ I$ j$ u9 Q: z- D5 ^
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?3 ^" p- F. t8 D5 j/ p2 w5 J! s$ W% _
4 S; e- m# u% f
区块A上的数据改变了。( b) |4 {- K1 ]( j& v8 n
9 b/ q0 @( K+ H5 a8 `# U% T. }
区块A的hash改变了,因为数据被用来计算hash。
+ R- T# P) w% f9 M C
区块A失效了,因为它的hash不再有4个前导0。
9 F. @) x( f/ I/ b5 J
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。
区块B失效了,因为它的hash不再有4个前导0。
6 }3 `* q' G F( N6 o: o2 F
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
# m% F( b% S: G
区块C失效了,因为它的hash不再有4个前导0。0 S. c) Y6 Q5 Q. ?% J- d7 v
2 n! o+ [6 q I9 }: A5 U' x' x
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。
成为第一个吐槽的人