比特幣的找零機制一直讓人有些迷惑,明明只向一個地址發送了比特幣爲什麼 blockchain 上面的顯示的有時是1個地址對多個地址,有時是多個地址對1個地址,有時又顯示多個地址對多個地址?

爲什麼比特幣資深用戶要提醒大家當比特幣錢包交易100次以上時再次交易後要重新備份錢包,恢復以前的錢包備份有可能會遭遇損失?

是的,這一切都是因爲比特幣的找零(Change)機制。本文參考 巴比特(www.8btc.com) ,詳細爲大家解釋一下比特幣的找零機制是怎樣運作的。

比特幣交易的規則:將用戶有權使用的若干比特幣匯款地址上的之前交易的輸出金額作爲一次交易的輸入,若干比特幣收款地址上增加的交易金額作爲本次交易的輸出。輸入金額必須大於等於輸出金額,超出部分作爲本次交易的手續費。手續費沒有輸出地址,獎勵給將本次交易記賬成功的礦工。

因爲有時作爲輸出的金額超過了用戶想要支付的金額。在這種情況下,比特幣客戶端會創建一個新的比特幣地址,並把差額髮送回這個地址,這就是比特幣的找零機制。

比如你想從商店買一塊錢的棒棒糖,你打開你的錢包,發現裏面只有一張20元面值的人民幣。你能支付的最小金額是多少呢?當然不是1塊錢,你不能把這張20元錢的紙幣撕下20分之1再交給營業員。你必須把這張20元面值的人民幣全部交給收銀員,然後因爲你只需要支付1元錢,收銀員會找給你19元。

除了中央銀行,法律禁止任何人自己發行人民幣,所以人民幣都是固定面額的。這次交易的流程看上去就像下面這樣:

輸入:

20元 人民幣

輸出:

1元 給 收銀員

10元 給 你

5元 給 你

1元 給 你

1元 給 你

1元 給 你

1元 給 你

因爲我們每天都這麼進行一手交錢一手交貨的交易,所以上面這個流程好像已經成爲一種天經地義的事情。讓我們打破這種思維慣性,看看會發生什麼事。

現在讓我們想象一下這樣的場景:存在這樣的一個系統,它允許收銀員(或者其他什麼人都可以)切實地銷燬任意數量的真實貨幣(人民幣),並且允許收銀員打印出任意金額的真實貨幣作爲替代。不一定是10元面額或者20元面額,如果需要的話,比如打印出 18.94537208 元面值的人民幣。

同時爲了防止雙重支付和僞造,必須確保在任何時候,新創建的貨幣金額與被銷燬的貨幣金額是完全一樣的。在這種情況下,你的交易可能看起來像下面這樣:

輸入:

你的 20元 人民幣 被銷燬

輸出:

新發行的 1元 給 收銀員

新發行的 19元 給 你

這就是比特幣的運作機制。與法定貨幣不同,我們習慣把這種方式稱之爲交易單元的輸入和輸出。

當你“支付”比特幣,並創建一次交易時,你必須將你支付地址上可供支付的金額(來自該地址之前交易的輸出)作爲新交易的輸入。這樣的地址可能不止一個,你的比特幣錢包會暗自尋找你錢包中所有可供支付的輸出金額(可能來自於不同地址),並把它們加在一起顯示爲錢包可用餘額。

所以,當你的比特幣錢包說你有130個BTC時,它只是意味着你的所有地址上可供支付的交易輸出加在一起共有130個BTC。這和你的普通錢包中放着1張100元和3張10元人民幣差不多一個意思。

讓我們查看上圖表示這次交易:0a1c0b1ec0ac55a45b1555202daf2e08419648096f5bcc4267898d420dffef87,比特幣客戶端將 19f 地址上存在的之前某次交易的輸出:10.89 BTC全部支付出去,實際交易金額爲 10 BTC支付給 1KM這個地址, 0.89 BTC作爲找零返還給 1HP 這個地址。

就像一個人不能只花20元人民幣中的1元錢一樣,比特幣客戶端也不能只支付 10.89 BTC中的 10 BTC給對方。

10.89 BTC的前次交易輸出金額將全部作爲新交易的輸入金額,並在這個過程中產生了兩個新的可供支付的輸出金額,10 BTC給1KM,0.89 BTC給1HP,兩個輸出金額加在一起正好等於 10.89 BTC。

19f 地址上面存在過的這個10.89 BTC可供支付的輸出金額在這次交易完成後將被徹底摧毀,整個比特幣網絡將防止它被再次支付。

而那兩個新建立的可供支付的輸出金額現在可以成爲下次交易的輸入了。

這次交易中,交易手續費爲0。如果交易中支付手續費的話,輸入和輸出將會產生差額。(比如,輸入 10.89 BTC,輸出 10.88 BTC,交易手續費 = 0.01 BTC)

比特幣錢包文件中包含了所有找零地址的私鑰,它們可以正常的接收或者發送比特幣。但是,比特幣官方客戶端的界面上並不會把這些找零地址顯示在地址簿中,也許是爲了匿名性的必要,也許是爲了減少客戶的困惑,雖然這也造成很多人新的疑惑。

因爲比特幣客戶端一開始只產生100個客戶專屬地址的私鑰(稱爲私鑰池),在創建找零地址時會優先使用這100個地址中的某一個,但當這些地址都被使用之後,100個以外新的找零地址就會被創建。如果你只備份了一開始的100個地址的錢包,那麼在上面這種情況下恢復錢包將丟失新的找零地址。

相關文章