日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模型存储在哪里_区块链存储的底层存储

發布時間:2023/12/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模型存储在哪里_区块链存储的底层存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

存儲在增長


區塊鏈節點作為運行在計算機之上系統,需要有地方記錄數據,自然也就需要存儲。

以上是比特幣的磁盤占用隨時間的變化圖(來自bitcoin.com)。可以看到占用空間目前已經到200G,十年200G的數據并不多,但考慮到比特幣的tps只有個位數級別,這個量級的數據已經是相當大的了。

上圖是以太坊的磁盤占用隨時間的變化圖(來自etherscan.io)。目前數據的大小為130多G,雖然沒有比特幣那么大,但是增長迅速。

區塊鏈面臨的最大問題之一是可擴展問題,可能大多數人在看到這個問題的時候都會想到tps,其實,除了tps之外,還有存儲的問題。挖礦節點中由于存儲了所有的歷史交易和區塊,隨著交易的不斷增長,占用的磁盤空間也越來越大,新節點加入到完成同步需要越來越長的時間。而這個問題會因為tps的提高而顯得越來越突出,因為寫入的速度快了,存儲的增長也會對應加快。


UTXO模型和Account模型

數據模型本身對存儲有較大的影響,與比特幣的UTXO(Unspent Transaction Output)模型不同的是,以太坊采用了Account模型。

什么是UTXO呢?UTXO模型的交易中包含input(輸入)與output(輸出),整個過程有點像我們平時用紙幣購買商品以及找零的過程。比方說,當需要在超市購買價值150元人民幣的商品時,由于沒有50元面值的紙幣,所以給出兩張100元面值的鈔票,這就是兩個input,收銀員找零50元,這其實就是兩個output,一個output是150元給到超市,一個output是50元找零還給買方,為便于理解忽略手續費。UTXO就像錢包的紙幣,一張紙幣就是一個UTXO,不會合并。

產生的output叫做Unspent Transaction Output,用于后續使用,每個output只能使用一次,所以稱為UTXO模型,如下圖所示意(來自http://bitcoin.org)。

相比之下,Account模型的流程更像銀行的轉賬,系統中存著每個賬號對應的余額等關鍵信息(而在UTXO模型中,如果需要知道某賬戶總余額,錢包客戶端需要把屬于這個賬號的所有UTXO累加起來)。

如下圖所示,整個系統中包含一個世界狀態(World State),在處理區塊時(區塊中包含Transaction),世界狀態從一個狀態變到另外一個狀態。

世界狀態中包含所有賬號的信息,每個賬號中的關鍵信息包括nonce、余額balance、storage hash和code hash。其中storage hash可以理解為這個合約存儲的hash,這對于合約賬戶來說很關鍵,因為合約大多涉及存儲讀寫。而code hash則為合約代碼的hash。


MPT(Merkle Patricia Trie)樹

如上圖,以太坊為代表的賬戶模型中,區塊頭中包含幾個重要信息:

1、tansaction root: 區塊中交易根hash,用于快速驗證交易執行結果是否相同以及證明某個交易的存在。

2、state root: 賬戶狀態(每個賬戶的余額和nonce,合約相關數據等)根hash。

3、receipts root:區塊中合約相關的交易輸出的事件根hash。

MPT全稱Merkle Patricia Trie,是以太坊用來存儲數據的一種數據結構, 它融合了Trie、Patricia Trie、Merkle Tree這3種數據結構的優點,從而實現快速查找并節省存儲空間。

Trie樹,又稱前綴樹或字典樹,是一種用于快速檢索的多叉樹結構,其中的鍵通常是字符串。與二叉查找樹不同,鍵不是直接保存在節點中,而是由節點在樹中的位置決定。一個節點的所有子孫都有相同的前綴,也就是這個節點對應的字符串,而根節點對應空字符串。實際上trie每個節點是一個確定長度的數組,數組中每個節點的值是一個指向子節點的指針,最后有個標志域,標識這個位置為止是否是一個完整的字符串,并且有幾個這樣的字符串。

Trie樹

Patricia樹,或稱Patricia trie,或crit bit tree,壓縮前綴樹,是一種更節省空間的Trie。對于每個節點,如果該節點是唯一的兒子的話,就和父節點合并。

Patricia樹

Merkle Tree,通常也被稱作Hash Tree,顧名思義就是存儲hash值的一棵樹。Merkle樹的葉子是數據塊(例如,文件或者文件的集合)的hash值。非葉節點是其對應子節點串聯字符串的hash。


MPT樹的結點類型

前面說過MPT樹是Trie、Patricia Trie、Merkle Tree這3種數據結構的結合,它包含4種結點類型:

? 空結點(NULL)

? 分支結點(branch node):包含16個分支,以及1個value

? 擴展結點(extension node):只有1個子結點

? 葉子結點(leaf node):沒有子結點,包含一個value

其中Prefix用于區分擴展節點和葉子節點。

4對key-value的MPT樹

上圖是包含4對key-value(圖中右上角列出)的MPT樹。MPT具有字典書的特征,可以用來高效查找,查找的過程大概如下:key與value均是二進制,在查找時將key的每個字節分為兩半(也就是4bits,nibble),查找時按照nibble為單位進行查找。

以a711355這個key(圖中右上角)為例,從root開始往下查找,由于所有的節點都以a7開始,所以root節點的shared nibble(s)字段包含了a7,這個節點指向一個分支節點(由hash指向而不是指針,這也就是merkle樹特性的體現)。在a711355這個key中,a7之后是1,所以在這個分支節點中找到下標為1的值,這個值指向一個Leaf Node,到這里遍歷完成,value就體現在這個Leaf Node中。


以太坊中的快速同步

以太坊為了解決節點啟動同步慢的問題,在啟動時可以指定同步的方式(syncmode),選項包括light, fast和full。其中full模式指的是在同步過程中同步全部數據,并依次驗證和執行區塊和交易;light模式只同步區塊頭,具體關心的交易都從全量節點拉取并證明,這種模式適用于輕量錢包客戶端;fast模式除了同步區塊頭之外,也會同步交易以及receipt,與full模式不一樣的是,fast模式并不執行交易。

問題來了,fast模式不執行交易那世界狀態中的數據從哪里來呢?

具體的處理方法為:在快速同步到最新區塊的時候,從別的節點同步世界狀態,由于世界狀態是MPT樹,可以方便地驗證其正確性。當同步完成MPT樹之后,切換到full模式,也即一邊同步之后的區塊,一邊執行交易以更新狀態。

這個方法從一定程度上降低了新節點同步的代價,雖然從網絡同步的數據并沒有減少,但減掉了大部分的執行時間,并且不會產生太多老舊版本的狀態樹(試想每一個區塊的root都是一個不同的樹根)。

到這里我們知道,采用Account模型的系統中,對存儲問題的處理要比UTXO模型更加靈活,因為UTXO中沒有狀態樹,無法用fast模式進行快速同步。甚至Account模型中把老的交易和區塊刪除掉,仍然可以不影響挖礦的過程。

分布式存儲

在Account模型的系統中,使用快速同步之后整個世界狀態樹將不那么大,因為不必要的老的樹節點沒有存下來。事實上也可以通過定期的MPT樹裁剪,使得樹保持相對小。如果是對空間敏感的節點,甚至可以把舊的交易或者區塊刪除掉。但是整個系統中,總需要一些全量的節點保存全量的數據,此時類似于mongodb的分布式存儲就必不可少了。引入分布式存儲的好處在于存儲空間可以動態水平擴展,而且擴展之后對讀寫性能的影響基本可以忽略,這對于數據較大的區塊鏈系統來說,是十分必要的。

總結

以上是生活随笔為你收集整理的模型存储在哪里_区块链存储的底层存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。