設計Bytom 數據結構,組合了許多技術點,如 patricia tree,utxo, bvm, account model,protobuf,sql,memcache 等。本文會對一些技術點作如下兩點分析。sql
最後介紹綜合這些技術點如何實現Bytom。數據庫
[patricial tree](http://www.allisons.org/ll/AlgDS/Tree/PATRICIA/)編程
•PAT樹具備[基數樹](https://en.wikipedia.org/wiki... 的特色,內容可快速追蹤。設計模式
•PAT樹具備[merkle樹](https://en.wikipedia.org/wiki... 的特色,數據可快速證實。數據結構
在分佈式系統中,一致性和有效性是十分關鍵的點。bytom採用PAT樹,其中的數據可快速證實,能夠快速證實每一份狀態機是否一致。內容可快速追蹤,可使bytom在每個快照狀態下,快速查找其數據,並檢驗數據的有效性。分佈式
Bytom 如何用PAT樹?區塊鏈
Ethereum的PAT樹是16叉基數樹,分兩層,第一層管理的是全部的帳戶,第二層管理是各帳戶的存儲內容。加密
Bytom 的PAT樹與Ethereum 不一樣?spa
爲何要使用UTXO?設計
UTXO誕生於比特幣,和現實世界的RMB同樣,從央行誕生的那一刻起,他流轉無數人的帳戶,但他的價值面額始終和原來同樣,這樣以幣爲中心,而不是以人爲中心,資產便於監管和統計。Bytom 就是用於資產的發佈和管理的,因此,UTXO的這種以資產爲中心的設計模式,是很適合Bytom上面的資產管理。
怎麼使用UTXO?
相比比特幣的UTXO, bytom的UTXO多了三個字段
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中的我的賬戶和合約帳戶, 它是指資產帳戶和我的帳戶。
資產帳戶:
我的帳戶:
UTXO的物理結構,用memcache 存着。UTXO的邏輯結構則是用二叉PAT樹來管理。
我的帳戶 根據AccountId 可以快速的索引其相關的utxo。資產帳戶根據AssetId可以快速的管理相關的utxo。
上圖是描述bytom主要數據結構的uml圖。
Bytom用PAT樹來組織utxo做爲世界狀態樹。
帳戶模型分兩種,資產帳戶和我的帳戶,帳戶能夠索引管理其相關的utxo。
UTXO 池會採用如memcache的內存數據庫,落盤數據庫會選擇關係型數據庫,數據會選擇protobuf來序列化。
在帳戶作交易時,每一個帳戶均可以從世界狀態樹去查找選擇本身的utxo,並編寫本身所需的資產程序,將其作爲TxInput。
在交易打包進塊時,驗證節點會去實例化BVM,並執行該交易中全部TxInput中的程序。