介紹#
UTXO
全稱為 Unspent Transaction Output
,即未花費的交易輸出。它是比特幣和一些其他區塊鏈網絡中的一種核心概念。
在比特幣等基於 UTXO 的區塊鏈網絡中,交易並不是直接從一個帳戶轉移到另一個帳戶,而是通過輸入和輸出的方式進行的。每一筆交易都會有一些輸入和輸出,輸入是指引用之前交易的輸出,輸出則是創建新的 UTXO。
UTXO 可以被視為電子現金。當你收到比特幣時,你實際上是收到了一些 UTXO。當你發送比特幣時,你實際上是在消費一些 UTXO,並生成新的 UTXO。
Note
是不是所有的 output 都是 UTXO?
不是的,所有的 output 並不都是 UTXO。
在比特幣和其他基於 UTXO 的區塊鏈網絡中,只有那些還沒有被花費的 output 才被稱為 UTXO。
當一個 output 被用作一筆新交易的輸入時,這個 output 就被視為已經被花費,因此它就不再是 UTXO。在這種情況下,新的交易會生成新的 output,這些新的 output 就成為新的 UTXO。
所以,可以說 UTXO 是所有 output 中的一個子集,只包括那些還沒有被花費的 output。
案例#
在比特幣和其他基於 UTXO 的區塊鏈網絡中,你的帳戶餘額實際上是由你可以花費的 UTXO 的總和決定的。每個 UTXO 都有一個關聯的值,這個值就是它代表的比特幣數量。
例如,假設你有三個 UTXO,它們的值分別是 0.5 BTC、0.2 BTC 和 0.3 BTC。那麼,你的帳戶餘額就是這三個 UTXO 的值的總和,即 1 BTC。
當你發送比特幣時,你需要選擇足夠的 UTXO 來覆蓋你想要發送的金額。例如,如果你想要發送 0.6 BTC,你可以選擇值為 0.5 BTC 和 0.2 BTC 的 UTXO。然後,你會創建一個新的交易,這個交易的輸入是你選擇的 UTXO,輸出是你想要發送的金額和找零。
在這個例子中,新的交易的輸出會是兩個:一個是 0.6 BTC,這是你想要發送的金額;另一個是 0.1 BTC,這是你的找零。這個找零會成為一個新的 UTXO,你可以在未來的交易中花費它。
偽代碼實現計算帳戶餘額#
以下是計算基於 UTXO 的區塊鏈網絡中帳戶餘額的偽代碼:
- 初始化一個變量 balance 為 0,這個變量將用來存儲帳戶的餘額。
- 獲取帳戶的所有 UTXO。這通常通過調用一個函數或方法來完成,例如 getUTXOs (address),其中 address 是帳戶的地址。
- 遍歷所有的 UTXO。對於每個 UTXO:
- 檢查 UTXO 是否未被花費。這可以通過檢查 UTXO 的 spent 屬性來完成。如果 spent 為 false,則表示 UTXO 未被花費。
- 如果 UTXO 未被花費,那麼將其值(通常是 value 屬性)加到 balance 上。
- 在遍歷完所有 UTXO 後,balance 就是帳戶的餘額。
以下是這個過程的偽代碼表示:
function calculateBalance(address) {
let balance = 0;
// 假設 getUTXOs 是一個可以獲取到指定地址所有 UTXO 的函數
let utxos = getUTXOs(address);
for (let utxo of utxos) {
if (!utxo.spent) {
balance += utxo.value;
}
}
return balance;
}
作用#
UTXO(Unspent Transaction Output)的作用主要有以下幾點:
- 記錄帳戶餘額:在基於 UTXO 的區塊鏈網絡中,帳戶的餘額是由其所有 UTXO 的值的總和來表示的。每個 UTXO 都有一個關聯的值,這個值就是它代表的比特幣數量。
- 交易驗證:UTXO 也用於交易的驗證。當一筆新的交易發生時,這筆交易的輸入必須是有效的 UTXO。這樣可以確保交易的輸入是未被花費的,從而防止雙重支付。
- 交易創建:當你想要發送比特幣時,你需要選擇足夠的 UTXO 來覆蓋你想要發送的金額。然後,你會創建一個新的交易,這個交易的輸入是你選擇的 UTXO,輸出是你想要發送的金額和找零。這個找零會成為一個新的 UTXO,你可以在未來的交易中花費它。
- 提高隱私:由於每次交易都會生成新的 UTXO,這使得追蹤交易變得更加困難,從而提高了用戶的隱私。
- 並行處理:UTXO 模型允許多個交易並行處理,因為每個交易都是獨立的,只要它們的輸入 UTXO 沒有重疊,就可以同時處理,從而提高了區塊鏈網絡的吞吐量。