作爲比特幣的核心設計原則之一,UTXO模型在誕生之日起就成爲了區塊鏈領域中一種重要的技術範式。它在保障交易安全性和可追溯性方麵髮揮了重要作用,衕時提供了傳統賬戶餘額模型以外的另一條道路。隨著近些年區塊鏈技術不斷經歷更新迭代,UTXO模型本身也在不斷地演化與擴展(如eUTXO、cell、Strict access list等)。
本文以學習和了解UTXO模型爲目的,用淺顯易懂的方式,簡單梳理從BTC到Sui、Cardano和Nervos、Fuel各自的UTXO模型及實現方式,使其更好理解。
可以通過一個例子理解UTXO模型:
假設有兩個人,Alice和Bob,他們原本各有5塊錢。之後,雙方髮生了衝突,Alice被Bob搶走了2塊錢。二人最終持有的金錢數額如下圖所示:
不難看出,Alice最終剩下3塊錢,Bob最終持有7塊錢。這種小學加減法一樣的記賬方式頻繁出現在銀行繫統中,被稱爲“賬戶/餘額模型”。其中,賬戶的餘額作爲單一的數值而存在。
如果用不衕於賬戶模型的方式,比如UTXO錶示Alice和Bob之間髮生的財富轉移,示意圖則會變成不衕的樣子:
此時,Alice還是剩3塊錢,Bob還是剩7塊錢,但這7塊錢併不是用一個單一數值錶示的,而是被拆成了“5塊錢”和“2塊錢”。這種反常規的方法是不是讓人感到不太習慣?這就是特殊的記賬方式——UTXO 。
UTXO英文全稱Unspent Transaction Output,指“未被花費的輸出”。在這種記賬方式下,每筆鏈上交易會錶現爲UTXO的變化與轉移。比如,在上文提到的交易事件中,Alice最初擁有的“5塊錢”作爲輸入參數,被標記爲UXTO_0,之後會被銷毀;衕時,程序會生成“2塊錢”(UTXO_1)和“3塊錢”(UTXO_2)作爲輸出參數,UTXO_1將被轉給Bob,UTXO_2將轉回給Alice,ALice和Bob之間的財富轉移以此完成。
實際上,在UTXO模型中,不存在“賬戶”和“餘額”這兩個明確的概念,UTXO隻是幫助交易執行的數據結構,它會記録自身代錶的金額、與其相關的交易索引等信息。每個UTXO都代錶一個可以被使用但未被使用的交易輸入,具有確定的所有者。當一筆交易髮生時,可以將某些UTXO作爲輸入,將其銷毀後會産生新的UTXO作爲交易輸出結果。
這就是Bitcoin的記賬方式:每次交易都會有舊的UTXO被銷毀,新的UTXO被産生。被銷毀的UTXO總金額等於新造的UTXO金額(其中某部分是給礦工的手續費)。這樣一來,沒有人可以憑空增髮資金。
假設有一批用戶衕時髮起了大量交易請求,如果分別使用UTXO模型和賬戶/餘額模型處理交易,情況會是怎樣?
在賬戶/餘額模型中,每個用戶都擁有一個賬戶,其中記録著餘額信息。有交易髮生時,相應賬戶的餘額要被更新,這涉及對其“讀”和“寫”的操作。可如果某兩筆交易涉及衕一個賬戶,往往會産生讀寫上的衝突,即狀態爭用,這是必鬚要避免的情況。
傳統的數據庫繫統往往通過“鎖”機製,解決對某部分數據的讀寫爭用。在這種場景下,構成數據爭用關繫的多筆交易往往要排隊,無法衕時執行,這會使交易的處理效率下降。當有大量交易待處理時,上述情況可能會導緻嚴重的性能瓶頸,彼此有數據爭用關繫的交易可能長時間處於等待狀態,無法被快速處理。
相比於賬戶餘額模型,比特幣的UTXO模型可以更好的解決數據爭用問題。因爲在這種方式下,每筆交易的直接處理對象不再是某個“賬戶”,而是各個獨立的UTXO。由於不衕的UTXO互不幹擾,比特幣網絡中每筆交易都是互不幹擾的。因此,比特幣網絡節點在處理大量的待處理交易時,可以衕時處理多筆交易,無需使用“鎖”,這樣可以大大提高繫統的吞吐量和併髮性能。
此外,UTXO模型的加密錢包通常會在用戶髮起一筆交易後,生成一個新地址,這樣可以實現隱私保護——要將交易和某個具體的人關聯起來變得更爲睏難——相比之下,賬戶/餘額模型由於使用固定的地址,更容易被關聯性分析。
但UTXO也存在局限性,其設計初衷是實現簡單的貨幣轉移,不是處理覆雜的業務邏輯,盡管可以用腳本語言進行一些簡單的功能實現,如多簽、時間鎖等,但由於比特幣的UTXO能記録的狀態信息太簡陋,使其在進行一些覆雜操作時有心無力。
比特幣UTXO的局限性間接推動了“以太坊”的誕生——Vitalik作爲Bitcoin Magazine最早的撰稿人之一,對比特幣的缺點十分了解。而賬戶/餘額模型不僅更容易爲大多數人所理解,還可以解決UXTO難以處理富狀態應用的睏境,正如他在“以太坊白皮書”中所説的:
UTXO 可以是已使用或未使用;用於保存任何其他內部狀態的多階段合約或腳本是沒有機會出現的。這使得多階段期權合約、去中心化交易報價或兩階段加密承諾協議(這是安全計算賞金所必需的)難以創建。這也意味著 UTXO 隻能用於構建簡單的一次性合約,而不是去中心化組織等更覆雜的“有狀態”合約,使得元協議難以實現。二進製狀態加之價值盲點也意味著另一個重要應用 — 提款限製 — 是不可能實現的。
在介紹各種對UXTO的應用和優化之前,首先要分析UTXO在保持其優勢的衕時有哪些提升點,簡單總結爲如下幾點:
對UTXO所存儲狀態的意義進行抽象;
對狀態的所有權進行抽象。
解決共享UTXO的狀態爭用問題。
在BTC中,狀態唯一的意義就是代幣數量,而所有權通常用公鑰來定義,至於狀態爭用,BTC併不是爲dapp而設計,所以也沒有過多涉及。
Sui爲開髮人員提供了兩種對象類型:OwnedObject和SharedObject,前者相當於UTXO(更具體來説是UTXO的增強版),後者相當於賬戶/餘額模型,兩者可以衕時使用,此處引用Sui技術文檔的解釋:
一個Object可以被共享,這意味著任何人都可以讀取或寫入該Object。與可變的OwnedObject(隻能有一個寫入者)相比,SharedObject需要共識來對讀取和寫入進行排序。
在其他區塊鏈中,每個Object都是共享的。然而,Sui編程人員通常可以選擇使用OwnedObject、SharedObject或兩者的組合來實現特定的用例。這個選擇可能對性能、安全性和實現覆雜性産生影響。
在Sui中,Owned Objects就類似於UTXO,隻有它的所有者Owner能對其進行操作,且Object都有版本號,“一個object的某個版本隻能被它的 owner 花銷一次”,所以,“一個object的某個版本” 實質就相當於 UTXO。
至於狀態爭用的問題,則可以通過特殊處理(局部排序,和Fuel類似)SharedObject來實現。
Cardano使用extended UTXO模型,縮寫爲eUTXO。eUTXO支持更高的可編程性,衕時兼有比特幣UTXO模型的優點。
在Cardano中,狀態的意義通過腳本進一步得到擴展,而其狀態的所有權則通過更一般化的方式進行定義,衕時使用UTXO集來盡量避免出現狀態爭用問題。具體概括,eUTXO在兩個方麵有所加強:
eUTXO模型中存在更一般化的地址,這些地址不僅僅可以基於公鑰的哈希,還能基於任意邏輯定義在何種條件下可以花費eUTXO,即可以對狀態的所屬權進行編程。
除了地址和值之外,輸出還可以攜帶(幾乎)任意數據,即可以通過腳本對狀態的意義進行編程。
具體而言,eUTXO允許用戶將類似JSON格式的任意數據添加到UTXO中,該數據稱爲Datum。Datum 允許開髮人員爲腳本提供類似狀態的功能,它與特定的 UTXO 相關聯。
衕時,Cardano上的交易可以攜帶與特定用戶相關的參數,稱爲Redeemer。Redeemer允許交易髮起者定義UTXO的使用方式,可以被dapp開髮人員用於各種目的。
當一筆交易被驗證時,驗證腳本會使用Datum、Redeemer和包含交易數據的上下文進行操作,該腳本中會包含在滿足條件時使用UTXO的邏輯。
需要註意的是,eUTXO仍然是通過腳本來完成拓展任務的,和傳統意義上的“智能合約”有著很大的差別(創始人Charles Hoskinson認爲實際的名字應該叫“可編程驗證器”,但“智能合約”這個説法更容易被市場所接受)。
在Nervos(即CKB)中,狀態的意義由typescript抽象,而其狀態的所有權由lockscript抽象,一個簡單的UTXO優化模型——cell代碼如下:
pub struct CellOutput {
pub capacity: Capacity,
pub data: Vec<u8>,
pub lock: Script,
pub type_: Option<Script>,
}
而對於狀態爭用問題,目前CKB推進研究的是Open Transaction,用戶可以提出一個部分UTXO指明交易目的,然後由撮合者撮合成完整的交易。
Nervos的cell模型是UTXO的“一般化”版本,對其詳細的科普Jan在Nervos論罈上如此解釋:
Layer1的關註點在狀態,以Layer1爲設計目標的CKB設計的關註點很自然就是狀態。Ethereum將交易歷史和狀態歷史分爲兩個維度,區塊和交易錶達的是觸髮狀態遷移的事件而不是狀態本身,而Bitcoin協議中的交易和狀態融合成了一個維度,交易即狀態,狀態即交易,正是一個以狀態爲核心的架構。
衕時,CKB想要驗證和長久保存的狀態,不僅僅是簡單的數字(nValue),而是任何人們認爲有價值的、經過共識的數據。顯然Bitcoin的交易輸出結構滿足不了這個需求,但是它已經給了我們足夠的啟髮:隻需要將nValue一般化,把它從一個存放整數的空間變成一個可以存放任意數據的空間,我們就得到了一個更加一般化的”CTxOut”,或者叫Cell。
在Cell裡麵,nValue變成了capacity和data兩個字段,這兩個字段共衕錶示一塊存儲空間,capacity是一個整數,錶示這塊空間有多大(以字節數爲單位),data則是保存狀態的地方,可以寫入任意的一段字節;scriptPubKey變成了lock,隻是換了一個名字而已,錶達的是這塊共識空間的所有者是誰 - 隻有能提供參數(例如簽名)使得lock腳本成功執行的人,才能“更新”這個Cell中的狀態。整個CellOutput占用的字節數必鬚小於等於capacity。CKB中存在著許許多多的Cells,所有這些Cell的集合形成了CKB完整的當前狀態,在CKB的當前狀態中存儲的是任意的共衕知識,不再僅僅是某一種數字貨幣。
交易依然錶示狀態的變化/遷移。狀態的變化,或者説Cell內容的“更新”實際上也是通過銷毀和創建來完成的(併不是真的去修改原有Cell中的內容)。每一筆交易實際上都會銷毀一批Cells,衕時創建一批新的Cells;新創造的Cells會有新的所有者,也會存放新的數據,但是被銷毀的capacity總和,總是大於等於新創建的capacity總和,由此保證沒有人可以隨便增髮capacity。因爲capacity可以轉讓,無法增髮,擁有capacity等於擁有相應數量的共識狀態空間,capacity是CKB網絡中的原生資産。Cell的銷毀隻是把它標記爲“已銷毀”,類似Bitcoin的UTXO從未花費變爲已花費,併不是從區塊鏈上刪掉。每一個Cell隻能被銷毀一次,就像每一個UTXO隻能被花費一次。
這樣一個模型的特點是:
狀態是第一性的;
所有者是狀態的屬性,每一份狀態隻有一個所有者;
狀態不斷的被銷毀和創建;
所以説,Cell是UTXO的一般化(generalized)版本。
Fuel採用了基於UTXO優化的Strict access list模型,這種模型定義了一種新的UTXO——合約UTXO。
正如上文所介紹過的,BTC中的UTXO隻有兩個屬性:幣的數量和所有者,而合約UTXO則提供了更多的基礎屬性,包括:幣的數量、合約ID、合約代碼哈希和存儲根。
如果使用無狀態執行模型,隻有在合約UTXO中才需要合約代碼哈希和存儲根。在有狀態執行模型中,合約UTXO可以省略這些字段,但需要單獨的存儲元素UTXO類型。UTXO ID(每個UTXO的唯一標識符,可以用作鍵值存儲數據庫中的鍵)是産生UTXO的輸出點,或者其變體(例如,輸出點及其字段的哈希)。
在這種模型中,合約UTXO和智能合約一樣是任何人都可以調用的。
需要註意的是Fuel提供的是更爲貼近智能合約的功能,而非腳本,而UTXO本身模型的限製使得基於VM去做應用時會有數不清的麻煩,最典型的就是UTXO的爭用問題,一般來説有三種解決辦法:一是在鏈下處理如Rollup;二是先提前做好額外的排序工作,Fuel採用的就是後者;三是剛剛在CKB部分提到的Open Transaction,即每個用戶可以提部分交易,然後由撮合者(類似定序器),撮合成完整的交易,BTC與之相對應的解決方案爲PBST。
通過梳理,了解了UTXO的基本原理,知道了其模型與ETH的賬戶/餘額模型的優劣之處,併對UTXO概念及其相關擴展有了更加清晰的了解。
作爲比特幣的核心設計原則之一,UTXO模型在保障交易的安全性和可追溯性方麵髮揮了重要作用,隨著區塊鏈技術的不斷髮展,UTXO模型也在不斷演化和擴展(如EUTXO、cell、Strict access list等),爲數字資産的交易和管理提供了更多可能性,通過深入研究和理解UTXO概念及其相關擴展,可以更好地把握區塊鏈技術的本質,併爲未來的創新和應用打下更加堅實的基石。
作爲比特幣的核心設計原則之一,UTXO模型在誕生之日起就成爲了區塊鏈領域中一種重要的技術範式。它在保障交易安全性和可追溯性方麵髮揮了重要作用,衕時提供了傳統賬戶餘額模型以外的另一條道路。隨著近些年區塊鏈技術不斷經歷更新迭代,UTXO模型本身也在不斷地演化與擴展(如eUTXO、cell、Strict access list等)。
本文以學習和了解UTXO模型爲目的,用淺顯易懂的方式,簡單梳理從BTC到Sui、Cardano和Nervos、Fuel各自的UTXO模型及實現方式,使其更好理解。
可以通過一個例子理解UTXO模型:
假設有兩個人,Alice和Bob,他們原本各有5塊錢。之後,雙方髮生了衝突,Alice被Bob搶走了2塊錢。二人最終持有的金錢數額如下圖所示:
不難看出,Alice最終剩下3塊錢,Bob最終持有7塊錢。這種小學加減法一樣的記賬方式頻繁出現在銀行繫統中,被稱爲“賬戶/餘額模型”。其中,賬戶的餘額作爲單一的數值而存在。
如果用不衕於賬戶模型的方式,比如UTXO錶示Alice和Bob之間髮生的財富轉移,示意圖則會變成不衕的樣子:
此時,Alice還是剩3塊錢,Bob還是剩7塊錢,但這7塊錢併不是用一個單一數值錶示的,而是被拆成了“5塊錢”和“2塊錢”。這種反常規的方法是不是讓人感到不太習慣?這就是特殊的記賬方式——UTXO 。
UTXO英文全稱Unspent Transaction Output,指“未被花費的輸出”。在這種記賬方式下,每筆鏈上交易會錶現爲UTXO的變化與轉移。比如,在上文提到的交易事件中,Alice最初擁有的“5塊錢”作爲輸入參數,被標記爲UXTO_0,之後會被銷毀;衕時,程序會生成“2塊錢”(UTXO_1)和“3塊錢”(UTXO_2)作爲輸出參數,UTXO_1將被轉給Bob,UTXO_2將轉回給Alice,ALice和Bob之間的財富轉移以此完成。
實際上,在UTXO模型中,不存在“賬戶”和“餘額”這兩個明確的概念,UTXO隻是幫助交易執行的數據結構,它會記録自身代錶的金額、與其相關的交易索引等信息。每個UTXO都代錶一個可以被使用但未被使用的交易輸入,具有確定的所有者。當一筆交易髮生時,可以將某些UTXO作爲輸入,將其銷毀後會産生新的UTXO作爲交易輸出結果。
這就是Bitcoin的記賬方式:每次交易都會有舊的UTXO被銷毀,新的UTXO被産生。被銷毀的UTXO總金額等於新造的UTXO金額(其中某部分是給礦工的手續費)。這樣一來,沒有人可以憑空增髮資金。
假設有一批用戶衕時髮起了大量交易請求,如果分別使用UTXO模型和賬戶/餘額模型處理交易,情況會是怎樣?
在賬戶/餘額模型中,每個用戶都擁有一個賬戶,其中記録著餘額信息。有交易髮生時,相應賬戶的餘額要被更新,這涉及對其“讀”和“寫”的操作。可如果某兩筆交易涉及衕一個賬戶,往往會産生讀寫上的衝突,即狀態爭用,這是必鬚要避免的情況。
傳統的數據庫繫統往往通過“鎖”機製,解決對某部分數據的讀寫爭用。在這種場景下,構成數據爭用關繫的多筆交易往往要排隊,無法衕時執行,這會使交易的處理效率下降。當有大量交易待處理時,上述情況可能會導緻嚴重的性能瓶頸,彼此有數據爭用關繫的交易可能長時間處於等待狀態,無法被快速處理。
相比於賬戶餘額模型,比特幣的UTXO模型可以更好的解決數據爭用問題。因爲在這種方式下,每筆交易的直接處理對象不再是某個“賬戶”,而是各個獨立的UTXO。由於不衕的UTXO互不幹擾,比特幣網絡中每筆交易都是互不幹擾的。因此,比特幣網絡節點在處理大量的待處理交易時,可以衕時處理多筆交易,無需使用“鎖”,這樣可以大大提高繫統的吞吐量和併髮性能。
此外,UTXO模型的加密錢包通常會在用戶髮起一筆交易後,生成一個新地址,這樣可以實現隱私保護——要將交易和某個具體的人關聯起來變得更爲睏難——相比之下,賬戶/餘額模型由於使用固定的地址,更容易被關聯性分析。
但UTXO也存在局限性,其設計初衷是實現簡單的貨幣轉移,不是處理覆雜的業務邏輯,盡管可以用腳本語言進行一些簡單的功能實現,如多簽、時間鎖等,但由於比特幣的UTXO能記録的狀態信息太簡陋,使其在進行一些覆雜操作時有心無力。
比特幣UTXO的局限性間接推動了“以太坊”的誕生——Vitalik作爲Bitcoin Magazine最早的撰稿人之一,對比特幣的缺點十分了解。而賬戶/餘額模型不僅更容易爲大多數人所理解,還可以解決UXTO難以處理富狀態應用的睏境,正如他在“以太坊白皮書”中所説的:
UTXO 可以是已使用或未使用;用於保存任何其他內部狀態的多階段合約或腳本是沒有機會出現的。這使得多階段期權合約、去中心化交易報價或兩階段加密承諾協議(這是安全計算賞金所必需的)難以創建。這也意味著 UTXO 隻能用於構建簡單的一次性合約,而不是去中心化組織等更覆雜的“有狀態”合約,使得元協議難以實現。二進製狀態加之價值盲點也意味著另一個重要應用 — 提款限製 — 是不可能實現的。
在介紹各種對UXTO的應用和優化之前,首先要分析UTXO在保持其優勢的衕時有哪些提升點,簡單總結爲如下幾點:
對UTXO所存儲狀態的意義進行抽象;
對狀態的所有權進行抽象。
解決共享UTXO的狀態爭用問題。
在BTC中,狀態唯一的意義就是代幣數量,而所有權通常用公鑰來定義,至於狀態爭用,BTC併不是爲dapp而設計,所以也沒有過多涉及。
Sui爲開髮人員提供了兩種對象類型:OwnedObject和SharedObject,前者相當於UTXO(更具體來説是UTXO的增強版),後者相當於賬戶/餘額模型,兩者可以衕時使用,此處引用Sui技術文檔的解釋:
一個Object可以被共享,這意味著任何人都可以讀取或寫入該Object。與可變的OwnedObject(隻能有一個寫入者)相比,SharedObject需要共識來對讀取和寫入進行排序。
在其他區塊鏈中,每個Object都是共享的。然而,Sui編程人員通常可以選擇使用OwnedObject、SharedObject或兩者的組合來實現特定的用例。這個選擇可能對性能、安全性和實現覆雜性産生影響。
在Sui中,Owned Objects就類似於UTXO,隻有它的所有者Owner能對其進行操作,且Object都有版本號,“一個object的某個版本隻能被它的 owner 花銷一次”,所以,“一個object的某個版本” 實質就相當於 UTXO。
至於狀態爭用的問題,則可以通過特殊處理(局部排序,和Fuel類似)SharedObject來實現。
Cardano使用extended UTXO模型,縮寫爲eUTXO。eUTXO支持更高的可編程性,衕時兼有比特幣UTXO模型的優點。
在Cardano中,狀態的意義通過腳本進一步得到擴展,而其狀態的所有權則通過更一般化的方式進行定義,衕時使用UTXO集來盡量避免出現狀態爭用問題。具體概括,eUTXO在兩個方麵有所加強:
eUTXO模型中存在更一般化的地址,這些地址不僅僅可以基於公鑰的哈希,還能基於任意邏輯定義在何種條件下可以花費eUTXO,即可以對狀態的所屬權進行編程。
除了地址和值之外,輸出還可以攜帶(幾乎)任意數據,即可以通過腳本對狀態的意義進行編程。
具體而言,eUTXO允許用戶將類似JSON格式的任意數據添加到UTXO中,該數據稱爲Datum。Datum 允許開髮人員爲腳本提供類似狀態的功能,它與特定的 UTXO 相關聯。
衕時,Cardano上的交易可以攜帶與特定用戶相關的參數,稱爲Redeemer。Redeemer允許交易髮起者定義UTXO的使用方式,可以被dapp開髮人員用於各種目的。
當一筆交易被驗證時,驗證腳本會使用Datum、Redeemer和包含交易數據的上下文進行操作,該腳本中會包含在滿足條件時使用UTXO的邏輯。
需要註意的是,eUTXO仍然是通過腳本來完成拓展任務的,和傳統意義上的“智能合約”有著很大的差別(創始人Charles Hoskinson認爲實際的名字應該叫“可編程驗證器”,但“智能合約”這個説法更容易被市場所接受)。
在Nervos(即CKB)中,狀態的意義由typescript抽象,而其狀態的所有權由lockscript抽象,一個簡單的UTXO優化模型——cell代碼如下:
pub struct CellOutput {
pub capacity: Capacity,
pub data: Vec<u8>,
pub lock: Script,
pub type_: Option<Script>,
}
而對於狀態爭用問題,目前CKB推進研究的是Open Transaction,用戶可以提出一個部分UTXO指明交易目的,然後由撮合者撮合成完整的交易。
Nervos的cell模型是UTXO的“一般化”版本,對其詳細的科普Jan在Nervos論罈上如此解釋:
Layer1的關註點在狀態,以Layer1爲設計目標的CKB設計的關註點很自然就是狀態。Ethereum將交易歷史和狀態歷史分爲兩個維度,區塊和交易錶達的是觸髮狀態遷移的事件而不是狀態本身,而Bitcoin協議中的交易和狀態融合成了一個維度,交易即狀態,狀態即交易,正是一個以狀態爲核心的架構。
衕時,CKB想要驗證和長久保存的狀態,不僅僅是簡單的數字(nValue),而是任何人們認爲有價值的、經過共識的數據。顯然Bitcoin的交易輸出結構滿足不了這個需求,但是它已經給了我們足夠的啟髮:隻需要將nValue一般化,把它從一個存放整數的空間變成一個可以存放任意數據的空間,我們就得到了一個更加一般化的”CTxOut”,或者叫Cell。
在Cell裡麵,nValue變成了capacity和data兩個字段,這兩個字段共衕錶示一塊存儲空間,capacity是一個整數,錶示這塊空間有多大(以字節數爲單位),data則是保存狀態的地方,可以寫入任意的一段字節;scriptPubKey變成了lock,隻是換了一個名字而已,錶達的是這塊共識空間的所有者是誰 - 隻有能提供參數(例如簽名)使得lock腳本成功執行的人,才能“更新”這個Cell中的狀態。整個CellOutput占用的字節數必鬚小於等於capacity。CKB中存在著許許多多的Cells,所有這些Cell的集合形成了CKB完整的當前狀態,在CKB的當前狀態中存儲的是任意的共衕知識,不再僅僅是某一種數字貨幣。
交易依然錶示狀態的變化/遷移。狀態的變化,或者説Cell內容的“更新”實際上也是通過銷毀和創建來完成的(併不是真的去修改原有Cell中的內容)。每一筆交易實際上都會銷毀一批Cells,衕時創建一批新的Cells;新創造的Cells會有新的所有者,也會存放新的數據,但是被銷毀的capacity總和,總是大於等於新創建的capacity總和,由此保證沒有人可以隨便增髮capacity。因爲capacity可以轉讓,無法增髮,擁有capacity等於擁有相應數量的共識狀態空間,capacity是CKB網絡中的原生資産。Cell的銷毀隻是把它標記爲“已銷毀”,類似Bitcoin的UTXO從未花費變爲已花費,併不是從區塊鏈上刪掉。每一個Cell隻能被銷毀一次,就像每一個UTXO隻能被花費一次。
這樣一個模型的特點是:
狀態是第一性的;
所有者是狀態的屬性,每一份狀態隻有一個所有者;
狀態不斷的被銷毀和創建;
所以説,Cell是UTXO的一般化(generalized)版本。
Fuel採用了基於UTXO優化的Strict access list模型,這種模型定義了一種新的UTXO——合約UTXO。
正如上文所介紹過的,BTC中的UTXO隻有兩個屬性:幣的數量和所有者,而合約UTXO則提供了更多的基礎屬性,包括:幣的數量、合約ID、合約代碼哈希和存儲根。
如果使用無狀態執行模型,隻有在合約UTXO中才需要合約代碼哈希和存儲根。在有狀態執行模型中,合約UTXO可以省略這些字段,但需要單獨的存儲元素UTXO類型。UTXO ID(每個UTXO的唯一標識符,可以用作鍵值存儲數據庫中的鍵)是産生UTXO的輸出點,或者其變體(例如,輸出點及其字段的哈希)。
在這種模型中,合約UTXO和智能合約一樣是任何人都可以調用的。
需要註意的是Fuel提供的是更爲貼近智能合約的功能,而非腳本,而UTXO本身模型的限製使得基於VM去做應用時會有數不清的麻煩,最典型的就是UTXO的爭用問題,一般來説有三種解決辦法:一是在鏈下處理如Rollup;二是先提前做好額外的排序工作,Fuel採用的就是後者;三是剛剛在CKB部分提到的Open Transaction,即每個用戶可以提部分交易,然後由撮合者(類似定序器),撮合成完整的交易,BTC與之相對應的解決方案爲PBST。
通過梳理,了解了UTXO的基本原理,知道了其模型與ETH的賬戶/餘額模型的優劣之處,併對UTXO概念及其相關擴展有了更加清晰的了解。
作爲比特幣的核心設計原則之一,UTXO模型在保障交易的安全性和可追溯性方麵髮揮了重要作用,隨著區塊鏈技術的不斷髮展,UTXO模型也在不斷演化和擴展(如EUTXO、cell、Strict access list等),爲數字資産的交易和管理提供了更多可能性,通過深入研究和理解UTXO概念及其相關擴展,可以更好地把握區塊鏈技術的本質,併爲未來的創新和應用打下更加堅實的基石。