。比如,該賬號準確地預測到德國隊會在加時賽取勝並且馬里奧·格策(Mario Götze)會進球。這看起來可以證明,要麼是微博主人有預知未來的能力,要麼是比賽被操縱了。然而事實上,這個博主只是在比賽前釋出了所有可能發生的事件,比如,對於所有的參賽球員,都有一條關於他會進球的微博,以及對於每一種可能的最終比分,都有一條相關的微博等(見圖9.1),然後在比賽結束之前,博主刪除了所有那些不準確的預測,只留下那些準確的“預測”。
圖9.1 試圖對未來進行預測
注:這就是那個虛假的試圖透過預測比賽結果來“證明”世界盃決賽圈的比賽被操控了的推特賬號。其中第一個和第四個在賽後被證明是正確的,其他不準的預測就被刪掉了。
可以用同樣基礎的攻擊方法攻破任何安全時間戳系統。你只需要在事先預埋下所有的結果,然後最終只披露那個正確的結果。這就意味著如果你想證明你有預測能力,就必須去證明你做且只做了一個預測結果,而不是多個預測。但如果你想基於雜湊函式揭示結果,是很難實現的,尤其是在比特幣的區塊鏈上,因為安全時間戳系統並不將承諾與任何個人身份識別相關聯。如果你不揭示它們,就會很容易公佈很多種承諾,而那些你從未揭示的承諾很難輕易追溯到你。
過時的安全時間戳
這裡介紹一個簡單的低科技含量的安全時間戳方案:透過刊登廣告,你可以在一份報紙或者其他媒體上登出你預測結果的雜湊函式值,相關的舊報紙雜誌會被儲存在圖書館裡或者線上備份。這種方法可以提供較高程度的保證,證明你在報紙發出的當天就已經知道這個結果了。以後,當你想要披露你預測的結果時,你可以在同一個報紙上刊登第二份公告。
比特幣裡的安全時間戳
如果我們想用比特幣而不是報紙來實現時間戳的功能,我們應該在哪裡放置約定的雜湊值?是在交易中的某個環節,還是直接在一個區塊裡?
人們想出來的第一個也是最簡單的解決辦法是,直接把錢打到資料的雜湊函式值,而不是公共鑰匙的函式值。由於你不知道對應地址的私鑰,這樣做會“消耗”這些幣,讓它們銷燬掉,並且永不能被利用。為了降低成本,你可能需要傳送微量的幣值,比如1聰(satoshi,0.0000001個比特幣,這是比特幣的最小交易額)。
這個方法雖然很簡單,但消耗比特幣的做法不討人喜歡(即使和交易費相比,這種被消耗的比特幣量級可以忽略不計)。更大的問題是,因為比特幣礦工不知道這些交易開支是永遠不可用的,他們會永遠地追蹤下去。因此整個比特幣社群對這個方法都不太感冒。
另一個較為先進的被稱為承諾幣(CommitCoin)的方法,是將你的資料編碼進私鑰裡。第1章中曾經提到過:“使用ECDSA時,確保隨機性良好來源至關重要,因為不良來源將可能導致金鑰資訊的洩露。這一點不難理解,如果你使用了不良隨機源來生成金鑰,那麼該金鑰就可能不安全。但是ECDSA的古怪就在於,即使你僅僅只是在生成簽名時使用了不良隨機源,而你使用的金鑰完美無缺,你的個人金鑰還是可能會被洩露。”
承諾幣利用了這個特性。我們生成一個新的私鑰把我們的資料約定進行編碼,並對應地生成一個公鑰。然後我們會發送一個微小金額的交易(比如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號為例,其中在描述有關擁有、分發傳播和接收兒童色情製品的非法行為時,使用的措辭就用了“明知故犯”這樣包含了意圖的關鍵詞。
另外一個值得注意的是,根據上面我們討論過的位元組大小的限制,圖片資料(除非是非常小的圖片)不能直接被寫在區塊鏈的資料塊中,這些資料要麼被存放在只在區塊鏈中儲存相應連結的外部資料庫中,要麼是用一種冗長的辦法封裝在多個交易之中。最終的結果就是,大多數比特幣使用者都沒有能力在交易中直接解碼並檢視資料,更不用說解碼並檢視跨越多個交易的資料了。
。比如,該賬號準確地預測到德國隊會在加時賽取勝並且馬里奧·格策(Mario Götze)會進球。這看起來可以證明,要麼是微博主人有預知未來的能力,要麼是比賽被操縱了。然而事實上,這個博主只是在比賽前釋出了所有可能發生的事件,比如,對於所有的參賽球員,都有一條關於他會進球的微博,以及對於每一種可能的最終比分,都有一條相關的微博等(見圖9.1),然後在比賽結束之前,博主刪除了所有那些不準確的預測,只留下那些準確的“預測”。
圖9.1 試圖對未來進行預測
注:這就是那個虛假的試圖透過預測比賽結果來“證明”世界盃決賽圈的比賽被操控了的推特賬號。其中第一個和第四個在賽後被證明是正確的,其他不準的預測就被刪掉了。
可以用同樣基礎的攻擊方法攻破任何安全時間戳系統。你只需要在事先預埋下所有的結果,然後最終只披露那個正確的結果。這就意味著如果你想證明你有預測能力,就必須去證明你做且只做了一個預測結果,而不是多個預測。但如果你想基於雜湊函式揭示結果,是很難實現的,尤其是在比特幣的區塊鏈上,因為安全時間戳系統並不將承諾與任何個人身份識別相關聯。如果你不揭示它們,就會很容易公佈很多種承諾,而那些你從未揭示的承諾很難輕易追溯到你。
過時的安全時間戳
這裡介紹一個簡單的低科技含量的安全時間戳方案:透過刊登廣告,你可以在一份報紙或者其他媒體上登出你預測結果的雜湊函式值,相關的舊報紙雜誌會被儲存在圖書館裡或者線上備份。這種方法可以提供較高程度的保證,證明你在報紙發出的當天就已經知道這個結果了。以後,當你想要披露你預測的結果時,你可以在同一個報紙上刊登第二份公告。
比特幣裡的安全時間戳
如果我們想用比特幣而不是報紙來實現時間戳的功能,我們應該在哪裡放置約定的雜湊值?是在交易中的某個環節,還是直接在一個區塊裡?
人們想出來的第一個也是最簡單的解決辦法是,直接把錢打到資料的雜湊函式值,而不是公共鑰匙的函式值。由於你不知道對應地址的私鑰,這樣做會“消耗”這些幣,讓它們銷燬掉,並且永不能被利用。為了降低成本,你可能需要傳送微量的幣值,比如1聰(satoshi,0.0000001個比特幣,這是比特幣的最小交易額)。
這個方法雖然很簡單,但消耗比特幣的做法不討人喜歡(即使和交易費相比,這種被消耗的比特幣量級可以忽略不計)。更大的問題是,因為比特幣礦工不知道這些交易開支是永遠不可用的,他們會永遠地追蹤下去。因此整個比特幣社群對這個方法都不太感冒。
另一個較為先進的被稱為承諾幣(CommitCoin)的方法,是將你的資料編碼進私鑰裡。第1章中曾經提到過:“使用ECDSA時,確保隨機性良好來源至關重要,因為不良來源將可能導致金鑰資訊的洩露。這一點不難理解,如果你使用了不良隨機源來生成金鑰,那麼該金鑰就可能不安全。但是ECDSA的古怪就在於,即使你僅僅只是在生成簽名時使用了不良隨機源,而你使用的金鑰完美無缺,你的個人金鑰還是可能會被洩露。”
承諾幣利用了這個特性。我們生成一個新的私鑰把我們的資料約定進行編碼,並對應地生成一個公鑰。然後我們會發送一個微小金額的交易(比如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號為例,其中在描述有關擁有、分發傳播和接收兒童色情製品的非法行為時,使用的措辭就用了“明知故犯”這樣包含了意圖的關鍵詞。
另外一個值得注意的是,根據上面我們討論過的位元組大小的限制,圖片資料(除非是非常小的圖片)不能直接被寫在區塊鏈的資料塊中,這些資料要麼被存放在只在區塊鏈中儲存相應連結的外部資料庫中,要麼是用一種冗長的辦法封裝在多個交易之中。最終的結果就是,大多數比特幣使用者都沒有能力在交易中直接解碼並檢視資料,更不用說解碼並檢視跨越多個交易的資料了。