1. 程式人生 > >淺析比特幣的找零機制

淺析比特幣的找零機制

前不久推出的比特幣 0.9 版裡面加入了一個小白們期待已久的新功能:可以自行選擇支付後的找零地址。對於這個功能的加入,本聰大叔不知道會不會哭笑不得地說道:“It’s not a bug; it’s a feature!”

要想理解比特幣的找零機制,還得先從比特幣的交易原理說起。

地獄天使的借記卡
試著把比特幣地址想象成一張你平時到便利店購物時用的借記卡。你提著選好的東西來到收銀臺,看著秀色可餐的收銀臺美眉計算出所要付的總額,然後像以往那樣將卡一刷,正要輸入密碼確認時,你突然發現你卡上的錢將會被清空!

“我去,你們這居然是一家黑店?!”

“先生您多慮了,這是我們公司針對您這樣的高階使用者所提供的一項特殊服務。您可以選擇以下幾種收款方式:(1)將零錢發回你現在的帳戶上;(2)新建立一個帳戶並將零錢傳送過去;(3)什麼都不說直接將零錢傳送至支付終端的公司……”

是不是越聽越糊塗了?不過,這就是比特幣交易的基本工作方式。試圖用網銀或者借記卡的經驗來理解比特幣容易造成一些誤解。幸運的是,古老的現金交易方式可以讓我們更好的來解釋比特幣的原理。

比特幣是電子版的現金
比特幣與現金的關係源遠流長。實際上,本聰大叔在創世論文中開門見山地將比特幣描述為一種完全通過點對點技術實現的電子現金系統。理解比特幣與現金的關係,對於理解找零地址至關重要。

每一張紙幣有著固定的面額,相同面額的可能也會有多張。在這人心不古的年代,紙幣東放一張西扔一張明顯不是個好習慣,這時候你應該找個錢包把紙幣裝起來。而在比特幣的世界裡,將各個比特幣儲存起來的東東就是比特幣地址,其關係如下(本聰大叔比較低調,所以錢包也是實用主義為主,一個信封就搞定了XD):
這裡寫圖片描述


每一個地址可以裝至少零枚比特幣,多則無上限。(哦不對,多則為 2100 萬的比特幣總上限,不過全放一塊的話估計這玩意也沒其它人用了……)與紙幣面額稍有不同的是,比特幣中這被稱為“未花費輸出”,比特幣地址會計算所有的未花費輸出,並在相應的地方顯示出當前地址的總額。

而比特幣網路的目的,就是確保未花費輸出通過交易轉移到其它的地址上去。

比特幣交易如何工作的
假設 A 擁有一個比特幣地址,裡面包含著還沒有花費過的 10 個比特幣。B 也有一個比特幣地址,裡面一分錢也沒有。當 A 想付給 B 10 個比特幣時,A 地址裡的未花費輸出變為零,而 B 的會變為 10 BTC。
這裡寫圖片描述
(這在現實世界裡面是非常正常的事情,不過在大家習慣了 Ctrl+C 和 Ctrl+V 的數碼世界裡,要實現一份不可複製的資訊轉移系統其實是件不容易的事情。更多關於比特幣防止重複消費的原理,請參考這裡。)
(如果你還不理解複製貼上有多容易,也許你看到這條文字就能明白了……總之,插個廣告,歡迎打賞 1MzziGBa7tNNzMwVJMPEjAfM1wRcvSGZu5 ^_^)
如果 A 想支付的金額與所擁有的相同,自然不會存在需要找零錢的問題。不過當手頭的金額比要支付的大時,找零自然也是天經地義的事情。假設 A 的地址上有 35 個比特幣,當 A 想支付給 8 個比特幣給 B 時,只需要使用包含著 10 個比特幣的那一筆未消費支出,設定好要支援的金額,打零剩下的 2 個比特幣則返回給 A,以便 A 在將來可以繼續使用。當然,如果你是位元土豪可以隨意將手頭上的幣一把甩出去然後說句“Keep the change”就直接閃人:P
這裡寫圖片描述


實際上,比特幣在交易時會把消費時所用的地址(消費地址)的餘額置零。當需付的金額小於可用餘額時,交易資訊中必須告訴比特幣網路零錢將被髮送至的地址,即“找零地址”。找零地址可能是也可能不是原先消費時所用的地址。除此之外消費地址所留下的剩餘款項將由網路作為交易費的支出支付給礦工。
這裡寫圖片描述
在上面的例子裡,A 可以選擇將找回的零錢傳送到一個新建立的找零地址上,或者將原先發送的地址設定為找零地址。將零錢返回原先的地址雖然對 A 而言方便了管理,不過這可能會造成 A 的隱私性降低,一定程度上還可能會影響到 B 的匿名性。

找零地址和隱私保護
根據設計,每一筆比特幣交易將在一個稱為“Blockchain”的全球性的公共總賬上永久可見,這就意味著任何人都可以隨時在上面進行跟蹤查詢。通過將某個比特幣地址與其使用者關聯起來,好事者都可以開始繪製關於這個人與他人之間的資金轉移的關係圖。而通過將找回的零錢傳送至一個新建立的地址,可以讓這種追蹤變得更加困難。

要理解這一點,可以參考下圖。假設從地址 A 傳送比特幣到地址 B,如果零錢返回地址 A,則 Blockchain 會揭示控制著地址 A 的付費者向控制著地址 B 的人支付了一筆錢。同樣的道理,如果有兩個或兩個以上地址參與其中,任何涉及到這個接收零錢的找零地址都會揭示 A 作為支付方的交易。假如某個控制著的任何接收地址或付款地址的人的身份成為眾所周知的物件時,其他有過交易往來的各方的身份也有可能被推斷出來。
這裡寫圖片描述
現在想象一下,地址 A 發起付款到地址 B,但此時將找零地址更改為新生成的地址 C。如果沒有進一步的資訊,其它人所能知道的是,有一個交易拆分了地址 A 的餘額至地址 B 和 C。而地址 B 或 C 的主人可能是也可能不是 A。由於新地址 C 的加入,讓整個交易的真相變得更加撲朔離迷:哪一個地址代表著被支付方,哪一個地址代表著找回的零錢呢?
這裡寫圖片描述
當所有各方都將零錢傳送至新建立的地址時,要想將個人身份與地址相聯就必須收集更多的資訊,並耗費更多的資源。像 SilkRoad 或者 MtGox 這樣攤上大事的時候他們的地址會被成千上萬雙群眾的眼睛緊緊地盯著,畢竟不少人身家財產都放在上面。
小隱隱於野,中隱隱於市,大隱隱於朝。明白了這一點,放能體會到本聰大叔當初敲程式碼時的良苦用心。當然,新版中將找零地址的設定權交給使用者自然是一件好事,只是,我們不應該忘記其設計初衷。