在位元幣中,是不存在乙個中心化的機構對位元幣的交易進行結算清算的,自然也就沒有中心化的資料庫對使用者的賬戶進行管理。事實上,在位元幣系統中是沒有賬戶這個概念的,取而代之的是utxo(unspent transaction output),即未消費的交易輸出。這是中本聰的乙個極其天才的設計。通過utxo方案,位元幣的交易得以在乙個無第三方的系統中完成。在了解位元幣的utxo模式之前,我們先來看一下基於賬戶模式的銀行、**等系統是如何處理使用者交易的。
假設a、b在某銀行各擁有乙個賬戶,現在a需要轉賬100元給b。那麼銀行將執行:
1. 檢查a賬戶餘額是否充足,如果不足100元就終止交易,向a報「餘額不足」
2. 如果餘額充足,那麼在a的賬戶裡減去100元
3. 在b賬戶裡增加100元
這一切都是在銀行的中心資料庫中完成的。
現在我們就來看看沒有中心化資料庫的位元幣,是如何通過utxo,取代賬戶模式進行交易記錄的。
我們先丟擲utxo模型的三個原則:
1.所有交易始於coinbase交易(即始於挖礦獎勵所得)
2.除了coinbase交易之外,所有的交易輸入都必須來自於前面乙個或者幾個交易的utxo輸出(就像接水管一樣,乙個接乙個,此齣彼入,此入彼出,生生不息,錢就在交易之間流動起來了)。
3.每一筆的交易支出總額等於交易收入總額。
這裡只需要有乙個簡單的概念,然後我們結合例項,具體來體會這一過程。
要理解utxo,最簡單的辦法就是把一枚位元幣從誕生到在商海中沉浮的經歷描述一下。我們假設乙個這樣的場景:張三作為礦工挖到12.5 枚位元幣。過了幾天,他把其中 2.5 枚支付給李四。又過了幾天,他和李四各出資 2.5 位元幣湊成 5 位元幣付給王五。
下面我們看一下,這幾個交易是怎麼通過utxo實現的:
我們先回顧一下區塊鏈的區塊結構:
圖一中的交易資訊,就是記錄在圖二區塊結構中的交易字段
然後我們結合utxo的三個原則和,繼續進行解讀。
1.我們之前已經學過,挖礦是位元幣產生的唯一途徑。每個區塊的第乙個交易叫做coinbase交易。每乙個區塊的獎勵就在這裡產生,指向礦工(張三)的位址,即礦工挖礦的收入為12.5btc。
2.現在張三想把自己的12.5枚位元幣轉賬2.5枚給李四。注意,在傳統賬戶模式中,只需要在各自的賬戶進行增減就可以了,而utxo的機制是不同的。每乙個utxo都是乙個整體,是不能分割的(模擬乙個utxo就是乙個硬幣,不管面值多少,必須全部花出去),也就是系統預設的乙個找零機制。
即張三位址中的12.5枚位元幣全部轉出,其中2.5枚轉到李四的位址,剩餘10枚位元幣轉到張三的位址。(這個位址可以是新位址,也可以是原位址,需要你的轉賬的時候備註,如果不填寫的話,剩餘的位元幣可就全部成為礦工的手續費了)。
有人會問,為什麼要多此一舉,直接轉2.5枚出來剩下的不動不就行了嗎?這就是utxo和賬戶模式的區別,除了coinbase交易之外,所有的交易輸入都必須來自於前面乙個或者幾個交易的utxo輸出,且每一筆的交易支出總額等於交易收入總額。
注意觀察:每一筆轉賬前面都是有資金**標註的。也就是說,在位元幣系統中是沒有餘額的概念的,獲取乙個使用者餘額的方法就是把當前使用者位址全部的utxo加起來。這樣做的目的,有很多優點,比如安全性、私隱性更高,而且也有效防止了雙花攻擊等等。
3.同理,張三和李四準備各出2.5枚btc轉給王五。那麼張三或李四發起 #3001 號交易,在交易輸入部分,有兩個資金**,分別是#2001(1) 和 #2001(2),代表第 #2001 號交易的第 (1) 和第 (2) 項 utxo。然後在這個交易的輸出部分裡如法炮製,給王五5位元幣,把張三剩下的 7.5 位元幣發還給自己。以後王五若要再花他這5位元幣,就必須在他的交易裡註明資金的**是 #3001(1)。
截止到這裡,我們就明白了utxo究竟為何物,一枚btc從挖礦產生,到不停地被交易,其實整個體系中存在的就是很多個utxo。也有這麼一句話:其實就沒有什麼位元幣,有的就是utxo。這麼說其實是對的,因為這就是位元幣交易的方式。位元幣沒有實物,只有資料,utxo就是它的存在形態。
自己的12.5枚位元幣轉賬2.5枚給李四。注意,在傳統賬戶模式中,只需要在各自的賬戶進行增減就可以了,而utxo的機制是不同的。每乙個utxo都是乙個整體,是不能分割的(模擬乙個utxo就是乙個硬幣,不管面值多少,必須全部花出去),也就是系統預設的乙個找零機制。
即張三位址中的12.5枚位元幣全部轉出,其中2.5枚轉到李四的位址,剩餘10枚位元幣轉到張三的位址。(這個位址可以是新位址,也可以是原位址,需要你的轉賬的時候備註,如果不填寫的話,剩餘的位元幣可就全部成為礦工的手續費了)。
有人會問,為什麼要多此一舉,直接轉2.5枚出來剩下的不動不就行了嗎?這就是utxo和賬戶模式的區別,除了coinbase交易之外,所有的交易輸入都必須來自於前面乙個或者幾個交易的utxo輸出,且每一筆的交易支出總額等於交易收入總額。
注意觀察:每一筆轉賬前面都是有資金**標註的。也就是說,在位元幣系統中是沒有餘額的概念的,獲取乙個使用者餘額的方法就是把當前使用者位址全部的utxo加起來。這樣做的目的,有很多優點,比如安全性、私隱性更高,而且也有效防止了雙花攻擊等等。
3.同理,張三和李四準備各出2.5枚btc轉給王五。那麼張三或李四發起 #3001 號交易,在交易輸入部分,有兩個資金**,分別是#2001(1) 和 #2001(2),代表第 #2001 號交易的第 (1) 和第 (2) 項 utxo。然後在這個交易的輸出部分裡如法炮製,給王五5位元幣,把張三剩下的 7.5 位元幣發還給自己。以後王五若要再花他這5位元幣,就必須在他的交易裡註明資金的**是 #3001(1)。
截止到這裡,我們就明白了utxo究竟為何物,一枚btc從挖礦產生,到不停地被交易,其實整個體系中存在的就是很多個utxo。也有這麼一句話:其實就沒有什麼位元幣,有的就是utxo。這麼說其實是對的,因為這就是位元幣交易的方式。位元幣沒有實物,只有資料,utxo就是它的存在形態。
總結一下,utxo的三個原則
1)所有交易始於coinbase(即始於挖礦獎勵所得);
2)除了coinbase交易之外,所有的交易輸入都必須來自於前面乙個或者幾個交易的utxo輸出。
3)每一筆的交易支出總額等於交易收入總額;
utxo與支付系統賬戶模型的區別是什麼?
1)在位元幣系統中,沒有賬戶的概念,所以也就沒有餘額的概念,有的只是utxo,位元幣交易系統中,用一連串的關聯交易來計算,某位址(模擬於賬戶系統中的賬戶概念)下究竟有多少utxo,通過這個utxo計算值來確定,乙個位址是否具有轉移出一筆交易的能力。
2)區別
在支付系統賬戶模型中,乙個賬戶具有賬戶名(賬戶唯一id)和密碼,通過賬戶id和密碼認證,即獲得了對該賬戶的使用權和支配權。也就是說,該賬戶內的所有資產歸經過密碼安全認證的人所有。
在位元幣交易系統中,沒有賬戶id和賬戶密碼一說,也沒有賬戶餘額計算一說。但是 有公鑰(錢包位址)和秘鑰,可以淺顯的模擬理解為:公鑰就是賬戶id,私鑰就是賬戶密碼。在位元幣交易系統中,知道對方公鑰,就可以給對方轉賬進行交易。擁有了私鑰,就代表著擁有了該位址下所有utxo的使用權和控制權。
ps:上文說到,在支付系統賬戶模型中,會遇到常見的「雙花攻擊」,在位元幣交易系統中,沒有賬戶餘額概念,但是有某位址的淨未花費交易輸出個數,這個數值計算,從上到下掃瞄一遍同一位址所有的進進出出,立等可取。你只要等上6個區塊的確認時間,就能確保不被雙重支付,因為這筆交易得到了全網的確認;
位元幣UTXO交易模型
因為位元幣網路有個天然的問題 分叉問題,總是可能出現多個位元幣礦工挖出合法區塊,然後在鏈上產生分叉。在這個時候位元幣有一條規則 多條分叉鏈出現時,最長鏈 積累工作量最多的鏈 是有效的。如果你挖出一條比現有的誠實鏈更長的攻擊鏈,那大家就會承認你的攻擊鏈是有效的,誠實鏈會被作廢。這個時候就會產生雙花問題...
位元幣 區塊鏈
區塊鏈 一種實時記錄全部交易的去中心化公開資料 庫,在區塊鏈上進行支付時全網計算機共同查詢區塊鏈資料,共同驗證這筆支付交易是否有效。確認支付後將寫入區塊鏈並產生一條不可篡改記錄。區塊 區塊大小是1m,包含父雜湊 merkle根 時間戳 難度目標 隨機數。程式上近似每10分鐘增加乙個block,blo...
區塊鏈 位元幣中的區塊 賬戶驗證和記賬
賬本驗證問題 賬戶所有權的證明 如果我要通過某個賬戶給另乙個賬戶轉賬,必然需要證明我對此賬戶的所有權。對於中心化的貨幣系統,我們只需要向銀行出示密碼即可,但是對於去中心化的系統,如果我們也通過出示密碼給其他節點,來證明我們對賬戶的所有權,那麼我們的密碼也就洩露給了其他節點 即使用者 事實上這是乙個現...