1. 程式人生 > >ICO使用區塊鏈技術進行交易、支付、審計、鑄幣全過程解析

ICO使用區塊鏈技術進行交易、支付、審計、鑄幣全過程解析

區塊鏈愛好者(QQ:53016353) 

山寨幣的技術原理。瞭解原理以後,山寨幣能夠解決什麼問題,尚存什麼缺陷,自然就一清二楚。剩下的問題,就是討論隨著 山寨幣的發展,將會有什麼機會。



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






【1】 交易(transaction) 


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


山寨幣的交易加密方式沿用了現成的,基於公鑰(public-key)私鑰(private-key)的非對稱加密體系(asymmetric cryptography)。這裡沒有什麼創新。


[1] 第二節的圖例中,最左側的框,解釋了 Owner0 給 Owner1 匯款的交易機制,截圖如下。








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


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


3. Owner0 發出匯款單時,匯款單不僅僅投遞到 Owner1,而且還要廣而告之,任何人只要願意參與 山寨幣審計,都可以收到全球所有人發出的所有匯款單。


4. 沿用 1、2、3 的原理,Owner1 給 Owner2 匯款,然後 Owner2 給 Owner3 匯款。山寨幣通過 Hash 機制,把涉及同一枚 山寨幣的所有匯款交易(Tranaction)串連起來,目的是為了追查重複付款(double spending)的欺詐行為。




【2】 支付(payment)


當付款人(payer)向收款人(payee)發出匯款交易(transaction)後,支付過程(payment)並沒有完成。直到收款人簽收了匯款以後,支付過程才正式結束。


在收款人接受匯款以前,他必須確認匯款人沒有重複付款(double spending)。這就類似於我們接受紙幣前,最好驗證一下紙幣是不是假鈔一樣。


山寨幣驗證重複付款的辦法,是靠群眾檢舉。當收款人收到匯款時,他把匯款單廣而告之。審計站點收到廣而告之的匯款單時,會檢查匯款單中涉及的 BitCoin,是否出現在其它匯款單中,是否被重複付款。如果出現這種重複付款,審計站點會檢舉,並通知收款人拒絕簽收匯款。


山寨幣保證重複付款的行為,能夠被檢舉,但是不能保證能夠被當場抓獲。[2] 假設了一個場景,


1. 騙子開設了兩個賬號,A 和 B。他先把一枚 山寨幣由賬號 A 匯款到賬號 B,賬號 B 立刻簽收。賬戶 B 簽收匯款前,沒有把匯款單廣而告之。


2. 然後騙子去 C 的網店買東西,他把同一枚 山寨幣由賬號 A 匯款到賬號 C。C 收到匯款單後,等待幾秒鐘,如果各個審計網站沒有檢舉,C 就簽收 A 的匯款,同時交付商品。


3. 但是就在 C 等待的時候,騙子把從 A 到 B 的匯款單廣而告之,並且這是一個已經被 B 簽收了的匯款單。因為從 A 到 B 的匯款單是合法的,這個匯款單被各個審計站點接受。


4. 等到 C 簽收了 A 發來的匯款單,並廣而告之時,各個審計網站會檢舉,說 A 到 C 的匯款單是重複付款,無效。雖然騙子被檢舉,但是 C 已經交付了商品,C 上當了。


為了防範重複付款,現行 山寨幣的支付方式,有很多可以改進的地方。例如,可以強制付款人給收款人發匯款單時,必須把匯款單廣而告之,這時匯款單尚未被簽收。然後,當收款人簽收匯款時,也必須再次廣而告之,不過與第一次不同在於,第二次廣而告之的,是已經被簽收的匯款單。


但是似乎到目前為止,還沒有發現一種數學上完全嚴謹的辦法,能夠徹底杜絕重複支付的發生。




【3】 審計(audit)


為了杜絕重複付款的欺詐行為,一個簡單的辦法是全球人民每次匯款時,先把匯款單提交給一個權威機構,例如支付寶。支付寶收下付款人匯來的 BitCoin,然後發另一枚 山寨幣給實際收款人。這樣做,可以保證收款人收到的 山寨幣不會有詐,但是不能保證支付寶,從匯款人那裡收到的 BitCoin,沒有被重複支付。


舉個例子,假如權威機構除了支付寶以外,還有 Paypal 等等,付款人用同一枚 BitCoin,向兩個收款人匯款,匯款時分別經過支付寶和 Paypal。假如重複支付成功,兩個收款人沒有損失,但是支付寶和 Paypal 中,一定有一家機構被欺詐。


這種防範欺詐的機制,除了技術上有漏洞以外,依賴權威機構的做法,與 山寨幣的群眾路線的設計理念相違背。


山寨幣的做法,是把任何一枚 BitCoin,從誕生到當下,每一次交易都記錄在案,而且按時間順序串聯起來。這就像古董,通常要附帶歷史記錄,從製作出售之初,每一次轉手,都被記錄下來,這樣有利於防範被冒牌頂替。


山寨幣的每次記錄都被廣而告之,並且記錄下來,並且連綴成串。這樣,每一次 山寨幣的交易,不僅有付款人和收款人蔘與,而且有第三方審計人蔘與。審計人可以是專職機構,也可以是任何一臺電腦。審計不僅能夠及時發現違法操作,例如重複付款,而且即便當時漏網,事後也能回溯。


[1] 第八節的圖例中,解釋了 山寨幣交易記錄的串聯的資料結構,截圖如下。








有兩點值得注意,


1. 為了提高審計效率,山寨幣把多個交易(Transaction)合併成一個塊(Block),同時用 Merkle Tree(又稱 Hash Tree)[3],把這些交易詳情組織起來。


   如果想檢查一個 Block 裡是否包含有某個 Transaction,最簡單的辦法是找到合適的私鑰,把 Block,以及其中包含的 Transactions,解密開啟,然後逐一核對。很顯然,這樣的做法,既浪費時間,又很不安全。


   使用 Merkle Tree 的好處在於,不需要解密開包,只需要把 Transaction 也 Hash 一下,然後把雜湊結果與 Merkle Tree 中各個中間節點的雜湊值,依次對比,就能夠很輕鬆地確定 Merkle Tree 中,是否包含著指定的 Transaction,如果有,它是哪一個葉子節點。


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


   不僅有合併,還有分叉,這種情況出現在 A 給 B 匯款了多枚 BitCoins,B 簽收了這筆匯款交易後,又把多枚 BitCoins 轉手分發給多個收款人。


   不僅 山寨幣的歷史記錄有多線合併成單線,又有單線分叉成多線。而且一枚 山寨幣還可以分裂成多個小幣。




【4】 鑄幣(mintage)


在 山寨幣體系中,任何參與審計的人,都自動參與貨幣的生產。貨幣的生產,即鑄幣(mintage)的過程,在 山寨幣體系中被稱為挖金礦(gold mining)。


從技術上講,審計和鑄幣完全是可以拆分的兩件事情。把鑄幣權與參與審計繫結在一起,是遊戲規則的設定,目的是發動群眾,共同維護 山寨幣的誠信體系。


另外,山寨幣的總蘊藏量,被預先設定了上限。這樣做的目的,是通過限制貨幣流通量,遏制通貨膨脹。


從技術上來看,完全可以把 山寨幣體系當成一個工具箱,用這些工具,配置不同的規則,從而創造另一種貨幣體系。


例如,


1. 可以設定只有政府才有資格挖金礦,從而把鑄幣權收歸政府。


2. 不必設定貨幣流通上限,而是可以根據新增財富,來增加貨幣發行。


3. 可以通過認證,給每個付款人設定信用值,用於加快支付簽收速度。


4. 也可以通過保險,讓每一筆匯款交易的收款人,立刻簽收匯款。如果出現重複付款,保險公司賠付。


5. 雖然理論上每個人(實際上是每臺電腦),都有資格成為審計員,實際上,必定會出現大型機構,憑藉強大的計算和儲存能力,成為專業審計機構。