前面的講述已能理解何為區塊與鏈 亦理解其加密算法
接下來就分幾點講述並舉例 其運行的方式
在第一天我們提及了區塊的模樣
代表此份區塊版本號
使用前一區塊 "區塊哈希值" 作為連接
建立區塊的時間
此處代表這個區塊被計算出來的難度 通常會根據整體的計算速度去調整難度
礦工就是要去尋找這個隨機數 使 "區塊的哈希值(Block Hash)" 符合 "區塊的難度(Difficulty)"
例如: 調整這個值讓 "區塊哈希值" 前面0數量符合"區塊難度"
透過將交易數據不斷進行哈希所得到的結果
交易哈希 | 發送地址 | 接收地址 | 費用 | 給礦工手續費 | 交易簽名 |
---|
通常由後四點資訊進行哈希得知 作為該筆交易的ID
欲轉出錢的人的錢包地址
欲接收錢的人的錢包地址
此筆交易轉出的金額
此筆交易給礦工手續費 越高礦工越願意先執行
轉出該筆錢的人 透過自己的私鑰 對該筆交易的簽名
(通常此處僅為驗證該筆交易合法性 並不會放置到區塊中)
根據 "區塊標頭" 的資訊進行雙重哈希後所得的資訊。
可以說是該個區塊的標籤,同時作為下個區塊的 "區塊標頭的前一塊哈希值" 使其區塊連接。
其實這部分就是可以讓區塊中,可以放置資訊的地方,
假設此段為交易訊息
交易哈希 | 發送地址 | 接收地址 | 費用 | 給礦工手續費 | 交易簽名 |
---|---|---|---|---|---|
HASH1 | A | B | 10 ETH | 1 ETH | A's signature |
HASH2 | B | C | 10 ETH | 1 ETH | B's signature |
HASH3 | C | D | 10 ETH | 1 ETH | C's signature |
HASH4 | D | A | 10 ETH | 1 ETH | D's signature |
->交易簽名是否確實為發送地址所簽發
(透過非對稱式加密 的方式驗證)
(使用"發送地址" 公鑰驗證 "交易簽名" 是否為私鑰簽名)
#將每筆資訊的簽名進行驗證
透過PublicKeyA 驗證 A's signature 符合 (A + B + 10 ETH)
透過PublicKeyB 驗證 B's signature 符合 (B + C + 10 ETH)
透過PublicKeyC 驗證 C's signature 符合 (C + D + 10 ETH)
透過PublicKeyD 驗證 D's signature 符合 (D + A + 10 ETH)
#首先分別計算每筆哈希值
HASH1 = Hash(A + B + 10 ETH + 1 ETH)
HASH2 = Hash(B + C + 10 ETH + 1 ETH)
HASH3 = Hash(C + D + 10 ETH + 1 ETH)
HASH4 = Hash(D + A + 10 ETH + 1 ETH)
#兩兩配對再次進行哈希 若有餘數則單獨進行哈希
HASH12 = HASH(HASH1 + HASH2)
HASH34 = HASH(HASH3 + HASH4)
#重複上一步驟 持續到剩餘一個值 即是Markle root
HASH1234 = HASH(HASH12 + HASH34)
#推算得知 Markle root
Markel root = HASH1234
假設當前區塊 版本號為 V1 區塊難度為 1
區塊標頭 | ------------ |
---|---|
版本號 | v1 |
前一塊哈希值 | PreviousHash |
時間戳記 | Now'sTimeStamp |
區塊難度 | 1 |
隨機數 | |
Markle root | HASH1234 |
會發現當前隨機數為空,所以下一步必須找出這個隨機數。
如何使 區塊哈希值 符合 區塊難度
例如 : 規定 區塊哈希值 前面 0 的個數符合區塊難度
"""
版本號: V1
前一塊哈希值: PreviousHash
時間戳記: Now'sTimeStamp
區塊難度: 1
隨機數: (假設為 ResultNonce)
Markle root: HASH1234
"""
BlockHash = HASH(HASH(V1PreviousHashNow'sTimeStamp1ResultNonceHASH1234))
#挖礦的目標就是不斷去嘗試 "隨機數" 以符合 "區塊難度"
#以此處為例 即是尋找 "區塊哈希值" 開頭有一個0
#(假設 ResultNonce 符合要求)
BlockHash = 0RemainBlockHash
其區塊哈希值(0RemainBlockHash)
作為下個區塊中,區塊標頭的 前一塊哈希值
即是與下個區塊的鏈 完成與下個區塊 塊的連接。
(最後結果 如下圖所示)
可以看到以下特性:
因此無法輕易的改變數據,若是更動就會容易影響到整個區塊鏈架構
區塊鏈網絡通常是一個點對點(P2P)網絡,每個節點都連接到其他節點。
(此張示意圖為 bing 生成之圖片)
所以在區塊鏈中 你可以視為每個人(礦工)都是獨立的點。
不一定要與其他所有點都連線。
只要搭上這個網即可,透過互相傳播最後整個網都會知道你要傳遞的消息。
做為新的點加入這個網,首先就是要與其他點取得聯繫相連。
當新的礦工加入時,與新礦工相連的點就會傳遞消息過來。
包括所有歷史區塊與其他資訊,代表其實區塊鏈資訊 每個點都有資訊備份。
所以區塊鏈就很好的避免了資料遺失,因為整個網路都有備份。
而為甚麼 點(礦工) 會願意存在呢?
就是因為今天若成功運算完區塊,就會獎勵該個礦工 虛擬貨幣。
當今天交易發生了,
邏輯上可以告訴這個網路任何一個點。
點與點之間互相傳播,最後整個網路都知道你這筆交易。
接下來礦工就會開始運算,驗證交易、計算區塊等等...(上述介紹運算部分)
最後當有個點算出來後,
一樣在廣播出去,其他礦工也會驗算這個礦工計算是否正確。
最後整個網路 就前進一個區塊 礦工或的獎勵,
同時該筆交易也寫在區塊鏈中,無法輕易更改。
備註:
因為若是強行更動會導致整個哈希會產生變化,甚至打斷鏈的持續性
(如果試圖改變其他礦工也不會認同這筆變化 自然不會影響整個區塊鏈資訊)
當一個點算力不夠時,開始出現一起工作的想法。
實現方式就類似 好幾個點聚集成一個大點。
(大點內部 就有好幾個點這樣)
有新的交易時,就先將交易先放在交易池中,透過大家一起運算,最後分攤獎勵。
是的 第一塊確實沒有前一塊哈希值。
而在區塊鏈中第一塊較為特別 又稱為 "創世區塊"
但不影響區塊鏈的延續,在創世區塊可以寫下任何東西。
像是比特幣的創世區塊中的文本
"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"
這句話來自2009年1月3日《泰晤士報》的頭版標題,
它報導了當時的金融海嘯和英國財政大臣即將對銀行進行第二次緊急援助的情況。
比特幣的創建者作為比特幣的創建宣言,
強調了比特幣的去中心化和反對傳統金融體系的理念。
这也使得創世區塊有了特殊的歷史意義。
對於這種情形 像是區塊鏈在剛形成時也有可能會遇到。
就是基本上交易量很小的狀況 是有可能發生的。
因此就有個機制以處理這種狀況,
便是礦工可以繼續工作 但是對於空交易的區塊
解決方式是
礦工獎勵減半 使礦工還是願意挖 但是限制其意願
只能說幾乎算是不可能遺失。
一個區塊鏈上 可能有上千萬個點,
只要還有一台機器仍在工作,就依然能拿到資訊。
礦工只要相信這個理念,認為這項區塊鏈有價值,
這台機器就很有可能有意願繼續進行工作。
所以若要達到真的遺失,
除非所有點通通消失,而且在沒有再重新上線(或是刪除舊的資訊)。
才有可能遺失,所以會說非常渺茫。
這可以講到區塊鏈的共識機制,
任何於區塊中的點 都可以去修正這些區塊資訊。
但是必須要其他點也都同意你的決定 而且符合區塊鏈規則。
而這就接近完全不可能的狀態!
今天主要是系統性的介紹區塊鏈如何運行。
希望透過這篇後 能夠理解以下觀念
看完這篇我想對於區塊鏈如何運行 已經有基礎概念
我想從此處能夠理解一些特性 但是感覺這些特性是必須基於某些前提。
因為在P2P當中所有點的地位都是相同的,因此所有點之間必須要有些規範、共識。
由此下篇將會仔細介紹 關於區塊鏈的共識機制。