500行代碼了解Vite基本設計
09-10
500行代碼了解Vite基本設計
此文來源於Vite技術哥哥——viteshan資深互聯網開發工程師,多年系統架構設計經驗,所搭建系統支撐過1000萬日訂單的並發處理量。18年6月加入Vite,目前負責共識的開發。
1簡介從白皮書了解到,vite的核心賬本結構是DAG,DAG中存儲了每個用戶的每筆交易信息。為了提高整個DAG賬本的數據安全性,vite首創提出了快照鏈,使用快照鏈進一步保障DAG的不可篡改性。白皮書描述的賬本結構比較抽象,本文通過簡單的500行代碼來實現vite中DAG的賬本結構以及快照鏈。2核心概念1Vite中DAG賬本結構vite在設計賬本結構的時候,從降低偽分叉率和防篡改(vite白皮書中有詳細解釋定義)這兩個角度做了一次權衡,
TxType共有兩個類型,分別代表著發送交易和接收交易,與vite白皮書中一次轉賬會生成兩個交易相對應。賬本賬戶狀態的數據結構如下,可以看到,賬戶狀態引用了交易數據tx,這個表示了每次賬戶狀態變化都是由一個交易引起的。發送賬戶會引用TxType未send的交易,接收賬戶會引用TxType未received的交易。賬戶狀態會定期被快照鏈快照,snapshot block定義如下。Height代表snapshot block的高度,每次增加1,AccountsHash代表所有被緩存賬戶狀態的hash。
以上介紹的是組成vite的基本數據結構,下文的轉賬交易和snapshotblock生成都是在這幾個數據結構上進行操作。這兩個數據結構分別代表著vite賬戶鏈和快照鏈。accoutStateBlockChain是一個map數據結構,key為每個賬戶的地址,value是一個AccountStateBlock鏈表,通過PreHash指向上一個block;snapshotBlock是一個SnapshotBlock鏈表,也是通過PreHash指向上一個block;2發送交易
發送交易的核心代碼如上圖:1. 構造發送交易交易,並對發送交易進行簽名;2. 打包賬戶狀態塊,並對打包的賬戶狀態塊進行簽名;3. 將賬戶狀態塊插入到賬戶鏈上,並將該區塊結果進行廣播;3接收交易
挖礦賬戶會定期進行快照塊的生成,並將快照塊插入到snapshot鏈中。4總結本文的主要目的是簡單介紹naive-vite的主要流程,同時通過這個簡單的demo來讓大家了解vite的基本原理。鏈接:https://github.com/viteshan/naive-vite如果大家想了解更多細節,歡迎關注vite官網:https://www.vite.org/同時歡迎查閱vite的第一版官方實現鏈接:https://github.com/vitelabs/go-vite參考資料1. vite白皮書https://www.vite.org/whitepaper/vite_cn.pdf2. vite-naive源碼https://github.com/viteshan/naive-vite3. block-tutorialhttps://github.com/mycoralhealth/blockchain-tutorial#公鏈黑馬,代碼說話#(一)請通過Vite官方渠道了解最新動態:
上圖是vite白皮書中描述的若干種區塊鏈賬本結構在偽分叉和防篡改兩個方面的表現。
vite選擇了block-lattice的DAG。下面來主要描述一下block-lattice的DAG結構。上圖中,世界狀態用S表示,S1中有三個初始的賬戶A、B、C,三個賬戶狀態分別是A0、B0、C0,實線箭頭方向表示這個相同賬戶的上一個賬戶狀態,虛線箭頭表示不同賬戶狀態間的間接影響(如轉賬),假設初始狀態賬戶餘額都是100元,1. 初始世界狀態:S1={A0=100, B0=100, C0=100}2. 賬戶B向賬戶A轉賬20元之後,世界狀態:S2={A1=120, B1=80, C0=100}3. 賬戶A向賬戶C轉賬30元之後,世界狀態:S3={A2=90, B1=80, C1=130}
在vite中,每一個賬戶狀態就是一個區塊(如圖中A0、A1等),區塊之間的引用關係(即圖中箭頭)即賬戶間轉賬過程。所有賬戶轉賬的歷史流水,構成了一張有向無環圖(DAG),這就是vite的DAG賬本結構。2Vite中快照鏈結構由賬戶區塊組成的DAG鏈,能夠清晰的描述世界狀態的變化。但是,由於每個賬戶鏈條長度與交易頻率相關,這就導致了交易頻率不夠高的賬戶鏈條比較容易被篡改。為了解決這個問題,vite中引入了快照鏈結構,通過快照鏈的不斷增長來加大單純賬戶鏈的防篡改度。上圖中,描述了賬戶S1、S2、S3的世界狀態,箭頭的方向標識的是該狀態的上一個狀態。其實這就是快照鏈,快照鏈中的每一個區塊都能表示一個世界狀態(所有賬戶狀態的集合),同時每一個區塊都引用上一個區塊。當然,為了簡化存儲,vite的實際規範中,每個區塊描述的是從上一個區塊到這個區塊變動的賬戶狀態集合。
如下圖所示。而且區塊的生成是固定頻率,而不是每筆交易都去生成一個snapshot區塊。3代碼實現上面簡單介紹了vite中DAG賬本和snapshot鏈結構,下面會通過代碼簡單實現這兩個數據結構,並簡單實現轉賬過程和snapshot鏈生成過程。1數據結構賬本間的轉賬是通過交易進行的,下面定義了交易的數據結構:會有一個協程等待廣播事件產生,並驗證block合法性,同時如果需要生成對應的received交易,將會將tx轉發到對應的節點。
對應節點收到send交易之後,驗證ok之後:1. 生成received的交易,並對交易進行簽名;2. 打包賬戶狀態塊,並對打包的賬戶狀態塊進行簽名;3. 將賬戶狀態塊插入到賬戶鏈中,並將該區塊結構進行廣播。4快照鏈快照過程- 官網:https://www.vite.org/
- Twitter:https://twitter.com/vitelabs
- Discord:https://discordapp.com/invite/CsVY76q
- Telegram:https://t.me/vite_zh
http://weixin.qq.com/r/1ChQSJPERc46rdcr933G (二維碼自動識別)
※違章也能高大上,教你從「違章代碼」就能看出扣不扣分,扣幾分!
※在圖片上直接寫字的代碼編輯技巧【學習交流】
※左圖右文混排代碼:
※幾個論壇簽名顯IP的代碼!很簡單,大家都可以用 - 綠色軟體下載 - JZ5U綠色下載站
※女人如書代碼
TAG:代碼 | 代碼重構 | 區塊鏈Blockchain |