<wbr id="rn1zl"></wbr>
<wbr id="rn1zl"></wbr>
  1. <form id="rn1zl"></form>

    <em id="rn1zl"></em>
      <font id="rn1zl"><thead id="rn1zl"></thead></font>
          <font id="rn1zl"><s id="rn1zl"></s></font><xmp id="rn1zl"><mark id="rn1zl"><output id="rn1zl"></output></mark></xmp>

          中國比特幣官網

          區塊鏈的狀態爆炸困境 |硬核系列

            03

            舉個例子:Bitcoin的歷史和狀態

            Bitcoin的狀態,指的是Bitcoin賬本當前的樣子。

            Bitcoin的狀態是由一個個UTXO(尚未花費的交易輸出)構成的,每個UTXO代表了一定數量的Bitcoin,每個UTXO上面寫了一個名字(scriptPubkey),記錄這個UTXO的所有者是誰。如果要做一個比喻的話,Bitcoin的當前狀態是一個裝滿了金幣的袋子,每個金幣上刻著所有者的名字。

            Bitcoin的歷史由一連串的交易構成,交易內部的主要結構是輸入和輸出。交易更改狀態的方法是,把當前狀態中包含的一些UTXO(交易輸入引用的那些)標記為已花費,從UTXO集合中移出,然后把一些新的UTXO(這個交易的輸出)添加到UTXO集合里面去。

          可以看出,Bitcoin交易的輸出(TXO,Transaction Output)正是上面說的UTXO,UTXO只不過是一種處于特殊階段(尚未花費)的TXO。因為構成Bitcoin狀態的組件(UTXO),同時也是構成交易的組件(TXO)。  可以看出,Bitcoin交易的輸出(TXO,Transaction Output)正是上面說的UTXO,UTXO只不過是一種處于特殊階段(尚未花費)的TXO。因為構成Bitcoin狀態的組件(UTXO),同時也是構成交易的組件(TXO)。

            由此,Bitcoin有一個奇妙的性質:任意時刻的狀態都是歷史的一個子集,歷史和狀態包含的數據類型是同一維度的。交易的歷史(所有被打包的交易的集合,即所有產生過的TXO的集合)即狀態的歷史(每個區塊對應的UTXO集合的集合,也是所有產生過的TXO的集合),Bitcoin的歷史只包含交易。

            在Bitcoin網絡中,每一個區塊,每一個UTXO都要持續占用節點的存儲空間。目前Bitcoin整個歷史的大?。ㄋ袇^塊加起來的大小)大約是200G,而狀態的大小只有大約3G(由大約5000萬個UTXO組成)。Bitcoin通過對區塊大小的限制很好的管理了歷史的增長速度,由于其歷史和狀態之間的子集關系,狀態數據大小必然遠小于歷史數據大小,因此狀態增長也間接的受到區塊大小的管理。

            04

            再舉個例子:Ethereum的歷史和狀態

            Ethereum的狀態,也叫做「世界狀態」,指的是Ethereum賬本當前的樣子。Ethereum的狀態是由賬戶構成的一棵Merkle樹(賬戶是葉子),賬戶里面不僅記錄了余額(代表一定數量的ether),還有合約的數據(例如每一只加密貓的數據)。Ethereum的狀態可以看作一個大賬本,賬本的第一列是名字,第二列是余額,第三列是合約數據。

            Ethereum的歷史同樣由交易構成,交易內部的主要結構是:

            to:另一個賬戶,代表交易的發送對象

            value:交易攜帶的ether數量

            data:交易攜帶的任意信息

            交易更改狀態的方法是,EVM找到交易發送的目標賬戶,

            1.根據交易的value計算目標賬戶的新余額;

            2.將交易攜帶的data作為參數傳遞給目標賬戶的智能合約,運行智能合約的邏輯,在運行中可能會修改任意賬戶的內部狀態生成新的狀態;

            3.構造新的葉子存放新的狀態,更新狀態Merkle樹 。

          可以看出,Ethereum的歷史和交易結構與Bitcoin相比有非常大的不同。Ethereum的狀態是由賬戶構成的,而交易是由觸發賬戶變動的信息構成,狀態和交易中記錄的是完全不同類型的數據,二者之間沒有超集和子集的關系,歷史和狀態所包含的數據類型是兩個維度的,交易歷史大小與狀態大小之間沒有必然的聯系。  可以看出,Ethereum的歷史和交易結構與Bitcoin相比有非常大的不同。Ethereum的狀態是由賬戶構成的,而交易是由觸發賬戶變動的信息構成,狀態和交易中記錄的是完全不同類型的數據,二者之間沒有超集和子集的關系,歷史和狀態所包含的數據類型是兩個維度的,交易歷史大小與狀態大小之間沒有必然的聯系。

            交易修改狀態后,不僅會產生新的狀態(圖中實線框的葉子),而且會留下舊的狀態(圖中虛線框的葉子)成為歷史狀態,因此Ethereum的歷史不僅僅包含交易,還包含歷史狀態。

            因為歷史和狀態屬于不同的維度,Ethereum區塊頭中不僅僅包含交易的merkle root, 也需要顯式包含狀態的merkle root。

            Ethereum中每一個區塊,每一個賬戶都會持續占用節點的存儲空間。Ethereum節點在同步的時候有多種模式,在Archive模式下所有的歷史和狀態都會保存下來,其中歷史包括歷史交易和歷史狀態,所有數據加起來大小超過了2TB;在Default模式下,歷史狀態會被裁剪掉,本地只保留歷史交易和當前狀態,所有數據加起來大約是170G,其中交易歷史大小是150G,當前狀態大小是10G。

          此文由 中國比特幣官網 編輯,未經允許不得轉載?。?a href="http://www.huohuxiazai.com/">首頁 > 比特幣行情 » 區塊鏈的狀態爆炸困境 |硬核系列

          ()
          分享到:

          相關推薦

          評論 暫無評論

          国产精品吹潮在线观看中文