- 零基礎玩轉區塊鏈
- 石勝彪
- 1241字
- 2021-02-07 11:04:14
◇區塊鏈的運行機制
區塊鏈網絡是一個分布式網絡,網絡中存在眾多節點,每個節點都參與數據維護。一旦有新的數據加入,所有的節點都會對數據進行驗證,節點間必須對處理結果達成一致,才能將新加入的數據成功地寫入各自維護的區塊鏈中,讓網絡中每個節點都擁有一套完全一致的數據記錄。那么,區塊鏈是怎么工作的呢?下面,我們就以比特幣的一筆交易為例來說明區塊鏈的工作過程。
1.身份驗證
在區塊鏈網絡中沒有中心機構對節點進行認證,首要解決的問題是對節點的身份進行驗證。在比特幣區塊鏈系統中,是使用一對密鑰來完成驗證的。
創建比特幣賬戶時,會生成公鑰和私鑰,私鑰用于數字簽名,確認交易所有權;公鑰則是私鑰通過算法生成的,還是對外公開的,此過程不可逆,即無法通過公鑰推算私鑰。
用公鑰對數據進行加密后,只有對應的私鑰才能解密;用私鑰加密,只有對應的公鑰才能解密。在區塊鏈系統中,就是使用唯一匹配的私鑰和公鑰來完成加密、解密和身份驗證的,舉個例子:
Alice向Bob發送消息“Hello Bob”。
首先,用Bob提供的公鑰對信息進行加密形成密文,Bob使用自己的私鑰對密文進行解密;解密后的結果如果是“Hello Bob”,則證明這個消息是正確的。
其次,還提供了簽名機制,Alice可以用自己的私鑰對消息進行簽名,Bob則要通過Alice提供的公鑰進行驗簽,從而證明該消息的發送者是Alice。
2.交易確認
如果某個節點發起一筆交易,交易不會被立刻添加到區塊鏈中,首先會對交易余額進行校驗。可是,在區塊結構中,并沒有記錄賬戶余額,如何才能知道交易方有足夠的余額呢?在比特幣交易網絡中,貨幣的所有權是通過驗證歷史交易信息來核實的。
例如,Alice要給Bob發送1個BTC, Alice必須援引之前收到這個或更多的比特幣的歷史交易信息,即“進賬”; Bob會查看那些進賬,確保Alice是真正的接收者,確保進賬數額為1個BTC或更多。如果一筆交易已被使用過一次,該筆交易就會被認為是已消費,且不能被再次使用。
如果Alice的賬戶通過了驗證,則該筆交易就是合法交易,Bob會將交易信息保存在事務池(或內存池)中,廣播給其他節點;其他節點接收到交易信息后,也會進行同樣的校驗操作。
3.交易記錄
當某一個節點獲得記賬權后,會將交易納入區塊,在區塊上加蓋時間戳,并記錄到自己維護的區塊鏈中;然后,將該區塊進行全網廣播,其他節點接到廣播后,將區塊記錄到各自維護的區塊鏈中。
上例中Alice給Bob的轉賬完成,交易信息被記錄到區塊鏈上,無法更改。
4.雙重支付和分叉
比如,Alice賬戶有一個未消費的BTC, Alice將這個BTC同時發送給Bob和Tom,就是“雙重支付”或“雙花”。如果兩筆交易被先后驗證,例如,給Bob的交易通過驗證,那么給Tom的交易就會驗證失敗,反之亦然。如果兩筆交易被同時驗證,都被認為是有效交易,接入區塊鏈時,就會暫時出現分叉情況,如圖4-1所示。

圖4-1 兩筆有效交易接入區塊鏈時出現的分叉情況
之后的區塊認同哪個區塊,就會在哪個區塊后面延續。比特幣規定,選擇最長的那條鏈進行擴展,所以一旦有新的區塊加入,就會沿著最長的鏈延續,較短的那條鏈上的區塊就會被拋棄,對應的交易也將失效,失效的交易就要承擔相應的損失。
- Functional Python Programming
- Spring Boot 2實戰之旅
- 程序員面試白皮書
- Redis Applied Design Patterns
- 數據結構和算法基礎(Java語言實現)
- C和C++安全編碼(原書第2版)
- Twilio Best Practices
- Java編程指南:基礎知識、類庫應用及案例設計
- Learn Programming in Python with Cody Jackson
- Scratch 3游戲與人工智能編程完全自學教程
- 信息安全技術
- Visual Basic程序設計與應用實踐教程
- Getting Started with Python Data Analysis
- WebRTC技術詳解:從0到1構建多人視頻會議系統
- Unity UI Cookbook