- 區塊鏈超入門(第2版)
- 方軍
- 8842字
- 2021-09-29 10:25:41
2.比特幣是如何轉賬的——比特幣區塊鏈的五個技術性細節
“互聯網上的商務交易,幾乎都需要借助金融機構作為可信賴的第三方來處理電子支付。”比特幣白皮書的第一句話描述了這一現實,中本聰試圖改變它。中本聰是如何把可信第三方從比特幣的交易中去掉呢?
用兩個人之間的轉賬交易示例,我們來看看比特幣系統是如何實現交易的去中介與去中心化的。假設我是甲,要把自己錢包地址中的8枚比特幣轉給你(乙),即轉到你的錢包地址中去。詳細討論這一轉賬交易過程,我們可以看到比特幣區塊鏈是如何工作的,其中涉及的五個技術性細節為(見圖1-7):
·分布式賬本和去中心網絡。
·未花費的交易輸出(unspent transaction output,UTXO)。
·比特幣區塊鏈的數據結構。
·工作量證明共識機制。
·比特幣挖礦機制與代幣生成機制。

圖1-7 一筆比特幣轉賬交易的過程
在沿著比特幣系統所開創的路線開發各類基礎公鏈時,開發者從各個角度調整與改進以上五個技術性細節,形成新的區塊鏈系統。如果你希望先了解區塊鏈全景,可以跳過這一節,稍后再回來看這些重要的技術性細節。
技術性細節之一:分布式賬本和去中心網絡
所有的區塊鏈系統都包括“分布式賬本”和“去中心網絡”這一對必備元素。
比特幣網絡沒有一個中心服務器,它是由眾多全節點和輕節點組成的,這些節點形成一個去中心網絡。其中,全節點包含所有比特幣區塊鏈的區塊數據,輕節點僅包括與自己相關的區塊數據。比特幣網絡是完全開放的,任何服務器都可以接入或者下載全部區塊數據成為全節點。
所有用戶持有比特幣的相關記錄都存放在一個分布式賬本中,它可被認為同時存儲在所有的全節點中。這個賬本是一個不斷增長的由數據塊組成的鏈條,數據塊連接而成的鏈條就是狹義的“區塊鏈”。
基于分布式賬本與去中心網絡,比特幣系統實現了去中心化的價值表示和價值轉移,它與中心化在線支付系統有很大的不同。
用兩個人之間的轉賬來對比看一下。假設你我二人要通過中心化在線支付系統支付寶進行轉賬,轉賬過程是:我們都在支付寶開設有賬戶(account),賬戶上有多少錢是支付寶賬本上記錄的數字,當我轉賬100元給你,支付寶在我的賬戶記錄上減掉100元,在你的賬戶記錄上增加100元,形成新的賬本狀態。到此,轉賬交易結束。
如圖1-8所示,中心化在線支付系統維護一個中心化的賬本。用戶在賬本上開設賬戶,通過賬戶名、密碼與之交互。

圖1-8 中心化在線支付系統vs.比特幣系統
對比而言,比特幣系統使用的是一個分布式賬本,用戶在其中也開設“賬戶”,但嚴格地說是地址(address)。每個人都可以在比特幣區塊鏈上建立類似“賬戶”的東西,我們獲得一對公鑰與私鑰,地址是由公鑰的哈希值轉換而來的,我們通過私鑰與地址進行交互。
我們用區塊鏈錢包管理地址與私鑰,錢包中存儲的是私鑰。兩個人在相互轉賬比特幣時,可以通過各自的錢包軟件直接進行,我們用私鑰簽名確認轉賬。
在這里,比特幣的去中心化體現在:不再有一個中心化機構來集中管理賬本,賬本存放在由眾多節點組成的去中心網絡中;不再有一個中心化機構來幫我們管理賬戶、處理交易,每個人管理自己的地址與私鑰;交易由分布式賬本來記錄,賬本的變更由眾多節點按共識機制來共同確認。
有人會追問,我們地址中的比特幣是記錄在賬本中的,那看起來還是有一個“中心”存儲我們的資產。請注意,這個賬本是分布式地存儲在去中心網絡里的,無人可以獨自控制網絡,因而從這個層面看,這個賬本可以看成是去中心化的。
因此對比而言,中心化在線支付系統通常是由一個中心化的服務器來管理集中式賬本,中心化服務器的控制者掌控著賬本。而比特幣系統,它背后是一個去中心網絡,所有網絡節點按所謂工作量證明共識機制共同維護一個分布式賬本,無人可以獨自掌控賬本(見圖1-9)。

圖1-9 分布式賬本與去中心網絡
技術性細節之二:未花費的交易輸出(UTXO)
接下來的討論比特幣系統的一個關鍵技術性細節:UTXO。
在比特幣系統中其實并不存在所謂的賬戶,而只有“地址”。只要你愿意,你可以在比特幣區塊鏈上設無限多個錢包地址,每個地址都有對應的私鑰。你擁有的比特幣總量是你所有錢包地址中的比特幣之和。比特幣系統并不會幫你把這些地址匯總起來形成你的賬戶。
從我(甲)到你(乙)的一筆比特幣轉賬,是從我的一個錢包地址轉到你的一個錢包地址上去。嚴格地說,這個過程是把我的地址的一個UTXO用一個交易輸出給你,成為你的地址的一個UTXO。
我們來看一個兩個人進行轉賬交易的過程,以深入理解UTXO:
假設我有8枚比特幣。這實際指的是,之前有一個交易把這些比特幣轉入我的地址,而這個交易的輸出(即8枚比特幣)在我的地址中、未被花費出去,因此我有這8枚比特幣。
現在,我要發起一個新的轉賬交易,將這8枚比特幣轉賬給你。新轉賬交易的輸入,是讓我擁有這些比特幣上一個交易的輸出,我把這一新轉賬交易的輸出地址設為你的錢包地址,并用自己的私鑰對新轉賬交易進行簽名。
這樣,我就發起了一個轉賬交易。
等礦工將這一交易打包進新的區塊,轉賬交易完成,這8枚比特幣就屬于你了。類似地,你擁有的比特幣是我向你轉賬的這個交易中的UTXO。
對一個轉賬交易進行簽名確認所涉及的比特幣的公鑰和私鑰的非對稱加密機制,我們之后再討論。你可以先這樣類比看:錢包地址相當于房間號和門鎖,私鑰則相當于鑰匙,一把鑰匙可以打開對應房間的鎖。我發起一個轉賬交易,相當于把自己房間的財物放入另一房間,有第二個房間鑰匙的人就擁有了這個財物的所有權。
總的來說,以上兩個人的轉賬交易過程是:我用私鑰(從一個輸出是我的地址的交易中)取出比特幣,并用私鑰對從我的地址轉到你的地址的新交易進行簽名。一旦交易完成,這些比特幣就轉到你的錢包地址中去了。你的錢包中新交易的UTXO(即現在屬于你的比特幣),只有你的私鑰才可以動用它。
從以上討論我們可以看到,其實在比特幣系統中并不存在比特幣,只有UTXO,每一筆比特幣都源自上一個交易,是上一個交易的未花費的交易輸出。
我們可以沿著這樣的交易鏈條一直向上追溯。在源頭,每一枚比特幣都是通過挖礦被創造出來的,在每一筆比特幣的源頭是一種特殊的交易——比特幣礦工因挖礦生成區塊而獲得獎勵的幣基交易(coinbase transaction)。假設我作為比特幣礦工挖礦成功贏得了25枚比特幣,那么這個特殊交易是:它的輸入是0,輸出是25枚比特幣進到礦工的錢包地址中。25枚比特幣是這個幣基交易的UTXO。
到這里我們可以看出,UTXO和我們熟悉的銀行賬戶有著很大的不同。為什么要采用這樣的設計?對比銀行賬戶和比特幣的UTXO,我們可以看到UTXO的兩個優點。
第一,UTXO設計易于確認比特幣的所有權。
如果采用傳統的賬戶設計,當我要轉賬8枚比特幣時,為了避免造假,我們就需要逐一向上追溯,確認之前的每一筆交易,從而證明我的確擁有8枚比特幣。
采用現在的UTXO設計,要確認我擁有8枚比特幣,只要確認上一個交易我的確獲得了它們即可。在比特幣區塊鏈中,一個區塊經過6次確認后,其中的交易可被認為是真實無誤的。因此,通常只要上一個交易是真實的,我就的確擁有這些比特幣。
第二,UTXO設計與區塊鏈賬本是完全融為一體的。
銀行賬本與區塊鏈賬本都是一種所有權管理系統,它的首要任務有兩個:一是記錄某一時刻誰擁有什么,二是通過轉賬交易把錢從一個人轉給另一個人。銀行賬本的記錄方式是每一刻形成一個快照,把重心放在第一個任務上;UTXO的記錄方式是把重心放在第二個任務上,然后反過來完成第一個任務,由轉賬交易來記錄所有的所有權轉移過程。轉賬交易累積成的區塊鏈賬本可在某一刻來確認誰擁有什么,這一刻的記錄也就是區塊鏈的狀態。
現在,幾乎所有的區塊鏈都采用這一設計,每一個新區塊和它之前的所有區塊一起形成一個新的狀態,如此重復地持續下去。在經過一定區塊數量的確認之后,之前記錄的所有狀態就不可篡改了。
以太坊是對比特幣區塊鏈的改進,在以太坊白皮書中,以太坊創始人維塔利克分析了比特幣系統的設計,他稱比特幣賬本可以被認為是一個狀態轉換系統(state transition system)。以太坊也采用這種狀態轉換系統的設計,同時又對其進行了改進,主要是引入了智能合約,讓對狀態轉換進行編程更方便。
技術性細節之三:比特幣區塊鏈的數據結構
讓我們回到兩個人的轉賬交易過程中,去理解比特幣區塊鏈的數據結構。
我發起一筆交易。我向整個區塊鏈網絡廣播:我向你的地址中轉入了一筆比特幣。
只有當這筆交易被打包進最新的比特幣區塊中時,這筆交易才完成。當在一筆交易所在的區塊之后又增加5個區塊,即包括它自己在內一共經過6次確認時,這筆交易可認為被完全確認。按比特幣每個區塊產生的間隔時間為10分鐘估算,一筆交易最終被確認要經過約1小時。
如上過程包括的步驟是:交易被打包進候選區塊,每個節點可以按規則生成不同的候選區塊;某個節點挖礦成功,候選區塊被成功地加到區塊鏈的尾部,成為新的正式區塊。
那么,把一筆交易打包進區塊是什么意思?要理解這一點,我們要了解區塊鏈最基礎的數據結構,這也是區塊鏈上所記錄數據不可篡改的基礎。
以下討論可能略顯枯燥,但又是認識比特幣與區塊鏈的最基礎的知識,我盡量以通俗的語言來為你解讀。
區塊鏈之所以被稱為blockchain,是因為它的區塊(block)以鏈(chain)的形式存儲。從第一個區塊(即所謂的創世區塊)開始,新增的區塊不斷被連到上一個區塊的后面,形成一個鏈條。
每個區塊由兩部分組成:區塊頭部和區塊數據。其中,區塊頭部中有一個哈希指針指向上一個區塊,這個哈希指針包含前一個數據塊的哈希值。哈希值可以被看成數據塊的指紋,即在后一個區塊的頭部中均存儲有上一個區塊數據的指紋。那么,如果上一個區塊中的數據被篡改了,那么數據和指紋就對不上號,篡改行為就被發現了。要修改一個區塊中的數據,其后的每個區塊都必須相應地進行修改。因此,時間越久,一個區塊就越難被篡改。
一個區塊中的數據是被打包進這個區塊的一系列交易,這些交易按照既定的規則被打包形成特定的二叉樹數據結構——梅克爾樹(Merkle trees)。按目前比特幣區塊的大小,一個區塊中能容納的交易數量在2000個左右,比如在第526 957個區塊中容納了1804個交易。
比特幣區塊鏈的數據結構中包括兩種哈希指針,它們均是不可篡改特性的數據結構的基礎:一個是形成“區塊+鏈”的鏈狀數據結構,另一個是哈希指針形成的梅克爾樹(見圖1-10)。鏈狀數據結構使得對某一區塊內數據的修改很容易被發現;梅克爾樹的結構起類似作用,使得對二叉樹型結構的任何交易數據的修改很容易被發現。

圖1-10 比特幣區塊鏈的鏈狀數據結構與梅克爾樹
技術性細節之四:工作量證明共識機制
比特幣的去中心網絡采用的是工作量證明共識機制。去中心網絡之所以需要共識機制,是因為這是一個非基于信任的網絡,任何人無須許可都可以接入這個網絡。這些節點分散在網絡條件差異非常大的全球互聯網之中。在完全無中心的情況下,這些節點也要保持各自存儲的賬本數據能在共同認可的情況下添加新數據并同步一致,共識機制即為這些節點達成一致的機制。
關于分布式網絡的共識機制,有著名的“Fisher-Lynch-Paterson不可能結果”,即在一定條件下達成共識在技術上是不可能的。但是,比特幣的工作量證明共識機制又在實踐中被驗證是有效的,這是因為它采用了一個實用主義的解決方案:技術與經濟的組合。
比特幣的工作量證明的特點是,它巧妙地融合了技術和經濟因素,不是純粹地試圖通過技術本身來達到這一點,而是納入了經濟激勵。這是比特幣作為一個電子現金系統的優勢,它為節點提供所謂的挖礦獎勵。按《比特幣:技術驅動金融》一書的分析,比特幣的共識機制有兩個與過去不同的特點,我們在此略做引申討論:
第一,它引入了獎勵機制。在這樣一個加密數字貨幣應用中引入了經濟激勵,維護網絡的節點就可以得到有價值的比特幣作為獎勵。
為什么比特幣網絡中的節點愿意打包交易、維護賬本?它們并非出于“善意”,而是因為,它們能因這些挖礦行為獲得比特幣形式的經濟激勵。這是一個自行發行代幣的電子現金系統的獨特優勢,如果所開發的是其他沒有自行發行代幣的IT系統,我們就無法方便地引入礦工挖礦獎勵這樣的經濟激勵機制。
激勵挖礦節點參與挖礦的,除了與新區塊相關的獎勵之外,挖礦節點還可以得到區塊中包含的所有交易付出的交易費。到目前為止,這個數值還較小,大概為新區塊獎勵的1%。
第二,它包含了隨機性的概念。比特幣系統形成的共識不是完全可靠的,但是在等待了6個區塊約1個小時之后,出問題的概率呈指數下降。在確認6個區塊之后,一個交易發生雙花情況的概率可被認為是零。從純理論上看,完美的共識不可能達成。但從實用的角度看,這個共識是高度可信的。
技術性細節之五:比特幣挖礦機制——代幣生成機制
節點計算機在挖礦時要做兩個任務。第一個任務是把比特幣網絡中未被確認的交易按梅克爾樹組合成候選區塊,未被納入的交易往下順延。在創建候選區塊時,除了普通的交易之外,礦工還增加了一個特殊的交易——幣基交易。如果它的候選區塊成為正式區塊即挖礦成功,幣基交易會憑空轉出新區塊獎勵比特幣到礦工的錢包地址中,從而實質上將這些比特幣憑空發行出來。這個特殊交易也被叫作“創幣交易”,新的比特幣就是在這一交易中被創造出來的。
第二個任務是真正的算力競爭,即進行加密哈希計算,解決一個計算難題。在眾多爭奪記賬權的節點中,誰最先完成這個計算,誰打包的區塊就被加到區塊鏈的最后面,成為最新的正式區塊并獲得獎勵。最初,成功挖出一個區塊,礦工可以獲得50個比特幣的獎勵,按規則,這個挖礦獎勵約每四年減半一次,獎勵依次變成每個區塊25個、12.5個,以此類推。
我們接著往深處走以進一步了解比特幣的工作量證明共識機制與它的挖礦機制。
先向內看,比特幣礦工挖礦是在做什么?
在候選區塊的頭部有一個32位的隨機數區域,礦工需要反復調整隨機數并計算,目標是讓這個區塊的哈希值小于一個所謂的“目標值”。如果試過所有32位隨機數的可能性后,計算仍未成功,那么就要反復改變幣基的一個隨機數,進行計算,以讓這個區塊的哈希值小于目標值。
這里所需要進行的加密哈希函數計算(對比特幣來說是SHA-256),除了反復計算別無他法,也就是各個節點完全憑借計算能力進行競爭。這種所謂的挖礦競爭的計算量非常大,比如在2015年年底,在大約2的68次方(這個數字比全球總人口的平方還要大)個隨機數中,只有一個可以成功。
有意思的是,這種挖礦計算是非對稱性的,你挖礦需要經過2的68次方個哈希計算,而我要驗證你的確找到了有效的隨機數,只需要一次就可以。這種非對稱性是區塊鏈在技術上的重要特性:礦工需要消耗大量算力,檢驗者與使用者卻不需要。
第一個完成這個計算難題的節點所打包的區塊會成為正式區塊。節點向全網廣播告知自己已經完成計算,由其他節點確認后(即有別的挖礦節點在這個區塊之后進行下一個區塊的計算競爭,生成更新的區塊)。在等待6個區塊確認后,該挖礦節點就可以正式獲得獎勵。
我們再向外看,在加入挖礦的計算機的算力不斷增加的情況下,這個挖礦機制是如何保持穩定的?
比特幣挖礦的芯片已經經過幾輪演變,計算能力越來越強:從CPU演變到GPU(顯卡),再到現場可編程門陣列(FPGA),再到現在的專用集成電路技術(ASIC)。現在礦機中的計算芯片是只能進行比特幣挖礦所需的哈希計算的專用芯片。
隨著礦機的升級迭代和數量增多,接入比特幣區塊鏈網絡、參與挖礦競爭的算力越來越大。如圖1-11所示,在過去10年間比特幣算力持續上升,2018年后增長尤為顯著。

圖1-11 比特幣全網算力
資料來源:https://bitinfocharts.com/comparison/bitcoin-hashrate.html,2021年3月。
為了應對這種可預見的算力增長,比特幣系統有一個對應的機制設計:隨著算力的增加,定期調整目標值的難度,使得挖出一個區塊的時間始終在10分鐘左右。
這就形成了一種動態的平衡,維持區塊鏈網絡經濟激勵的有效性的同時,也維持了區塊的時間間隔和系統的穩定性。這個決定難度的公式非常簡單明了,每挖出2016個區塊,也就是經過約兩個星期,挖礦難度會進行一次調整,該公式是:
下一個難度=上一個難度×2016×10分鐘/產生2016個區塊所需的時間
如果算力突然大幅度增加,產生上一組2016個區塊所需的時間變短,那么難度就會上升。在某些特殊情況下,如果產生上一組2016個區塊所需的時間變長,那么難度也會下降,但并不多見。
總的來說,比特幣節點計算機所做的是,它以算力參與分布式賬本的確認,并以這種方式參與這一去中心網絡的運維。比特幣區塊鏈是由眾多節點組成的去中心網絡,而這些計算機節點加入這個網絡,計算分布式賬本、運維網絡,是因為中本聰在設計系統時巧妙地加入了經濟激勵。算力競爭加經濟激勵就是比特幣區塊鏈的工作量證明共識機制。
比特幣的經濟系統是以“競爭—記賬—獎勵”循環為核心的(見圖1-12),其中競爭指的正是節點進行的算力競爭。在比特幣系統這樣一個去中心網絡中,節點參與記賬是出于獲得經濟激勵的自利動機,獎勵是通過競爭來獲得的。

圖1-12 比特幣的“競爭—記賬—獎勵”循環
通過以上對比特幣區塊鏈的五個技術性細節的討論,我們再一次看到,比特幣系統在發行和交易層面都實現了完全的去中心化:
·一個轉賬交易的確認,即被寫入分布式賬本記錄下來,是由去中心網絡中互不信任的節點出于自己的利益、以算力進行競爭而確認下來的。賬本的確認、轉賬交易的確認是去中心化的,是由眾多節點按共識機制算法完成的。
·在競爭挖礦的過程中,比特幣系統憑空發行出比特幣。比特幣的發行是去中心化的,同樣是由眾多節點按既定算法完成的。
總的來說,比特幣是“區塊鏈1.0”的典范,它開創性地完成了“價值表示”和“價值轉移”的概念驗證(見圖1-13)。比特幣系統是非常精妙的設計,它無須任何人的居中協調或領導就能讓所有參與者協同一致、長期發展。

圖1-13 比特幣作為區塊鏈1.0的典型代表,完成了“價值表示”和“價值轉移”的概念驗證
不過,比特幣區塊鏈是專為去中心化的電子現金設計的,而要在各個領域中廣泛應用,我們需要有更通用、性能更好的區塊鏈系統。在比特幣系統之后,出現了常被認為是“區塊鏈2.0”代表的以太坊。現在,更多項目在競爭成為“區塊鏈3.0”。我們在之后兩章會分別討論它們。
在討論之前,我們認為還應該接著圍繞比特幣系統做更多的探討:區塊鏈給互聯網和數字世界帶來了哪些巨變?從數字資產角度看,比特幣為什么有價值?
「冷知識」比特幣的UTXO
每一個比特幣其實都是UTXO,它是比特幣的最為核心的概念之一。
比特幣就是UXTO
比特幣的挖礦節點獲得新區塊的挖礦獎勵,比如12.5枚比特幣,這時它的錢包地址得到的就是一個UTXO,即這個新區塊的幣基交易(也稱“創幣交易”)的輸出。幣基交易是一種特殊的交易,它沒有輸入,只有輸出。
當甲把一筆比特幣轉給乙時,這個過程就是把甲的錢包地址中之前的一個UTXO,用私鑰進行簽名,然后發送到乙的錢包地址。這是一個新的交易,乙得到的是這個新交易的UTXO。
詳看從甲轉賬給乙的過程
假設甲(Alice)向乙(Bob)轉賬,轉賬過程可以分成三個階段(見圖1-14)。

圖1-14 Alice向Bob發起比特幣轉賬
(1)假設Alice之前通過挖礦獲得了12.5枚比特幣,在她的錢包地址中,這些比特幣是某個幣基交易的UTXO。
(2)Alice發起一個交易,輸入是自己的上一個交易,輸出是Bob的錢包地址,數量是12.5枚比特幣,Alice用自己的私鑰對交易進行簽名。
(3)當交易被確認后,Alice的UTXO就變成了0,而Bob的錢包地址中就多了一個UTXO,數量是12.5。
存在Bob的錢包地址中的這些比特幣,只有用Bob的私鑰簽名才可以動用。Bob要將這些比特幣轉賬給其他人,則重復上述過程。
另外,初次接觸比特幣的人會問:我的比特幣是什么樣的?它們存在哪里?
如果你頭腦中參照的是在物理世界中的金幣,那么這里很不一樣:你的比特幣并不是存在家中或金庫中,并不存在一個數字文件表示“你的比特幣”。
如果你頭腦中參照的是銀行存款,那么你可以認為,你的比特幣“存在”于一個賬本上。在數字世界中,價值是賬本中的“記錄”。不同的是,比特幣賬本是由眾多網絡節點維護的分布式賬本,而不是像銀行賬本那樣是一家中心化機構維護的賬本。任何人都可以接入比特幣網絡,把這個賬本下載下來,但只有用你的私鑰才能動用你錢包地址中的比特幣。
為什么采用UTXO的形式
UTXO與我們熟悉的“賬戶”概念差別很大。我們日常接觸最多的是賬戶,比如我在銀行開設一個賬戶,賬戶里的余額就是我的錢。在比特幣網絡中沒有賬戶的概念,你可以有多個錢包地址,每個錢包地址中都有著多個UTXO,你的錢是所有這些地址中的UTXO加起來的總和。
中本聰發明比特幣的目標是創建一種點對點電子現金,UTXO的設計可以看成借鑒了現金的思路:我們可以在這個口袋、那個口袋裝些現金,在這個抽屜、那個保險柜放些現金。就現金而言,它沒有一個賬戶,你放在各處的現金加起來是你所有的錢。
采用UTXO設計有一個技術上特別的理由——這種數據結構可以讓雙重花費更容易驗證。對比一下:
·如果采用賬戶和賬戶余額設計,Alice要轉賬給Bob,為了確保Alice的確有錢,我們需要核查她之前所有的比特幣交易。隨著時間的推移,比特幣的交易越來越多,這個驗證的難度會持續上升。
·采用UTXO設計,我們只要沿著每個交易的輸入逐級向上核查,直到查到這筆比特幣的創幣交易即可。隨著時間的推移,這個核查也會變難,但變難的速度要遠低于采用賬戶和賬戶余額的設計。
采用UTXO設計使得比特幣系統作為一種電子現金系統有著非常大的可擴展性。當然,我們很快會看到,通常被認為是區塊鏈2.0的以太坊沒有繼續采用UTXO設計,而是考慮到其他因素,在UTXO之上覆蓋了一層賬戶余額設計,代價正是中本聰可能已經考慮到的復雜性。
[1] 更多的討論詳見本節后“冷知識”專欄的《比特幣的UTXO》。
[2] 微觀地看,區塊鏈中的每一個交易都是一個狀態轉換函數。以太坊白皮書就用“以太坊狀態轉換函數”(ethereum statetransition function)來討論在區塊鏈中一個交易的進行過程。
[3] 參考資料:《區塊鏈:技術驅動金融》中相應的討論,以及文章《比特幣和以太坊的記賬方式——UTXO和賬戶余額》(黃世亮/文)。
[4] 這里簡化了交易過程,只討論了將上一個交易的輸出全部轉賬的情況。如果試圖轉出上一個交易輸出的一部分比特幣,則要進行略復雜的處理。按照比特幣系統的設計,比特幣交易要遵循一個原則:每一次交易的輸入值都必須全部花掉,不能只花掉部分。假設我的錢包地址中有25枚比特幣,那我發起的交易就不是轉給你8枚比特幣,然后自己的錢包地址中還剩17枚比特幣。這時,我發起的交易是:從我的錢包地址中轉8個比特幣給你,同時轉17枚比特幣給我的同一地址。