解密比特幣

1 評(píng)論 10155 瀏覽 7 收藏 12 分鐘

近期 BitCoin 被炒作得沸沸揚(yáng)揚(yáng),看好的唱衰的,莫衷一是。我們不妨讀解一下 BitCoin 的技術(shù)原理。了解原理以后,BitCoin 能夠解決什么問題,尚存什么缺陷,自然就一清二楚。剩下的問題,就是討論隨著 BitCoin 的發(fā)展,將會(huì)有什么機(jī)會(huì)。

我們不妨把 BitCoin 體系拆分為四個(gè)問題來談,1. 交易(transaction), 2. 支付(payment), 3. 審計(jì)(audit), 4. 鑄幣(mintage)。

【1】 交易(transaction)?

交易的基本訴求,是付款人(payer)匯款給收款人(payee)。技術(shù)挑戰(zhàn)是加密(cryptography),目的是不讓第三者截獲甚至篡改匯款金額。

BitCoin 的交易加密方式沿用了現(xiàn)成的,基于公鑰(public-key)私鑰(private-key)的非對(duì)稱加密體系(asymmetric cryptography)。這里沒有什么創(chuàng)新。

[1] 第二節(jié)的圖例中,最左側(cè)的框,解釋了 Owner0 給 Owner1 匯款的交易機(jī)制,截圖如下。

1. Owner0 先查到 Owner1 的公鑰。用 Owner1 的公鑰(Public Key)把匯款詳情加密。這樣,只有 Owner1 本人用自己的私鑰(Private Key),才能打開加了密的匯款詳情。在圖例中,沒有畫匯款詳情。不過這個(gè)小小的敘述的疏忽無妨大雅。

2. 為了方便 Owner1 驗(yàn)證這筆匯款的確來自 Owner0,而不是別人,Owner0 發(fā)出的匯款單里,除了有加了密的匯款詳情,還有 Owner0 的數(shù)字簽名(Signature)。Owner1 拿到匯款時(shí),為了驗(yàn)證這筆匯款的確來自 Owner0,他可以用 Owner0 的公鑰,來驗(yàn)證匯款單中 Owner0 的數(shù)字簽名。

3. Owner0 發(fā)出匯款單時(shí),匯款單不僅僅投遞到 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)收款人收到匯款時(shí),他把匯款單廣而告之。審計(jì)站點(diǎn)收到廣而告之的匯款單時(shí),會(huì)檢查匯款單中涉及的 BitCoin,是否出現(xiàn)在其它匯款單中,是否被重復(fù)付款。如果出現(xiàn)這種重復(fù)付款,審計(jì)站點(diǎn)會(huì)檢舉,并通知收款人拒絕簽收匯款。

BitCoin 保證重復(fù)付款的行為,能夠被檢舉,但是不能保證能夠被當(dāng)場(chǎng)抓獲。[2] 假設(shè)了一個(gè)場(chǎng)景,

1. 騙子開設(shè)了兩個(gè)賬號(hào),A 和 B。他先把一枚 BitCoin 由賬號(hào) A 匯款到賬號(hào) B,賬號(hào) B 立刻簽收。賬戶 B 簽收匯款前,沒有把匯款單廣而告之。

2. 然后騙子去 C 的網(wǎng)店買東西,他把同一枚 BitCoin 由賬號(hào) A 匯款到賬號(hào) C。C 收到匯款單后,等待幾秒鐘,如果各個(gè)審計(jì)網(wǎng)站沒有檢舉,C 就簽收 A 的匯款,同時(shí)交付商品。

3. 但是就在 C 等待的時(shí)候,騙子把從 A 到 B 的匯款單廣而告之,并且這是一個(gè)已經(jīng)被 B 簽收了的匯款單。因?yàn)閺?A 到 B 的匯款單是合法的,這個(gè)匯款單被各個(gè)審計(jì)站點(diǎn)接受。

4. 等到 C 簽收了 A 發(fā)來的匯款單,并廣而告之時(shí),各個(gè)審計(jì)網(wǎng)站會(huì)檢舉,說 A 到 C 的匯款單是重復(fù)付款,無效。雖然騙子被檢舉,但是 C 已經(jīng)交付了商品,C 上當(dāng)了。

為了防范重復(fù)付款,現(xiàn)行 BitCoin 的支付方式,有很多可以改進(jìn)的地方。例如,可以強(qiáng)制付款人給收款人發(fā)匯款單時(shí),必須把匯款單廣而告之,這時(shí)匯款單尚未被簽收。然后,當(dāng)收款人簽收匯款時(shí),也必須再次廣而告之,不過與第一次不同在于,第二次廣而告之的,是已經(jīng)被簽收的匯款單。

但是似乎到目前為止,還沒有發(fā)現(xiàn)一種數(shù)學(xué)上完全嚴(yán)謹(jǐn)?shù)霓k法,能夠徹底杜絕重復(fù)支付的發(fā)生。

【3】 審計(jì)(audit)

為了杜絕重復(fù)付款的欺詐行為,一個(gè)簡(jiǎn)單的辦法是全球人民每次匯款時(shí),先把匯款單提交給一個(gè)權(quán)威機(jī)構(gòu),例如支付寶。支付寶收下付款人匯來的 BitCoin,然后發(fā)另一枚 BitCoin 給實(shí)際收款人。這樣做,可以保證收款人收到的 BitCoin 不會(huì)有詐,但是不能保證支付寶,從匯款人那里收到的 BitCoin,沒有被重復(fù)支付。

舉個(gè)例子,假如權(quán)威機(jī)構(gòu)除了支付寶以外,還有 Paypal 等等,付款人用同一枚 BitCoin,向兩個(gè)收款人匯款,匯款時(shí)分別經(jīng)過支付寶和 Paypal。假如重復(fù)支付成功,兩個(gè)收款人沒有損失,但是支付寶和 Paypal 中,一定有一家機(jī)構(gòu)被欺詐。

這種防范欺詐的機(jī)制,除了技術(shù)上有漏洞以外,依賴權(quán)威機(jī)構(gòu)的做法,與 BitCoin 的群眾路線的設(shè)計(jì)理念相違背。

BitCoin 的做法,是把任何一枚 BitCoin,從誕生到當(dāng)下,每一次交易都記錄在案,而且按時(shí)間順序串聯(lián)起來。這就像古董,通常要附帶歷史記錄,從制作出售之初,每一次轉(zhuǎn)手,都被記錄下來,這樣有利于防范被冒牌頂替。

BitCoin 的每次記錄都被廣而告之,并且記錄下來,并且連綴成串。這樣,每一次 BitCoin 的交易,不僅有付款人和收款人參與,而且有第三方審計(jì)人參與。審計(jì)人可以是專職機(jī)構(gòu),也可以是任何一臺(tái)電腦。審計(jì)不僅能夠及時(shí)發(fā)現(xiàn)違法操作,例如重復(fù)付款,而且即便當(dāng)時(shí)漏網(wǎng),事后也能回溯。

[1] 第八節(jié)的圖例中,解釋了 BitCoin 交易記錄的串聯(lián)的數(shù)據(jù)結(jié)構(gòu),截圖如下。

2

有兩點(diǎn)值得注意,

1. 為了提高審計(jì)效率,BitCoin 把多個(gè)交易(Transaction)合并成一個(gè)塊(Block),同時(shí)用 Merkle Tree(又稱 Hash Tree)[3],把這些交易詳情組織起來。

??如果想檢查一個(gè) Block 里是否包含有某個(gè) Transaction,最簡(jiǎn)單的辦法是找到合適的私鑰,把 Block,以及其中包含的 Transactions,解密打開,然后逐一核對(duì)。很顯然,這樣的做法,既浪費(fèi)時(shí)間,又很不安全。

??使用 Merkle Tree 的好處在于,不需要解密開包,只需要把 Transaction 也 Hash 一下,然后把哈希結(jié)果與 Merkle Tree 中各個(gè)中間節(jié)點(diǎn)的哈希值,依次對(duì)比,就能夠很輕松地確定 Merkle Tree 中,是否包含著指定的 Transaction,如果有,它是哪一個(gè)葉子節(jié)點(diǎn)。

2. 如果每次交易,只包含一枚 BitCoin,那么每枚 BitCoin 的歷史記錄,是一根單線。但是事實(shí)上,每次交易,可以涉及多枚 BitCoins,所以,交易的歷史記錄,不僅有單線,還有多根單線合并成一根線的情況。

??不僅有合并,還有分叉,這種情況出現(xiàn)在 A 給 B 匯款了多枚 BitCoins,B 簽收了這筆匯款交易后,又把多枚 BitCoins 轉(zhuǎn)手分發(fā)給多個(gè)收款人。

??不僅 BitCoin 的歷史記錄有多線合并成單線,又有單線分叉成多線。而且一枚 BitCoin 還可以分裂成多個(gè)小幣。

【4】 鑄幣(mintage)

在 BitCoin 體系中,任何參與審計(jì)的人,都自動(dòng)參與貨幣的生產(chǎn)。貨幣的生產(chǎn),即鑄幣(mintage)的過程,在 BitCoin 體系中被稱為挖金礦(gold mining)。

從技術(shù)上講,審計(jì)和鑄幣完全是可以拆分的兩件事情。把鑄幣權(quán)與參與審計(jì)綁定在一起,是游戲規(guī)則的設(shè)定,目的是發(fā)動(dòng)群眾,共同維護(hù) BitCoin 的誠(chéng)信體系。

另外,BitCoin 的總蘊(yùn)藏量,被預(yù)先設(shè)定了上限。這樣做的目的,是通過限制貨幣流通量,遏制通貨膨脹。

從技術(shù)上來看,完全可以把 BitCoin 體系當(dāng)成一個(gè)工具箱,用這些工具,配置不同的規(guī)則,從而創(chuàng)造另一種貨幣體系。

例如,

1. 可以設(shè)定只有政府才有資格挖金礦,從而把鑄幣權(quán)收歸政府。

2. 不必設(shè)定貨幣流通上限,而是可以根據(jù)新增財(cái)富,來增加貨幣發(fā)行。

3. 可以通過認(rèn)證,給每個(gè)付款人設(shè)定信用值,用于加快支付簽收速度。

4. 也可以通過保險(xiǎn),讓每一筆匯款交易的收款人,立刻簽收匯款。如果出現(xiàn)重復(fù)付款,保險(xiǎn)公司賠付。

5. 雖然理論上每個(gè)人(實(shí)際上是每臺(tái)電腦),都有資格成為審計(jì)員,實(shí)際上,必定會(huì)出現(xiàn)大型機(jī)構(gòu),憑借強(qiáng)大的計(jì)算和存儲(chǔ)能力,成為專業(yè)審計(jì)機(jī)構(gòu)。
Reference,
[1] Bitcoin: A Peer-to-Peer Electronic Cash System
???http://bitcoin.org/bitcoin.pdf
[2] Best Practice for Fast Transaction Acceptance – How high is the risk?
???https://bitcointalk.org/index.php?topic=3441.msg48384#msg48384
[3] Introduction to Merkle Tree
???http://en.wikipedia.org/wiki/Merkle_tree
轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_46d0a3930101p15m.html

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 核心算法是hash嗎?

    來自上海 回復(fù)