POWコンセンサスアルゴリズムの原理と実装

POWについて

仕事の証明、証明する作品。
POWコンセンサスアルゴリズムは、主にブロックしようとしている人難易度の値を計算することによって決定されます。ワークロードPOWは、最初の問題を解決し、かつ遮断する権利を持っている方程式の求解を指します。式はこのように、ハッシュ値の前のブロックと次のブロックのハッシュ値を計算するために最初にすることができ、次のブロックのランダム値ノンスハッシュ値、ノンスを見つけることは、最初にすることによって計算されますそれが決まった解決策が存在しないため、式の値を算出することが困難と呼ばれますが、努力を続けるために、この方程式の解は、ハッシュ衝突、イベントの確率は、多くの衝突の数、より多くの困難は方程式を解くと呼ばれています大規模な。ビットコインはPOWコンセンサスアルゴリズムを使用することです

特定のアルゴリズムの実装原理

これは、2つの重要な概念を伴う難易度の要因である、ナンスで、nonceが乱数として理解することができ、それは資格のナンス値を見つけるために採掘しています。
図4に示すように難易度、ナンス値は、ゼロからハッシュ値を算出し、これらのパックされたデータにインクリメントされた、データブロックプラスパックノンス値をハッシュ満たすトップ(難易度が初期クレジットが4ビットである)と仮定する4 0がある、それは成功した鉱山です。難易度の要因は、ハッシュは、何よりも私たちが数0を満たす必要がどのくらいです。

コードは、原則の簡単な実装であります

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
パッケージメイン

インポート(
"のStrConv"
"時間"
"暗号/ SHA256"
"文字列"
"エンコーディング/六角"
"FMT"


// POWマイニングアルゴリズム

//の難易度を定義
大きな柱   コンセンサス原理とアルゴリズムのPOWの実装を「> constのdifiiculty = 4

構造体{ブロックタイプ
インデックスINT //ブロックの高
タイムスタンプのInt64
データ列//トランザクション
ハッシュ文字列
prehash列
ノンスINTの
難易// INT困難因子
}

//ブロック鎖作成
VAR BlockChain []ブロックを

//作成ブロック
FUNCのGenesisBlock()*ブロック{

VaRのgeneBlock =ブロック{0、time.Now()。UNIX()、 ""、 ""、 ""、0、difiiculty}
geneBlock.Hash = hex.EncodeToString(BlockHash(geneBlock))

リターン&geneBlock

}



FUNC BlockHash(ブロックブロック)[]バイト{
RE:= strconv.Itoa(block.Index)+ strconv.Itoa(INT(block.TimeStamp))+ block.Data + block.Prehash +
strconv.Itoa(block.Nonce) + strconv.Itoa(block.Difficulty)

H:= sha256.New()
h.Write([]バイト(再))
ハッシュ:= h.Sum(NIL)

リターンは、ハッシュ化されました


}

FUNC isBlockValid(ブロックブロック)BOOL {
接頭辞:= strings.Repeat( "0"、block.Difficulty)
戻りstrings.HasPrefix(block.Hash、接頭辞)
}

//新しいブロックPOW鉱業作成
FUNCのCreateNewBlock(lastBlock *ブロック、データ列)*ブロック{
VAR newBlockブロック
newBlock.Index = lastBlock.Index +。1
newBlock.TimeStamp Time.now =を()。Unixの()
newBlock.Data =データ
newBlock.Prehash = lastBlock.Hash
newBlock.Difficulty = difiiculty
newBlock.Nonce = 0
//掘削-難易度係数値と現在ブロックのハッシュ値の数は、上記0と同じである
{ため
//計算されたハッシュ
cuhash:= hex.EncodeToString(BlockHash(newBlock))
fmt.Println( "マイニングで"、cuhash)
newBlock.Hash = cuhash
isBlockValid(newBlock)IF {

//チェックブロック
VerflyBlock(newBlock、lastBlock *){IF
fmt.Println( "成功マイニング")
のリターン&newBlock
}
} newBlock.Nonce ++



}
}


//新しいブロック正当かどうかを確認
FUNC VerflyBlock(newBlockブロック、lastBlockブロック){BOOL
IF lastBlock.Index +1を付けましたが!= {Newblock.Index
falseに戻る
}
IF newblock.Prehash!= {LastBlock.Hash
falseに復帰
}
復帰真

}

FUNCのメイン(){

VAR genBlock = GenesisBlock() newBlock:= CreateNewBlock(genBlock、 "新区块") fmt.Println(newBlock)




}

輸出

1 
2
3
4
5
6
でAc6665903c0cd2f000e17483fbcf6e3e8fa365de2b55663e7c94167f816d1489採掘
a46e18c7938ccb2d0554232f94c6e8db933fae509adafd4091f5f0b51951e6ae鉱業
3738b5eb5f8f956974fc767058a6d7c94da0fc406e86df2d508b9b87fc109171鉱業
0000694b1acaec754175f0a49a1aa190e122b58e9f58125bd18ceec898f8d811鉱業
マイニング成功
&{11530267247新しいブロック0000694b1acaec754175f0a49a1aa190e122b58e9f58125bd18ceec898f8d811 a8df431924b17633bdf0303763661aa7a41c2608cd99f6527542e1326c718152 12167 4}

おすすめ

転載: www.cnblogs.com/sanxiandoupi/p/11711068.html