這種賬本結構允許互不相干的交易“並行”寫入,降低衝突概率,提高系統吞吐能力。這種使用者DAG結構有先天的安全性缺陷。這是由於交易是按賬戶分組的,一個交易只會附加到其所屬賬戶的賬戶鏈末端,其他賬戶產生的交易不會自動成為該交易的後繼節點,因此,一些交易被回滾的概率不會隨時間推移而降低。Vite透過獨創的快照鏈技術,彌補了這一缺陷,實現了白皮書中承諾的使用者鏈、合約鏈和快照鏈的全部功能。
【智慧合約】
智慧合約目前完成了必要的內建合約的開發,已經實現的內建合約包括:超級節點註冊、超級節點投票、抵押Vite Token、建立委託共識組。並且即將支援使用者編譯智慧合約程式碼,釋出智慧合約,vm支援大部分evm指令。
其中:
超級節點註冊,當一個節點申請註冊成為超級節點時,需要發起一個註冊交易,並支付100w Vite Token,鎖倉3個月,鎖倉開始時間為response交易引用的快照塊的時間。當response交易被快照後,這個節點就可以作為超級節點候選被投票,超級節點不能重複註冊。
超級節點投票,使用者賬戶可以發起一筆交易,為超級節點投票,一個使用者只能投一票。當一個節點申請註冊成為超級節點並鎖倉超過3個月時,可以發起一個登出超級節點的交易,退出超級節點候選列表,提取鎖倉的ViteToken。
抵押ViteToken,抵押人指定受益人、抵押金額和抵押到期時間,受益人可以在抵押期間使用抵押金額對應的額度。當抵押的response交易被快照時,受益人可以享受相應的額度。一個受益人可以持有多個抵押人抵押的ViteToken;一個抵押人可以給多個受益人抵押ViteToken;當抵押人在抵押到期時(抵押開始時間 + 抵押時間)取回抵押的ViteToken,取回時需要指定受益人和金額,金額不能大於抵押人為受益人抵押的總金額。
建立委託共識組,建立委託共識組需要抵押1000ViteToken,最小抵押時間為3個月。系統內建計票規則、超級節點註冊條件、投票條件,後期可支援自定義規則。
【HDPoS機制】
個人賬戶透過私有共識組進行共識,合約賬戶透過委託共識組進行共識,快照鏈透過快照共識組進行共識。DAG共識保證賬本快速寫入,快照鏈共識提高交易的不可篡改性。生產使用者賬戶和合約賬戶的請求交易和響應交易對應的區塊,分別寫入請求方和響應方的賬本,完成賬戶鏈的區域性共識。對賬本中的資料進行快照,由超級節點根據出塊計劃依次生產快照塊,完成全域性的共識,實現不可篡改。
【非同步通訊】
Vite中的非同步設計主要包括三個方面:
1、請求和響應的非同步設計
2、交易寫入和確認的非同步設計
3、合約間通訊的非同步設計
Vite中的交易分為請求交易和響應交易。無論是一筆轉賬還是一次合約呼叫,均會在賬本上先後生成兩筆交易。傳送交易或者呼叫合約不會因為接收者是否線上或者響應過慢而受到阻塞,有效提高吞吐。同時,不同賬戶的交易可以分佈在網路中的不同的節點上,為系統帶來了擴充套件性。
交易寫入賬本和被系統確認也是非同步的。不同的使用者可以並行的將交易寫入賬本,快照鏈將以固定的速度對賬本進行快照。一旦交易被快照,就可以認為是一次確認,隨著快照鏈的增長,確認數也會累積。非同步確認機制可以削平交易寫入速率的峰谷,最大化利用系統資源。
Vite的合約間通訊採用了一種基於訊息驅動的架構,合約間不共享狀態,只透過彼此傳送訊息進行通訊。Vite的賬本擔任了訊息中介軟體的角色,並且可以保障訊息的Exactly Once語義。基於訊息的架構具有高吞吐和擴充套件性的優勢。但與此相應,付出的代價是程式設計模型變得相對複雜,無法保證強一致性,而且有可能使延遲變大。經過認真的研究,我們發現在實際場景中,強一致性語義是可以用BASE(最終一致性)語義替代的。由於Vite的HDPoS共識演算法可以保障交易確認在一秒之內完成,因此,延遲的增加仍然在可控範圍之內。
【快照鏈】
超級節點負責快照塊的生產,超級節點根據選舉結果判斷是否該為自己出塊時間,如果是自己的出塊時間,把驗證好的使用者塊和合約塊打包,生成一個快照塊,放入到自己的快照鏈賬本里面,並廣播出去;對於網路上傳來的快照塊,所有全節點會根據競選結果驗證出塊權是否正確,並且驗證資料的合理性;由於網路環境等因素導致的超級節點出塊分叉,採用最長的合法鏈作為本地快照鏈的世界狀態,同時儲存分叉資料,以防後續分叉資料成為更長的本地快照鏈。如果發生了分叉(本地節點產生了更長的快照鏈和之前認定的快照鏈不存在延續關係),那麼本地會將本地賬本切換到最長快照鏈對應的世界狀態,對應的使用者鏈和合約鏈也會和快照鏈嚴格保持一致。
【Vite鑄幣】
因為區塊鏈金融屬性是基礎的能力,因此Vite測試網路原生支援了鑄幣內建合約,和以太透過外接合約方式實現不同,我們直接原生支援了快速鑄幣,使用者只需要給內建鑄幣合約地址傳送一筆交易就可以輕鬆鑄幣。使用者傳送request塊鑄幣交易給鑄幣合約,填寫必要的token資訊;鑄幣合約地址,校驗成功後,生成了response塊,並且傳送給指定的地址所鑄幣的所有token;被指定的地址,生成response塊,接收所鑄幣的所有token;同時快照鏈快照了以上所有塊,鑄幣成功。
【超級節點註冊和選舉】
節點抵押Vite競選超級節點,使用者為超級節點投票,透過呼叫投票內建合約;每輪次統一投票結果,確定下次的超級節點名單以及超級節點的出快照塊順序。例如25個節點,每個節點連續出三個塊,每個塊時間1s,那麼一輪即為75s左右。超級節點發現新的一輪即將開始,開始統計內建投票合約鏈結果,開始生成下一輪25個節點出塊順序。後續節點按照該順序出塊。
【交易最佳化】
為了兼顧安全性並且滿足對高吞吐、低延遲和擴充套件性的要求,我們在系統模組劃分和系統模組之間的呼叫投入了非常多的時間完善,下圖為一筆交易發生的過程:
說明:
pool(本地世界狀態判斷模組)將接收來自於節點Producer模組生產的快照塊、節點傳送交易的request塊、在途(生產響應塊模組)生產出的response塊和其他節點產生網路傳遞過來的以上三種塊。
傳送交易節點:錢包或者命令列透過vite rpc 生產request塊,傳送給pool(本地世界狀態判斷)模組,pool透過生產驗證模組(判斷配額,vm驗證等)將資料插入到本地賬本,同時透過P2P廣播到網路上。
接收交易節點:接收交易的地址節點上線後,會從網路獲取到request塊,並且交給onroad pool(在途)來生產接收塊,確定交易成功。並把response塊廣播到網路中。
挖礦節點:超級節點會收集所有的使用者塊,並且根據共識結果,在自己的出塊週期內打包所有的確定的使用者交易塊和合約塊,生成snapshot塊,廣播到網路中。