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}
|