iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Web 3

從 區塊鏈 到 去中心化應用程式(DApp)系列 第 3

區塊鏈基礎 : 區塊鏈 計算與運行

  • 分享至 

  • xImage
  •  

區塊鏈的計算與運作模式

前面的講述已能理解何為區塊與鏈 亦理解其加密算法
接下來就分幾點講述並舉例 其運行的方式

  1. 區塊如何產生
  2. 區塊鏈的網路架構
  3. 常見疑惑解答

區塊如何產生

在第一天我們提及了區塊的模樣
https://ithelp.ithome.com.tw/upload/images/20230917/20162912eUElm5IhU8.png

1. 區塊標頭

  1. 版本號
    代表此份區塊版本號
  2. 前一塊哈希值
    使用前一區塊 "區塊哈希值" 作為連接
  3. 時間戳記
    建立區塊的時間
  4. 區塊難度
    此處代表這個區塊被計算出來的難度 通常會根據整體的計算速度去調整難度
  5. 隨機數
    礦工就是要去尋找這個隨機數 使 "區塊的哈希值(Block Hash)" 符合 "區塊的難度(Difficulty)"
    例如: 調整這個值讓 "區塊哈希值" 前面0數量符合"區塊難度"
  6. Markle根
    透過將交易數據不斷進行哈希所得到的結果

2. 交易數據

交易哈希 發送地址 接收地址 費用 給礦工手續費 交易簽名
  1. 交易哈希
    通常由後四點資訊進行哈希得知 作為該筆交易的ID
  2. 發送地址
    欲轉出錢的人的錢包地址
  3. 接收地址
    欲接收錢的人的錢包地址
  4. 費用
    此筆交易轉出的金額
  5. 給礦工手續費
    此筆交易給礦工手續費 越高礦工越願意先執行
  6. 交易簽名
    轉出該筆錢的人 透過自己的私鑰 對該筆交易的簽名
    (通常此處僅為驗證該筆交易合法性 並不會放置到區塊中)

3. 區塊哈希值

根據 "區塊標頭" 的資訊進行雙重哈希後所得的資訊。
可以說是該個區塊的標籤,同時作為下個區塊的 "區塊標頭的前一塊哈希值" 使其區塊連接。

4. 其他元信息

其實這部分就是可以讓區塊中,可以放置資訊的地方,

舉個例子吧!

假設此段為交易訊息

交易哈希 發送地址 接收地址 費用 給礦工手續費 交易簽名
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

1. 當然首先會確認每筆交易是否合法

->交易簽名是否確實為發送地址所簽發
(透過非對稱式加密 的方式驗證)
(使用"發送地址" 公鑰驗證 "交易簽名" 是否為私鑰簽名)

#將每筆資訊的簽名進行驗證
透過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)

2. 接下來由此我們可以計算 Markle root

#首先分別計算每筆哈希值
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

3. 接下來填充看看 區塊標頭

假設當前區塊 版本號為 V1 區塊難度為 1

區塊標頭 ------------
版本號 v1
前一塊哈希值 PreviousHash
時間戳記 Now'sTimeStamp
區塊難度 1
隨機數
Markle root HASH1234

會發現當前隨機數為空,所以下一步必須找出這個隨機數。

4. 尋找 隨機數 使 區塊哈希值 符合 區塊難度

如何使 區塊哈希值 符合 區塊難度
例如 : 規定 區塊哈希值 前面 0 的個數符合區塊難度

"""
版本號: V1
前一塊哈希值: PreviousHash
時間戳記: Now'sTimeStamp
區塊難度: 1
隨機數: (假設為 ResultNonce)
Markle root: HASH1234
"""

BlockHash = HASH(HASH(V1PreviousHashNow'sTimeStamp1ResultNonceHASH1234))

#挖礦的目標就是不斷去嘗試 "隨機數" 以符合 "區塊難度"
#以此處為例 即是尋找 "區塊哈希值" 開頭有一個0
#(假設 ResultNonce 符合要求)
BlockHash = 0RemainBlockHash

5. 完成此份區塊 鍊 拉出去

其區塊哈希值(0RemainBlockHash)
作為下個區塊中,區塊標頭的 前一塊哈希值

即是與下個區塊的鏈 完成與下個區塊 塊的連接。

(最後結果 如下圖所示)
https://ithelp.ithome.com.tw/upload/images/20230917/20162912br5FUeu1bA.png

可以看到以下特性:

  • 下個區塊記錄 這個區塊的哈希值
  • 區塊標頭中 "Markle根" 與 "交易數據" 有直接關係
  • "區塊哈希值" 與 "區塊標頭" 有直接關係

因此無法輕易的改變數據,若是更動就會容易影響到整個區塊鏈架構

區塊鏈的網路架構

P2P網絡:

區塊鏈網絡通常是一個點對點(P2P)網絡,每個節點都連接到其他節點。

https://ithelp.ithome.com.tw/upload/images/20230917/201629122EcSWlwNhx.jpg
(此張示意圖為 bing 生成之圖片)

所以在區塊鏈中 你可以視為每個人(礦工)都是獨立的點。
不一定要與其他所有點都連線。

只要搭上這個網即可,透過互相傳播最後整個網都會知道你要傳遞的消息。

新礦工加入

做為新的點加入這個網,首先就是要與其他點取得聯繫相連。

當新的礦工加入時,與新礦工相連的點就會傳遞消息過來。
包括所有歷史區塊與其他資訊,代表其實區塊鏈資訊 每個點都有資訊備份

所以區塊鏈就很好的避免了資料遺失,因為整個網路都有備份。

而為甚麼 點(礦工) 會願意存在呢?
就是因為今天若成功運算完區塊,就會獎勵該個礦工 虛擬貨幣

交易發生 與 完成區塊運算

當今天交易發生了,

  1. 邏輯上可以告訴這個網路任何一個點。

  2. 點與點之間互相傳播,最後整個網路都知道你這筆交易。
    接下來礦工就會開始運算,驗證交易、計算區塊等等...(上述介紹運算部分)

  3. 最後當有個點算出來後,
    一樣在廣播出去,其他礦工也會驗算這個礦工計算是否正確。

  4. 最後整個網路 就前進一個區塊 礦工或的獎勵,
    同時該筆交易也寫在區塊鏈中,無法輕易更改。

備註:
因為若是強行更動會導致整個哈希會產生變化,甚至打斷鏈的持續性
(如果試圖改變其他礦工也不會認同這筆變化 自然不會影響整個區塊鏈資訊)

礦池的概念出現

當一個點算力不夠時,開始出現一起工作的想法。

實現方式就類似 好幾個點聚集成一個大點。
(大點內部 就有好幾個點這樣)

有新的交易時,就先將交易先放在交易池中,透過大家一起運算,最後分攤獎勵。

常見疑惑解答

區塊鏈是不斷透過哈希值連接 那起始的第一塊怎麼辦?

是的 第一塊確實沒有前一塊哈希值。
而在區塊鏈中第一塊較為特別 又稱為 "創世區塊"

但不影響區塊鏈的延續,在創世區塊可以寫下任何東西。

像是比特幣的創世區塊中的文本

"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"

這句話來自2009年1月3日《泰晤士報》的頭版標題,
它報導了當時的金融海嘯和英國財政大臣即將對銀行進行第二次緊急援助的情況。

比特幣的創建者作為比特幣的創建宣言,
強調了比特幣的去中心化和反對傳統金融體系的理念。

这也使得創世區塊有了特殊的歷史意義。

假設今天都沒有交易 區塊鏈怎麼辦?

對於這種情形 像是區塊鏈在剛形成時也有可能會遇到。
就是基本上交易量很小的狀況 是有可能發生的。

因此就有個機制以處理這種狀況,
便是礦工可以繼續工作 但是對於空交易的區塊

解決方式是
礦工獎勵減半 使礦工還是願意挖 但是限制其意願

真的資料永遠不會遺失嗎?

只能說幾乎算是不可能遺失

一個區塊鏈上 可能有上千萬個點,
只要還有一台機器仍在工作,就依然能拿到資訊。

礦工只要相信這個理念,認為這項區塊鏈有價值,
這台機器就很有可能有意願繼續進行工作。

所以若要達到真的遺失,
除非所有點通通消失,而且在沒有再重新上線(或是刪除舊的資訊)。
才有可能遺失,所以會說非常渺茫。

真的無法竄改裡面資訊嗎?

這可以講到區塊鏈的共識機制
任何於區塊中的點 都可以去修正這些區塊資訊。

但是必須要其他點也都同意你的決定 而且符合區塊鏈規則。

而這就接近完全不可能的狀態!

與傳統主從式架構差異是甚麼?

  • 資料上
    在傳統的主從事架構中,資料往往被少數人所掌握
    但是透過區塊鏈的技術,讓資料能夠被公開透名,且不易竄改
  • 服務上
    傳統主從式架構中,服務由server端服務,受限於提供服務的廠商
    但是透過區塊鏈,服務本身可以多個節點提供不在被侷限於單個廠商。

結言

今天主要是系統性的介紹區塊鏈如何運行。

希望透過這篇後 能夠理解以下觀念

  1. 區塊鏈如何記錄交易、區塊內容
  2. 礦工如何驗證交易、計算區塊
  3. 區塊鏈網路架構
  4. 區塊鏈如何同步消息

下回預告

看完這篇我想對於區塊鏈如何運行 已經有基礎概念

我想從此處能夠理解一些特性 但是感覺這些特性是必須基於某些前提。

因為在P2P當中所有點的地位都是相同的,因此所有點之間必須要有些規範、共識。

由此下篇將會仔細介紹 關於區塊鏈的共識機制

下回 "區塊鏈基礎 : 共識機制"


上一篇
區塊鏈基礎 : 加密學 應用於 區塊鏈
下一篇
區塊鏈基礎 : 共識機制
系列文
從 區塊鏈 到 去中心化應用程式(DApp)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
foodchain
iT邦新手 3 級 ‧ 2024-02-13 09:55:46

是 Merkle Tree 喔,其由來是密碼學家 Ralph Merkle

我要留言

立即登入留言