Bytom設計結構解讀
一、引文
設計Bytom 資料結構,組合了許多技術點,如 patricia tree,utxo, bvm, account model,protobuf,sql,memcache 等。本文會對一些技術點做以下兩點分析。
- Bytom 為什麼要採用該技術點?
- Bytom 如何應用該技術點?
最後介紹綜合這些技術點如何實現Bytom。
[patricial tree](http://www.allisons.org/ll/AlgDS/Tree/PATRICIA/)
二、為什麼要採用PAT樹?
•PAT樹具有[基數樹](https://en.wikipedia.org/wiki/Radix_tree) 的特點,內容可快速追蹤。
•PAT樹具有[merkle樹](https://en.wikipedia.org/wiki/Merkle_tree) 的特點,資料可快速證明。
在分散式系統中,一致性和有效性是十分關鍵的點。bytom採用PAT樹,其中的資料可快速證明,可以快速證明每一份狀態機是否一致。內容可快速追蹤,可以使bytom在每一個快照狀態下,快速查詢其資料,並檢驗資料的有效性。
Bytom 如何用PAT樹?
Ethereum的PAT樹是16叉基數樹,分兩層,第一層管理的是所有的賬戶,第二層管理是各賬戶的儲存內容。
Bytom 的PAT樹與Ethereum 不同?
- Bytom 的PAT樹是二叉基數樹。
- Bytom的PAT樹是用來管理未花費的outputs。
三、UTXO
為什麼要使用UTXO?
UTXO誕生於比特幣,和現實世界的RMB一樣,從央行誕生的那一刻起,他流轉無數人的賬戶,但他的價值面額始終和原來一樣,這樣以幣為中心,而不是以人為中心,資產便於監管和統計。Bytom 就是用於資產的釋出和管理的,所以,UTXO的這種以資產為中心的設計模式,是很適合Bytom上面的資產管理。
怎麼使用UTXO?
相比比特幣的UTXO, bytom的UTXO多了三個欄位
- assertid, 因為bytom是一個多資產釋出與管理的平臺,所以使用該欄位來唯一確定各種資產。
- accountid, 這是便於各賬戶對utxo的索引和管理,bytom 相比bitcoin,引入了賬戶模型,後面會介紹。
- program, 擁有該utxo的賬戶可以用Ivy語言編寫自己想要的程式放在該欄位,以便在交易時,圖靈完備的BVM會執行該程式。
四、BVM
BVM是在狀態機的轉化過程被啟動執行,也就是excute(transaction)這一步驟。
為什麼需要使用BVM?
bitcoin 中的非圖靈完備棧式指令碼語言,所表達的功能極少,很難實現一些稍微複雜的功能,如verify_spv(跨鏈錨定驗證的功能,如btc_relay),再如簡單的去實現multi_lock(M人加密,只要收集N人私鑰就能解密,0 < N < M)功能。
ethereum中的evm能簡單的用solidity語言編寫程式實現這些功能,但EVM過於複雜,它號稱超級世界計算機,對於bytom這種只對資產有興趣的區塊鏈是沒必要的。因此bytom不如基於[Chain](https://chain.com/) 公司的能用[Ivy](https://chain.com/docs/1.2/ivy-playground/docs) 高階語言程式設計的CVM去做自己的擴充套件,靈活易用。
如何使用BVM?
使用者在傳送每一筆交易時,可以自己編寫自己所需要的程式,等到交易打包進塊時,BVM會去執行該程式碼,由於BVM是圖靈完備的虛擬機器,所以需要加入feed計價機制(feed 等同於ethereum的gas * gasprice)來解決停機問題。
五、賬戶模型
為什麼要採用賬戶模型?
賬戶模型易於管理相關資料,是以人為中心,十分的直觀。對於BVM來說,基於賬戶程式碼去執行也十分便捷。再者我們引入了資產模型,類似於賬戶模型,這樣易於資產的監管和查詢。
bytom怎麼去實現賬戶模型?
bytom 中的賬戶模型也分兩類,但不同於ethereum中的個人帳戶和合約賬戶, 它是指資產賬戶和個人賬戶。
資產賬戶:
- assetid 是全域性唯一的資產識別id。
- alias 是資產的別名,可便於記憶,如(gold, silver) 。
- vmversion 是為了軟分叉時,做到動態過度。
- program 是指釋出該資產時需要執行的程式。
- initialblockhash 是指該資產是在哪個塊高度被登記。
- signer 管理公私鑰對,以便用該資產的私鑰簽名,只有擁有該資產私鑰的人才能釋出該資產。
- definition 對該資產的解釋說明等。
個人賬戶:
- accountid 全域性唯一可識別賬戶id。
- alais 帳戶名。
- signer, 私鑰對,用於傳送交易。
- *utxos 該賬戶所有的未花費交易的索引,便於快速管理該賬戶下資產。
- program, 該賬戶傳送交易時可插入需要的程式。
綜述
UTXO的物理結構,用memcache 存著。UTXO的邏輯結構則是用二叉PAT樹來管理。
個人賬戶 根據AccountId 能夠快速的索引其相關的utxo。資產賬戶根據AssetId能夠快速的管理相關的utxo。
上圖是描述bytom主要資料結構的uml圖。
Bytom用PAT樹來組織utxo作為世界狀態樹。
賬戶模型分兩種,資產賬戶和個人賬戶,賬戶可以索引管理其相關的utxo。
UTXO 池會採用如memcache的記憶體資料庫,落盤資料庫會選擇關係型資料庫,資料會選擇protobuf來序列化。
在賬戶做交易時,每個賬戶都可以從世界狀態樹去查詢選擇自己的utxo,並編寫自己所需的資產程式,將其做為TxInput。
在交易打包進塊時,驗證節點會去例項化BVM,並執行該交易中所有TxInput中的程式。
相關文章
- Derek解讀Bytom原始碼-孤塊管理原始碼
- Derek解讀Bytom原始碼-創世區塊原始碼
- Mybatis 原始碼解讀-設計模式總結MyBatis原始碼設計模式
- Derek解讀Bytom原始碼-Api Server介面服務原始碼APIServer
- Apache Hudi 設計與架構最強解讀Apache架構
- CQRS解構: 用讀寫分離設計APIAPI
- C語言程式設計讀書筆記:結構C語言程式設計筆記
- 支援 gRPC 長連結,深度解讀 Nacos 2.0 架構設計及新模型RPC架構模型
- 人人都能讀懂的設計模式(2):結構型模式設計模式
- 設計randompool結構random
- Derek解讀Bytom原始碼-protobuf生成比原核心程式碼原始碼
- Redis設計與實現閱讀總結(一)資料結構和物件Redis資料結構物件
- Derek解讀Bytom原始碼-P2P網路 地址簿原始碼
- 設計模式-結構型設計模式
- 程式結構&&程式設計程式設計
- 結構型設計模式設計模式
- 《從設計到模式》——解讀設計模式設計模式
- 【乾貨】遊戲介面設計 (二)結構設計遊戲
- JavaScript設計模式之結構型設計模式JavaScript設計模式
- 如何設計SKU表結構
- Java基本程式設計結構Java程式設計
- RecyclerView的基本設計結構View
- (Java)設計模式:結構型Java設計模式
- DDD設計模式結構圖設計模式
- 表結構設計討論
- 選擇結構程式設計程式設計
- 迴圈結構程式設計程式設計
- 設計模式詳解之結構型設計模式——介面卡、裝飾器設計模式
- 深度解讀KubeEdge架構設計與邊緣AI實踐探索架構AI
- Derek解讀Bytom原始碼-P2P網路 upnp埠對映原始碼
- 《前端架構設計》讀後記錄前端架構
- 讀《前端架構設計》 兼談架構與框架前端架構框架
- 【Java】設計模式--結構型模式Java設計模式
- PDM系統的結構設計
- 1.3順序結構程式設計程式設計
- 【RocketMQ】RocketMQ儲存結構設計MQ
- PHP結構型設計模式(下)PHP設計模式
- PHP結構型設計模式(上)PHP設計模式