Libra教程之 資料結構和儲存

2022-01-10 11:13:21 字數 1729 閱讀 4985

前面的文章我們知道,libra會把所有的資料都儲存在賬本中。為了方便業務邏輯和資料的校驗,這個儲存是以特定的資料結構來實現的,這裡我們叫做驗證的資料結構。

驗證的資料結構是通過merkle樹來實現的。如果大家熟悉其他的區塊鏈的話,大家可能知道merkle樹由於其特殊的結構,被用在大多數區塊鏈中。

下面我們來分別討論。

如下圖所示,我們來詳細的講解其儲存的資料結構:

(1)用merkle樹來表示的不斷累加的賬本歷史。而merkle樹的根hash值是通過(2)驗證者的簽名來得到的。

每當有交易提交到賬本的時候,會把transactioninfo提交到merkle樹的葉子節點。

3表示的就是和這個葉子節點,它包含3部分內容:

對於大多數區塊鏈來說,比如位元幣,他們儲存的是交易記錄,然後以乙個乙個包含交易的塊來構成的。後面的塊包含了前面塊的hash值。

這樣做的缺點就是,如果我知道某個區塊b1是準確的,那麼我想驗證現在的區塊b2,則必須拉取從b1到b2之間的所有交易記錄,這對於區塊鏈的驗證效率是不高的。

在libra中,這個得到了改善。我們使用的是單一的merkle樹來提供表示賬本歷史的驗證過的資料結構。

在上面的圖中我們可以看到,transactioninfo包含了賬本狀態,事件和賬戶資訊。在merkle樹中,每個transactioninfo都是與乙個資料庫版本號i相對應的。

在libra中,我們使用增量的merkle tree資料結構,這對於構建效率非常有幫助,因為我們只需要向老的merkle tree中新增新的交易即可。

賬本狀態si表示了所有在版本i中的賬戶的資訊。它可以看成是乙個key value的map。其中key是256bit的賬戶位址,value就是驗證過的賬戶。

si也是用merkle tree來表示的,既然key是256bit,那麼整個merkle tree可以表示為乙個2256大小的樹如下所示:

如果直接用256大小來表示太浪費空間了,因為我們並沒有這麼多的賬戶。那麼我們可以做適當的優化:

(1)表示的是原始狀態的merkle tree。

在(2)中,我們將所有的空節點用方框表示。這樣會導致樹的不平衡,因為葉子節點總是樹的最低一層。那麼我們可以做適當的優化如(3)所示。

當狀態樹進行更新的時候,可以重用之前未更新的賬戶資料,這樣可以在驗證者中儲存狀態樹的多個版本,也可以加快驗證節點的驗證速度。

在邏輯上,乙個賬戶是資源和module的集合,並儲存在賬戶的位址中。

在物理上,賬戶儲存的是排序後的access paths對映。access paths可以看成類似檔案路徑一樣的東西。

和其他的區塊鏈不同的是,在libra中,我們鼓勵使用者將資源儲存在自己的賬戶中,在現有的版本中,我們對小賬戶做了優化,在後面的版本中我們同樣會對大賬戶也進行優化公升級。

如果所有的資源都儲存在賬戶中,那麼隨著時間的推移,賬戶資訊會變得越來越大,這會是乙個問題。

針對這個問題,libra提出了空間租賃的概念。簡單講就是給賬戶乙個過期時間,過期之後賬戶就不可以被訪問了。當然,libra也提供了過期賬戶的恢復機制,只需要支付一定數量的libra幣即可。

和賬戶一樣,事件也是使用merkle tree來儲存的,並被包含在transactioninfo中。

更多教程請參考 flydean的部落格

C 基礎教程之資料結構

c c 陣列允許定義可儲存相同型別資料項的變數,但是結構是 c 中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性 title 標題 author 作者 subject 類目 book id 書的...

資料結構大學教程之資料結構及其基本概念 2

1.3 演算法和演算法分析 algorithms and algorithm analysis 1.3.1演算法 所謂演算法 algorithm 是對問題求解步驟的一種描述,是指令的有限序列,其中每一條指令表示乙個或多個操作。在clrs中是這樣給出演算法的定義的 informally,an algo...

資料結構 邏輯結構和儲存結構

邏輯結構分為四種型別 集合結構,線性結構,樹形結構,圖形結構。集合結構 表面意思,沒有什麼深刻意義,就是資料元素同屬乙個集合,單個資料元素之間沒有任何關係。如下圖所示。線性結構 類似於線性關係,也就是說,線性結構中的資料元素之間是一對一的關係。注意 重點在一對一。如下圖所示。樹形結構 樹形結構中的資...