解密比特幣
近期 BitCoin 被炒作得沸沸揚(yáng)揚(yáng),看好的唱衰的,莫衷一是。我們不妨讀解一下 BitCoin 的技術(shù)原理。了解原理以后,BitCoin 能夠解決什么問題,尚存什么缺陷,自然就一清二楚。剩下的問題,就是討論隨著 BitCoin 的發(fā)展,將會有什么機(jī)會。
我們不妨把 BitCoin 體系拆分為四個問題來談,1. 交易(transaction), 2. 支付(payment), 3. 審計(jì)(audit), 4. 鑄幣(mintage)。
【1】 交易(transaction)?
交易的基本訴求,是付款人(payer)匯款給收款人(payee)。技術(shù)挑戰(zhàn)是加密(cryptography),目的是不讓第三者截獲甚至篡改匯款金額。
BitCoin 的交易加密方式沿用了現(xiàn)成的,基于公鑰(public-key)私鑰(private-key)的非對稱加密體系(asymmetric cryptography)。這里沒有什么創(chuàng)新。
[1] 第二節(jié)的圖例中,最左側(cè)的框,解釋了 Owner0 給 Owner1 匯款的交易機(jī)制,截圖如下。
1. Owner0 先查到 Owner1 的公鑰。用 Owner1 的公鑰(Public Key)把匯款詳情加密。這樣,只有 Owner1 本人用自己的私鑰(Private Key),才能打開加了密的匯款詳情。在圖例中,沒有畫匯款詳情。不過這個小小的敘述的疏忽無妨大雅。
2. 為了方便 Owner1 驗(yàn)證這筆匯款的確來自 Owner0,而不是別人,Owner0 發(fā)出的匯款單里,除了有加了密的匯款詳情,還有 Owner0 的數(shù)字簽名(Signature)。Owner1 拿到匯款時,為了驗(yàn)證這筆匯款的確來自 Owner0,他可以用 Owner0 的公鑰,來驗(yàn)證匯款單中 Owner0 的數(shù)字簽名。
3. Owner0 發(fā)出匯款單時,匯款單不僅僅投遞到 Owner1,而且還要廣而告之,任何人只要愿意參與 BitCoin 審計(jì),都可以收到全球所有人發(fā)出的所有匯款單。
4. 沿用 1、2、3 的原理,Owner1 給 Owner2 匯款,然后 Owner2 給 Owner3 匯款。BitCoin 通過 Hash 機(jī)制,把涉及同一枚 BitCoin 的所有匯款交易(Tranaction)串連起來,目的是為了追查重復(fù)付款(double spending)的欺詐行為。
【2】 支付(payment)
當(dāng)付款人(payer)向收款人(payee)發(fā)出匯款交易(transaction)后,支付過程(payment)并沒有完成。直到收款人簽收了匯款以后,支付過程才正式結(jié)束。
在收款人接受匯款以前,他必須確認(rèn)匯款人沒有重復(fù)付款(double spending)。這就類似于我們接受紙幣前,最好驗(yàn)證一下紙幣是不是假鈔一樣。
BitCoin 驗(yàn)證重復(fù)付款的辦法,是靠群眾檢舉。當(dāng)收款人收到匯款時,他把匯款單廣而告之。審計(jì)站點(diǎn)收到廣而告之的匯款單時,會檢查匯款單中涉及的 BitCoin,是否出現(xiàn)在其它匯款單中,是否被重復(fù)付款。如果出現(xiàn)這種重復(fù)付款,審計(jì)站點(diǎn)會檢舉,并通知收款人拒絕簽收匯款。
BitCoin 保證重復(fù)付款的行為,能夠被檢舉,但是不能保證能夠被當(dāng)場抓獲。[2] 假設(shè)了一個場景,
1. 騙子開設(shè)了兩個賬號,A 和 B。他先把一枚 BitCoin 由賬號 A 匯款到賬號 B,賬號 B 立刻簽收。賬戶 B 簽收匯款前,沒有把匯款單廣而告之。
2. 然后騙子去 C 的網(wǎng)店買東西,他把同一枚 BitCoin 由賬號 A 匯款到賬號 C。C 收到匯款單后,等待幾秒鐘,如果各個審計(jì)網(wǎng)站沒有檢舉,C 就簽收 A 的匯款,同時交付商品。
3. 但是就在 C 等待的時候,騙子把從 A 到 B 的匯款單廣而告之,并且這是一個已經(jīng)被 B 簽收了的匯款單。因?yàn)閺?A 到 B 的匯款單是合法的,這個匯款單被各個審計(jì)站點(diǎn)接受。
4. 等到 C 簽收了 A 發(fā)來的匯款單,并廣而告之時,各個審計(jì)網(wǎng)站會檢舉,說 A 到 C 的匯款單是重復(fù)付款,無效。雖然騙子被檢舉,但是 C 已經(jīng)交付了商品,C 上當(dāng)了。
為了防范重復(fù)付款,現(xiàn)行 BitCoin 的支付方式,有很多可以改進(jìn)的地方。例如,可以強(qiáng)制付款人給收款人發(fā)匯款單時,必須把匯款單廣而告之,這時匯款單尚未被簽收。然后,當(dāng)收款人簽收匯款時,也必須再次廣而告之,不過與第一次不同在于,第二次廣而告之的,是已經(jīng)被簽收的匯款單。
但是似乎到目前為止,還沒有發(fā)現(xiàn)一種數(shù)學(xué)上完全嚴(yán)謹(jǐn)?shù)霓k法,能夠徹底杜絕重復(fù)支付的發(fā)生。
【3】 審計(jì)(audit)
為了杜絕重復(fù)付款的欺詐行為,一個簡單的辦法是全球人民每次匯款時,先把匯款單提交給一個權(quán)威機(jī)構(gòu),例如支付寶。支付寶收下付款人匯來的 BitCoin,然后發(fā)另一枚 BitCoin 給實(shí)際收款人。這樣做,可以保證收款人收到的 BitCoin 不會有詐,但是不能保證支付寶,從匯款人那里收到的 BitCoin,沒有被重復(fù)支付。
舉個例子,假如權(quán)威機(jī)構(gòu)除了支付寶以外,還有 Paypal 等等,付款人用同一枚 BitCoin,向兩個收款人匯款,匯款時分別經(jīng)過支付寶和 Paypal。假如重復(fù)支付成功,兩個收款人沒有損失,但是支付寶和 Paypal 中,一定有一家機(jī)構(gòu)被欺詐。
這種防范欺詐的機(jī)制,除了技術(shù)上有漏洞以外,依賴權(quán)威機(jī)構(gòu)的做法,與 BitCoin 的群眾路線的設(shè)計(jì)理念相違背。
BitCoin 的做法,是把任何一枚 BitCoin,從誕生到當(dāng)下,每一次交易都記錄在案,而且按時間順序串聯(lián)起來。這就像古董,通常要附帶歷史記錄,從制作出售之初,每一次轉(zhuǎn)手,都被記錄下來,這樣有利于防范被冒牌頂替。
BitCoin 的每次記錄都被廣而告之,并且記錄下來,并且連綴成串。這樣,每一次 BitCoin 的交易,不僅有付款人和收款人參與,而且有第三方審計(jì)人參與。審計(jì)人可以是專職機(jī)構(gòu),也可以是任何一臺電腦。審計(jì)不僅能夠及時發(fā)現(xiàn)違法操作,例如重復(fù)付款,而且即便當(dāng)時漏網(wǎng),事后也能回溯。
[1] 第八節(jié)的圖例中,解釋了 BitCoin 交易記錄的串聯(lián)的數(shù)據(jù)結(jié)構(gòu),截圖如下。
有兩點(diǎn)值得注意,
1. 為了提高審計(jì)效率,BitCoin 把多個交易(Transaction)合并成一個塊(Block),同時用 Merkle Tree(又稱 Hash Tree)[3],把這些交易詳情組織起來。
2. 如果每次交易,只包含一枚 BitCoin,那么每枚 BitCoin 的歷史記錄,是一根單線。但是事實(shí)上,每次交易,可以涉及多枚 BitCoins,所以,交易的歷史記錄,不僅有單線,還有多根單線合并成一根線的情況。
【4】 鑄幣(mintage)
在 BitCoin 體系中,任何參與審計(jì)的人,都自動參與貨幣的生產(chǎn)。貨幣的生產(chǎn),即鑄幣(mintage)的過程,在 BitCoin 體系中被稱為挖金礦(gold mining)。
從技術(shù)上講,審計(jì)和鑄幣完全是可以拆分的兩件事情。把鑄幣權(quán)與參與審計(jì)綁定在一起,是游戲規(guī)則的設(shè)定,目的是發(fā)動群眾,共同維護(hù) BitCoin 的誠信體系。
另外,BitCoin 的總蘊(yùn)藏量,被預(yù)先設(shè)定了上限。這樣做的目的,是通過限制貨幣流通量,遏制通貨膨脹。
從技術(shù)上來看,完全可以把 BitCoin 體系當(dāng)成一個工具箱,用這些工具,配置不同的規(guī)則,從而創(chuàng)造另一種貨幣體系。
例如,
1. 可以設(shè)定只有政府才有資格挖金礦,從而把鑄幣權(quán)收歸政府。
2. 不必設(shè)定貨幣流通上限,而是可以根據(jù)新增財(cái)富,來增加貨幣發(fā)行。
3. 可以通過認(rèn)證,給每個付款人設(shè)定信用值,用于加快支付簽收速度。
4. 也可以通過保險,讓每一筆匯款交易的收款人,立刻簽收匯款。如果出現(xiàn)重復(fù)付款,保險公司賠付。
5. 雖然理論上每個人(實(shí)際上是每臺電腦),都有資格成為審計(jì)員,實(shí)際上,必定會出現(xiàn)大型機(jī)構(gòu),憑借強(qiáng)大的計(jì)算和存儲能力,成為專業(yè)審計(jì)機(jī)構(gòu)。
Reference,
[1] Bitcoin: A Peer-to-Peer Electronic Cash System
[2] Best Practice for Fast Transaction Acceptance – How high is the risk?
[3] Introduction to Merkle Tree
轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_46d0a3930101p15m.html
核心算法是hash嗎?