区块链是如何工作的——用JavaScript演示
段琰baby
发表于 2022-11-20 23:53:01
135
0
0
这听起来很棒,那它是如何工作的呢?
为了说明区块链,我们将会使用一个名为BlockchainCLI的开源命令行工具。
5 p w0 u$ O$ g8 m- H4 w
我同时也建立了一个基于浏览器的版本 ]: }# n( {7 p+ h8 l8 w2 o
安装命令行工具
; [- B: Z6 O$ V( L
在此之前请先安装Node.js
然后在你的命令行中运行以下指令:
npminstallblockchain-cli-g
blockchain
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。
( J7 _% M. q; c# {
区块长什么样?
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
2 j' O' U; g: |- \2 O, E
Index:是哪一个区块(创世块的索引是0)
Hash:块是否有效?
PreviousHash:前一个区块是否有效?
5 N7 ~1 e B; S, t2 a
Timestamp:什么时候添加的区块?
( z+ B/ z2 n7 a
Data:什么信息存储在区块上?
Nonce:在找到有效区块之前,我们进行了多少次迭代?( z# _; y* s6 ?5 ^/ Y
创世块
/ P# n* B! ~; A( W @/ E9 [
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。7 H4 Q' ] Y! B4 b; S" ^
当一个新的区块被开采时会发生什么?
3 }; w' V* c0 n$ m7 D
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。
. q( i+ ~) U+ Y* E
Index:0+1=1" G J* M9 X! y3 ?+ Y- G
$ X, Q% j$ c. ~4 v
PreviousHash:0000018035a828da0…
" v4 _3 F) J$ s8 v
Timestamp:区块被添加的时间
- _" N# a! y, p7 e0 X0 w! ~
Data:freeCodeCamp: ^# w' A0 i0 F5 }! S
. A. P; G9 k1 ?
Hash:???
Nonce:???
, y; s1 ?$ o8 S1 Z
Hash是如何计算的?
哈希值是唯一标识数据的固定长度的数值。+ b/ i( c" d: k. y* C4 Z- S
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)% s1 k: ?: D& ^( k2 ^5 W0 ^
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
你是否注意到区块Hash中的四个前导0?
- p) N3 f' Y `
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度
8 W2 m' d+ ^& \
functionisValidHashDifficulty(hash,difficulty){
for(vari=0,b=hash.length;i=difficulty;+ I7 Y0 w4 h( D; O3 Q" Y
+ H: u" j) V1 O7 S, ?5 g
}0 l$ g/ B7 Q- T; w9 W
这也被称为工作证明系统
Nonce是什么?
# M4 n. T% f6 F5 z v1 D
Nonce是用来查找一个有效Hash的次数。$ a/ c) S) y' ]. I7 D
1 o! w3 I6 t# N. J4 E5 a4 L; E
letnonce=0;
lethash;
letinput;
while(!isValidHashDifficulty(hash)){
. c; m0 ]; G; E+ q
nonce=nonce+1;
9 P) Z- ^; [0 }2 Z5 [ Q3 Z
input=index+previousHash+timestamp+data+nonce;$ K, Q3 R0 e1 K3 m! }
hash=CryptoJS.SHA256(input)2 P- @; }9 f2 Z. k/ H4 ~
}( e" ]1 ^4 p! C* y' z! L0 P$ J
( X3 V# W' S$ ~' g
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。, e4 g' s3 Q9 z5 s) V9 r% ?* T
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。3 _! \/ U% J) x5 a
为什么这么重要?
这些机制非常重要,它们使区块链不可变。. z t( O, q& e9 l( f
( D8 V; s% Q* ~8 X. j: u* O* O5 E
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?
区块A上的数据改变了。
区块A的hash改变了,因为数据被用来计算hash。
3 ], z- ?6 y7 Y. m+ G: [7 r
区块A失效了,因为它的hash不再有4个前导0。
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。% Y, F7 W1 O% Y1 D2 _5 E) M+ c
& M# E! m- h$ j& D$ P
区块B失效了,因为它的hash不再有4个前导0。
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。- y1 T3 n! o+ ~! v- V" x
( t4 M6 Z/ ]! n. T n- c
区块C失效了,因为它的hash不再有4个前导0。* `2 c6 g( U2 `5 S4 a/ G
. X+ x# P$ i& I% {
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。
; r% a# K# C2 T
我希望这个教程能够对您有所帮助!7 K% ~$ D" F! k* `* }5 o0 [
安装命令行工具
! f7 `0 _3 d f2 @& t- Z6 O
在此之前请先安装Node.js" u+ @% L" v9 @2 ]: r8 E
2 D: L! n) i: R) p+ e2 [
然后在你的命令行中运行以下指令:; I: V" u$ u* [' M2 Z# [7 H, r
npminstallblockchain-cli-g4 W9 z) u5 [0 E5 [& l5 G
blockchain* c& m6 x' f2 N+ E
2 e( a7 n6 Y3 f7 Y
你应该会看到?WelcometoBlockchainCLI!和一个blockchain→提示。这说明已经准备好了。3 d) H8 N) y8 h6 `
, D+ t$ f% L) ?0 p
区块长什么样?
3 D# U( n" U& e/ ?: @) w/ s$ ?
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
/ [0 ~; l! P: C4 V. o* v
Index:是哪一个区块(创世块的索引是0)?
Hash:块是否有效?
7 N9 U5 s5 |4 H
PreviousHash:前一个区块是否有效?6 E9 ~, V% G2 p# {5 ?
8 A; T/ ?- C) H3 c6 l) J2 h( d
Timestamp:什么时候添加的区块?; a6 k3 {8 w: I9 m; O/ Z4 z
Data:什么信息存储在区块上?
7 G& H! K' ~" }1 q. _5 F4 u( V3 V
Nonce:在找到有效区块之前,我们进行了多少次迭代?
8 E2 ^1 h1 o0 @# {* b6 i: P
创世块3 e6 G0 U4 d( u o( p
每一个区块链都是从?GenesisBlock开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。5 o$ z0 x( c2 V9 ?3 p
$ x% d! O8 c1 O2 y( U" k+ W0 n- t
当一个新的区块被开采时会发生什么?$ b+ J/ M% F9 \- B7 c* W
让我们挖出我们的第一个区块。在命令行中输入minefreeCodeCamp。
区块链查看链上最新的区块来获取index和previoushash。在这个案例下创世块是最新的区块。+ o6 S& H" C/ d* s( j/ k% m9 O
/ I9 C i# r) n7 I
Index:0+1=1
% [: |0 o8 W3 k5 Y
PreviousHash:0000018035a828da0…' o! v1 y: ?4 o3 P, M/ t
' v3 O6 a3 k, J" h
Timestamp:区块被添加的时间
Data:freeCodeCamp( \/ B2 N& U, P- n; f/ n d
Hash:???
9 p$ U, W! t/ m; K3 h+ ]
Nonce:???/ @4 _, |% ~/ B) o8 U( T* a
Hash是如何计算的?5 @7 v( |6 [" P5 `% P3 N
哈希值是唯一标识数据的固定长度的数值。
Hash是通过将Index、PreviousHash、Timestamp、Data和Nonce作为输入值来计算的。* q$ Q" W2 j, @' h& Z2 k, n
CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)' M, e9 A% X3 z0 u
SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。
你是否注意到区块Hash中的四个前导0?
9 W" l) ?7 T0 z6 t x- X
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度0 i7 j$ D% {# ]4 Z V
: r! K9 r/ t. V0 R) h h
functionisValidHashDifficulty(hash,difficulty){/ J- Z1 e( I$ {$ Q B5 D; E8 I. c
for(vari=0,b=hash.length;i=difficulty;
* q' X- h8 a% F# P0 |: d) \
}3 O. A1 m2 j) p
, l8 r Z. Y7 H7 N
这也被称为工作证明系统
Nonce是什么?& M* g+ _$ h6 v7 K
. p! ]$ @/ U$ Z
Nonce是用来查找一个有效Hash的次数。
3 I; k1 e! U$ _+ A( Q9 }
letnonce=0;. C* X3 t& Z9 F( k* i
lethash;- l. }3 e5 k, L _ U8 P
) a: Y3 p3 [( D: N/ n& X. B
letinput;6 U, h" P" |9 R
# p" c5 q& P$ B K$ ~* y5 |% w
while(!isValidHashDifficulty(hash)){
9 d. ?. q7 y' W
nonce=nonce+1;" H) H1 d- p1 }) v q8 F4 b
input=index+previousHash+timestamp+data+nonce;
hash=CryptoJS.SHA256(input)! e9 K/ P& b& b: I
: A7 U# B; N. @# p7 L
}
Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。; M. r" r/ w; T! g6 p
: e% g, O6 I' b+ I3 F( A
为什么这么重要?% I; K. R8 L8 @! I8 @
这些机制非常重要,它们使区块链不可变。
如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?. e$ h. P( v3 _8 [$ k4 n
. L7 s+ F9 Q6 T+ W0 }2 N+ t( W, \
区块A上的数据改变了。
区块A的hash改变了,因为数据被用来计算hash。
: a5 J- M' V- v" g, L: C
区块A失效了,因为它的hash不再有4个前导0。
) O; d, M" \; d- k, j& ]
区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。
区块B失效了,因为它的hash不再有4个前导0。
+ E% z& e$ {) a1 b" g9 \
区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。, ~- I$ O. i5 f" h7 t2 L
区块C失效了,因为它的hash不再有4个前导0。4 b! q8 l/ g- E+ J# T U
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。5 T% @/ `* B1 K5 Q$ A
成为第一个吐槽的人