2014世界杯決賽誣蔑國際足聯腐敗事件以推特賬號偽造時間戳來襲擊比特幣網發生過嗎?
。比如,該賬號準確地預測到德國隊會在加時賽取勝并且馬里奧·格策(Mario G?tze)會進球。這看起來可以證明,要么是微博主人有預知未來的能力,要么是比賽被操縱了。然而事實上,這個博主只是在比賽前發布了所有可能發生的事件,比如,對于所有的參賽球員,都有一條關于他會進球的微博,以及對于每一種可能的最終比分,都有一條相關的微博等(見圖9.1),然后在比賽結束之前,博主刪除了所有那些不準確的預測,只留下那些準確的“預測”。
圖9.1 試圖對未來進行預測
注:這就是那個虛假的試圖通過預測比賽結果來“證明”世界杯決賽圈的比賽被操控了的推特賬號。其中第一個和第四個在賽后被證明是正確的,其他不準的預測就被刪掉了。
可以用同樣基礎的攻擊方法攻破任何安全時間戳系統。你只需要在事先預埋下所有的結果,然后最終只披露那個正確的結果。這就意味著如果你想證明你有預測能力,就必須去證明你做且只做了一個預測結果,而不是多個預測。但如果你想基于哈希函數揭示結果,是很難實現的,尤其是在比特幣的區塊鏈上,因為安全時間戳系統并不將承諾與任何個人身份識別相關聯。如果你不揭示它們,就會很容易公布很多種承諾,而那些你從未揭示的承諾很難輕易追溯到你。
過時的安全時間戳
這里介紹一個簡單的低科技含量的安全時間戳方案:通過刊登廣告,你可以在一份報紙或者其他媒體上登出你預測結果的哈希函數值,相關的舊報紙雜志會被保存在圖書館里或者在線備份。這種方法可以提供較高程度的保證,證明你在報紙發出的當天就已經知道這個結果了。以后,當你想要披露你預測的結果時,你可以在同一個報紙上刊登第二份公告。
比特幣里的安全時間戳
如果我們想用比特幣而不是報紙來實現時間戳的功能,我們應該在哪里放置約定的哈希值?是在交易中的某個環節,還是直接在一個區塊里?
人們想出來的第一個也是最簡單的解決辦法是,直接把錢打到數據的哈希函數值,而不是公共鑰匙的函數值。由于你不知道對應地址的私鑰,這樣做會“消耗”這些幣,讓它們銷毀掉,并且永不能被利用。為了降低成本,你可能需要發送微量的幣值,比如1聰(satoshi,0.0000001個比特幣,這是比特幣的最小交易額)。
這個方法雖然很簡單,但消耗比特幣的做法不討人喜歡(即使和交易費相比,這種被消耗的比特幣量級可以忽略不計)。更大的問題是,因為比特幣礦工不知道這些交易開支是永遠不可用的,他們會永遠地追蹤下去。因此整個比特幣社區對這個方法都不太感冒。
另一個較為先進的被稱為承諾幣(CommitCoin)的方法,是將你的數據編碼進私鑰里。第1章中曾經提到過:“使用ECDSA時,確保隨機性良好來源至關重要,因為不良來源將可能導致密鑰信息的泄露。這一點不難理解,如果你使用了不良隨機源來生成密鑰,那么該密鑰就可能不安全。但是ECDSA的古怪就在于,即使你僅僅只是在生成簽名時使用了不良隨機源,而你使用的密鑰完美無缺,你的個人密鑰還是可能會被泄露?!?/p>
承諾幣利用了這個特性。我們生成一個新的私鑰把我們的數據約定進行編碼,并對應地生成一個公鑰。然后我們會發送一個微小金額的交易(比如2 000聰)到那個地址,隨后再發送兩筆每次1 000聰的交易回來。最重要的是,當發送回來的時候,我們會用同樣的隨機源來對兩次交易進行簽名。這樣,任何人在區塊鏈里計算包含被封裝的數據約定的私鑰時,必須使用兩個簽名。
比起把數據約定編碼到公鑰的方法,承諾幣避免了消耗額外的比特幣,而且礦工不再會一直追蹤一個永久不能再被使用的支出。不過這個方法十分復雜。
不能被再次使用的輸出
一直到2015年,比特幣實行時間戳的辦法是用一個OP_RETURN的交易,這個交易的輸出可以被證明,但不能被二次使用(見圖9.2)。這個OP_RETURN指令會立刻返回一個錯誤代碼讓這個腳本永遠不能成功地執行,這樣一來,所封裝的數據就被忽略了。就像我們在第3章看到的,這既可以用做消耗證明,也可以用來編碼任意數據。到2015年,OP_RETURN允許輸出80個字節的數據,這對哈希函數來說是足夠了(SHA-256需要32個字節)。
圖9.2 用OP_RETURN指令的時間戳
注:這是一個“不能被再次使用”的交易輸出腳本,中間封裝了一個數據約定。
這個方法“擠出了”在沒有被使用過交易支出里的“水分”,因為礦工會精簡OP_RETURN里的支出。這個數據約定的花費其實就是一個交易費。在整個2015年,一個典型的交易費通常小于1美分。這個交易費可以分攤在針對多個數據的一個約定上,從而使得成本更低。在2015年年末,已經有幾個網站在做這些服務。它們收集不同用戶的一組數據,把這些數據封裝到一個梅克爾樹中,然后發布一個包含了這個梅克爾樹樹根數據中不能被再次使用的交易支出。這種做法就好比,把當天需要實行時間戳的所有用戶數據封裝到了一個數據約定里。
非法內容
區塊鏈隨意封裝數據的特性也有不好的地方,可能會被某些人惡意使用。在大多數國家,有些內容,尤其如兒童色情,它的制作和傳播都是非法的,并且會伴隨非常嚴厲的處罰。著作權法也嚴格規定了某些內容的傳播。
當然,不少人已經嘗試這樣做去“危害”或者擾亂比特幣社區。比如,有報道稱有部分色情鏈接被公布在比特幣的區塊鏈上。這些害群之馬的目的,就是讓下載比特幣區塊鏈到個人硬盤并且運行完全有效節點的行為變得很危險,這也意味著你有可能存儲和傳播了這些非法的信息。
然而,截至目前,還沒有好的辦法來阻止這種寫入任意數據到比特幣區塊鏈的行為,即使我們用P2SH(支付給腳本的哈希值)來防止惡意攻擊行為,也只不過是使交易多花些費用而已,無法完全阻止這種行為。
好在法律不是計算機算法,嘗試用技術的手段對法律進行“黑客攻擊”雖然很誘人,但并不容易。法律是需要人類來解釋的,并融合了其他因素,比如我們的意圖。以美國聯邦法案2252號為例,其中在描述有關擁有、分發傳播和接收兒童色情制品的非法行為時,使用的措辭就用了“明知故犯”這樣包含了意圖的關鍵詞。
另外一個值得注意的是,根據上面我們討論過的字節大小的限制,圖片數據(除非是非常小的圖片)不能直接被寫在區塊鏈的數據塊中,這些數據要么被存放在只在區塊鏈中保存相應鏈接的外部數據庫中,要么是用一種冗長的辦法封裝在多個交易之中。最終的結果就是,大多數比特幣用戶都沒有能力在交易中直接解碼并查看數據,更不用說解碼并查看跨越多個交易的數據了。