# 前言
本節對前面內容做一個總結,以便更加清晰地看到區塊鏈的實現方式,包含技術、設計思路、類的組織等。
# 類圖

在Go語言里面的類的function和field的訪問控制包括private和public兩種,他們的區別是:大寫字母命名的均為public,小寫字母命名的都是private。
# 三個核心類
Block、Blockchain、Transaction是三個核心類。
(1)Block類:區塊

Block是區塊鏈進行擴展最重要的地方。
接下來,我們將在區塊鏈里面增加Data字段,以將更多的信息保存到區塊鏈上。
(2)Transaction類:交易

一個交易,包含輸入輸出,它體現了區塊鏈的核心設計:在匿名情況下,如何保證交易的可靠進行,將交易發送人以前未花費的輸出納入到本次交易的輸入,交易完成后,零錢發回到交易發送人。此外,對輸入的簽名和上鏈前的校驗(輸入包含自校驗所需的所有信息),也是保證匿名交易達成的重要設計。
交易的輸入和輸出,我們將在后面進行擴展成腳本語言,解決多重簽名需求,并實現真正的智能合約。
(3)Blockchain:區塊鏈

區塊鏈是分布式數據庫。
我們把Block、UTXO、UTXOBlock保存到數據庫中。其中最關鍵的是Block數據庫表,為了提高效率,我們將UTXO、UTXOBlock也存入到數據庫中。
# 區塊鏈的主要應用場景
在區塊鏈的主要交易場景中,交易是P2PKH(Pay To Public Hash),涉及三個節點:
(1)中心節點
(2)錢包節點
(3)礦工節點
1. 中心節點創建一個區塊鏈。
2. 一個其他(錢包)節點連接到中心節點并下載區塊鏈。
3. 另一個(礦工)節點連接到中心節點并下載區塊鏈。
4. 錢包節點創建一筆交易。
5. 礦工節點接收交易,并將交易保存到內存池中。
6. 當內存池中有足夠的交易時,礦工開始挖一個新塊。
7. 當挖出一個新塊后,將其發送到中心節點。
8. 錢包節點與中心節點進行同步。
9. 錢包節點的用戶檢查他們的支付是否成功。
用例圖:

請求區塊同步時序圖:

交易處理時序圖:

# 區塊鏈的網絡通信主要功能
1)區塊同步。通過網絡請求,下載本地缺失的區塊;
2)發送交易。
3)接收交易,通過挖礦將交易上鏈。
# 區塊鏈應用層通信協議設計

慣常的做法,我們會用command+payload的方式設計應用層協議,其中要注意到是,command的長度一般需要固定,在解析傳送來的數據時候,先解析命令,再在不同命名的處理函數中,解析該命令的payload。
Go很適合網絡開發,struct是網絡進行payload傳輸很適合的定義方式。
# 區塊鏈網絡通信特點
1、區塊鏈是P2P網絡,因此加入區塊鏈的每一個節點,既是服務器,也是客戶端。
所以,一般在sendData時候,都會將發送者的addr作為payload的一部分,發送給對方。
2、P2P通信,是點對點的強通信方式,多次請求-回答完成交互,從發送“麻煩告訴我你版本是什么”開始,發現本地版本比對方低,于是接著發送“麻煩告訴我你有什么”,對方將回復區塊或交易的概要(哈希列表),再緊接著向對方要具體的數據(如某個區塊或者某個交易)。
3、由于是P2P通信,所以每次請求-回答的數據都很小:在區塊鏈中,每次請求只會請求一個區塊的數據或者一個交易的數據,這將最大限度保證通信的可靠性。
- 重要更新說明
- linechain發布
- linechain新版設計
- 引言一
- 引言二
- 引言三
- vs-code設置及開發環境設置
- BoltDB數據庫應用
- 關于Go語言、VS-code的一些Tips
- 區塊鏈的架構
- 網絡通信與區塊鏈
- 單元測試
- 比特幣腳本語言
- 關于區塊鏈的一些概念
- 區塊鏈組件
- 區塊鏈第一版:基本原型
- 區塊鏈第二版:增加工作量證明
- 區塊鏈第三版:持久化
- 區塊鏈第四版:交易
- 區塊鏈第五版:實現錢包
- 區塊鏈第六版:實現UTXO集
- 區塊鏈第七版:網絡
- 階段小結
- 區塊鏈第八版:P2P
- P2P網絡架構
- 區塊鏈網絡層
- P2P區塊鏈最簡體驗
- libp2p建立P2P網絡的關鍵概念
- 區塊鏈結構層設計與實現
- 用戶交互層設計與實現
- 網絡層設計與實現
- 建立節點發現機制
- 向區塊鏈網絡請求區塊信息
- 向區塊鏈網絡發布消息
- 運行區塊鏈
- LineChain
- 系統運行流程
- Multihash
- 區塊鏈網絡的節點發現機制深入探討
- DHT
- Bootstrap
- 連接到所有引導節點
- Advertise
- 搜索其它peers
- 連接到搜到的其它peers
- 區塊鏈網絡的消息訂發布-訂閱機制深入探討
- LineChain:適用于智能合約編程的腳本語言支持
- LineChain:解決分叉問題
- LineChain:多重簽名
- libp2p升級到v0.22版本
- 以太坊基礎
- 重溫以太坊的樹結構
- 世界狀態樹
- (智能合約)賬戶存儲樹
- 交易樹
- 交易收據樹
- 小結
- 以太坊的存儲結構
- 以太坊狀態數據庫
- MPT
- 以太坊POW共識算法
- 智能合約存儲
- Polygon Edge
- block結構
- transaction數據結構
- 數據結構小結
- 關于本區塊鏈的一些說明
- UML工具-PlantUML
- libp2p介紹
- JSON-RPC
- docker制作:啟動多個應用系統
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基礎操作整理
- jupyter計算交互環境
- git技巧一
- git技巧二
- 使用github項目的最佳實踐
- windows下package管理工具