比特幣時間戳的安全性

2021-02-20 BixinInstitute

Jameson Lopp 文

本文由幣信原創編譯,原文連結: 

https://medium.com/@lopp/bitcoin-timestamp-security-8dcfc3914da6

本文版權歸原作者所有,僅代表作者本人觀點,不代表幣信的觀點或立場。

本文約4000字,閱讀全文需約10分鐘。

 

比特幣通常被稱為一種安全的時間戳服務。我們從未獲得過一種帶有可信時間戳的全球性真實記錄,那麼這是怎麼產生的呢?這主要是得益於工作量證明與礦工必須遵守的一些簡單規則的結合。礦工的主要職能是:

 

• 獲取無序的未確認交易並以特定順序對其進行排列

• 將交易打包到有效容器(區塊)當中

• 在可接受的時間範圍內為區塊蓋上時間戳

               

最後一個屬性使得比特幣(Bitcoin)能夠控制比特幣(bitcoin)供應的釋放。否則,只要算力增加,比特幣就會受到快速通脹的影響。但事實證明,這個屬性為比特幣協議賦予了相當多的實用性,也使得人們可以將比特幣用作其他服務的數據錨點。因為我們有合理強度的保證,讓時間戳落在給定範圍內,並且我們有重寫區塊鏈歷史所需能量的數學保證,所以,比特幣為數據的時間戳提供了一個可靠的錨點。但是,它有多可靠呢?

 

比特幣時間戳的彈性

為了使區塊頭的時間欄位被各個節點視為有效,它必須滿足兩個標準:

 

小於你電腦的當前時間 + 2小時

大於過去11個區塊的中位數時間戳

 

第一條規則是有道理的——我們顯然不希望任何人聲稱來自未來,並且,節點很容易拒絕這樣的聲明,因為我們大家對當前時間是一致認可的。有多種方法可以檢查當前時間,而一種非常流行的計算機同步時鐘的方法,是通過網絡時間協議(Network Time Protocol)。

 

但是,確保時間不要在合理點之前太遠要難一些。這是因為我們不能假設節點在區塊被最初創建的時間附近驗證區塊。節點需要能夠離開並重新加入網絡,這可以是出於任何原因或並無理由。如果必須在當前時間的幾個小時內創建區塊,那麼距離鏈頂端太遠的節點將開始拒絕歷史區塊。

 

「節點可以隨意離開並重新加入網絡,接受工作量證明鏈作為它們離開時發生的事情的證明。」——中本聰,比特幣白皮書

 

也許這很違背直覺,但並沒有規則要求區塊的時間戳必須在前一個塊的時間戳之後。如果你考慮一下,這樣一個規則可能會導致問題——如果一個礦工創建了一個時間戳接近未來2個小時的區塊,那麼下一個區塊也必須在未來很久以後——對其他礦工來說,自我糾正過去11個區塊的中位數時間就更難了。

 

此外,要記得,雖然預計約每10分鐘生產一個區塊,但並沒有真正的保證。區塊的時間間隔可以從幾毫秒到幾個小時不等。雖然過去11個區塊的預期中位時間應該是1小時前,但它可能早得多或者晚得多。

 

               

來源:https://en.bitcoin.it/wiki/Confirmation

 

推動時間戳窗口

如果您考慮一下敵對礦工可能會如何嘗試擴展可接受的時間戳窗口,很明顯,無論他有多少算力,他都無法將時間戳推遲超過2小時。然而,一個擁有足夠算力的攻擊者,可能會通過只打包時間戳幾乎沒有效的區塊——過去11個塊的中值時間之後僅一秒——來對「比特幣時間」的累進施加一些拖拽。

 

是否存在激勵去這樣做?在極端情況下,「時間扭曲攻擊」會提供短期的財務激勵,我們將在稍後討論它們。對於只是將時間戳到處拖拽幾個小時,目前還不太清楚可能存在什麼樣的激勵。雖然考慮到其他協議可以構建在比特幣之上(例如閃電網絡)並且可能涉及時間鎖(time locks),但未來也可能存在其他協議可能被減慢區塊鏈上的時間戳累進騙過去。

 

算力時間拖拽

由於最早的有效區塊時間基於過去11個塊的中位數時間,一個敵對礦工需要生成大量區塊來在過去的中位數時間上引起任何明顯的拖拽。

 

我們假設一種情況,所有礦工都通過網絡時間協議大致同步,但有一個敵對礦工試圖儘可能地拖拽過去11個區塊的中位數時間。

 

有一點非常明確:中本聰使用過去11個區塊的中位數時間戳而非平均值是一個聰明的決定,因為平均值會更易於操縱。另一種思考「過去的中位數時間」的方法是,如果所有時間戳都按順序排列,它簡單來說就意味著第6個最新塊的時間戳。如果不是,算法會對它們重新排序。因此,如果你希望對這個值產生不可忽略的影響,你需要算出過去11個塊中的6個。為了維持這種攻擊,你需要55%的算力,此時比特幣的熱力學安全性的一個主要假設就會破裂。但是運氣好,一個擁有較少算力的礦工有時候仍然可以實現這一目標。

 

在11個塊中挖出6個有多難?好吧,給定礦工算出下一個塊的可能性,基本上等同於其佔全網算力的百分比。因此,如果你只有1%的算力(這仍然相當多),那麼你在任意11個連續塊中挖出6個的機會 = (0.01⁶*0.99⁵)*(11!/(5!* 6!))= 約20億分之一。如果你保持1%的算力,那麼在你挖出11個中的6個之前需要發生的預期塊數將超過43000年。

 

對於實現一次成功的時間拖拽攻擊的預期等待時間,一個更一般化的公式將是:

 

(1 / (462 * (算力百分比⁶ * (1 - 算力百分比)⁵))) / 144 區塊/天 = 天數

 

             

 

我們可以看到,對於想在任何有意義的時間尺度上進行此類攻擊的攻擊者來說,他們需要一個相當大的礦池,至少佔全網算力的10%。

 

最大拖拽

然而,為了在過去的中位數時間上引起最大拖拽,礦工必須連續算出6個塊。如果他們在過去11個區塊中的6個不是全部按順序挖的,那麼其他礦工創建的時間間隔將迫使該敵對礦工將其區塊的時間戳設置為超過彼此一秒,因為每個區塊的過去的中位數時間將顯著地跳向誠實礦工在其區塊上設置的更準確的時間戳。

 

連續挖出6個塊有多難?如果我們再次假設礦工擁有1%的全網算力,那麼挖到任意連續6個塊的機會是0.01⁶ = 大約萬億分之一。如果你保持1%的算力,那麼在你挖出連續6個塊之前需要發生的預期塊數將近200萬年。

 

對於一次成功的時間拖拽攻擊的預期時間,更一般化版本的公式將是:

 

(1 / 算力百分比⁶ ) / 144 區塊/天 = 天數

 

             

 

這種攻擊更難以實現,需要更多的全網算力,比如20%或30%,才能在合理的時間範圍內發生。你可以想像,這很少發生,而當它發生時,人們會注意到。它最後一次發生,是在2014年7月的GHash,GHash有一段時間算力超過了40%,甚至在短時間內觸及了51%。再9個月前也發生了一次,當時BTC Guild有近一半的算力。如果你有50%的算力,你連續挖出6個塊的機會是0.5⁶ = 64分之一。如果你保持50%的算力,那麼你幾乎每12小時就能連續找到6個塊。

 

很明顯,在沒有大多數算力的情況下,不可能長期拖拽比特幣的過去的中位數時間,但是你可以在短時間內(一個塊左右)用運氣和耐心的正確組合拖動它幾個小時。如果你假設其他礦工的時間戳相當準確,那麼過去的中位數時間應該大約是1小時前,雖然由於挖出的區塊的波動性可能會多出幾個小時。如果您設法製作6個時間戳為1小時前加1秒、2秒、3秒等的塊,那麼在第6個塊,過去的中位數時間就大約是2小時前。如果我們假設區塊間隔為1小時的極端條件,則過去的中位數時間將是6小時前。

 

通過允許區塊時間戳存在合理的靈活性,然後採用最近區塊的中位數時間,我們最終得到一種非常難以愚弄的算法,但又不那麼脆弱,以至於對與真實時間不同步的礦工產生負面影響。

 

讓我們再做下時間扭曲

如果攻擊者確實擁有超過50%的全網算力並且他們想減緩比特幣時間的流逝怎麼辦?他們可以做一些非常討厭的事。這樣的敵對礦工可以防止時間戳以每個新區塊超過1秒的速度前進。如果他們在足夠長的時間裡一直這麼做,並最終在難度調整間隔上創建了區塊,而時間戳使得它看起來像創建時間遠超2周的之前的2016個區塊,他們就可以操縱調整邏輯,讓每2016個區塊的難度減少高達75%。最終,在難度足夠低的情況下,他們可以在給定的時間段內隨心所欲地產生區塊,從而獲得高於預期的挖礦獎勵。一次優化的時間扭曲攻擊可以在18.7天內挖出所有剩餘的比特幣。我們實際上已經看到類似的行為發生在比特幣的測試網3上,因為難度調整異常,現在測試網3在8年內挖出了1482878個區塊,約為預期產量的350%。

 

時間扭曲攻擊並不是什麼新鮮事。這種攻擊最初是在2011年針對一種名為「Geist Geld」的幣進行的,這在BitcoinTalk上被討論為「51%攻擊的變種」。Geist Geld想通過非常短的出塊時間來測試區塊生成速率的上限,以及具有(幾乎)穩定的生成速率且沒有供應上限或供應變化的加密貨幣的行為。

 

白幣(Whitecoin)在2014年似乎也遭到了時間扭曲攻擊。

 

在2018年,Verge受到了這樣的攻擊。然後在6周後再次被攻擊!

 

通常,對於給定類型的硬體(ASIC或GPU),算力小的加密貨幣容易受到時間扭曲攻擊,因為它們本身容易受到51%攻擊。

 

有趣的是,雖然時間扭曲通常被稱為攻擊,因為它會導致系統的意外行為,但是有些人已經表明它可以被用於潛在的期望用途。 2015年,Vitalik Buterin描述了一種通過一次軟分叉加速區塊從而提高了鏈上容量的方法。在2018年,比特幣開發者馬克·弗裡鄧巴赫(Mark Friedenbach)提出了利用這種意外行為的建議,以便為比特幣添加新功能。在他的「前向區塊(Forward Blocks)」提案中,馬克闡述了他的方法,它可以將鏈上交易量擴容到當前水平的3584倍,以向後兼容的方式改變工作量證明算法,分片,一個可退回的費用市場用於共識費用檢測,平滑地終止礦工補貼,以及保密交易的先決協議,mimblewimble,不可連結的匿名支出和側鏈。

 

然而,這些提議是有爭議的,並且可能會強迫那些依靠比特幣區塊頭的時間戳來構建的系統對該數據另尋出路。正如Greg Maxwell在比特幣開發者郵件列表上所說的那樣,阻止這樣的改變也相當容易:

 

它可以通過一次進一步限制區塊時間戳的軟分叉來修復,並且沿著這個思路人們已經提出了一些提案。

 

結論

 

比特幣的時間戳安全性,和限制可接受時間戳窗口的一些簡單規則,在對抗環境中經受了10年的考驗,儘管它們存在著已知的缺陷。我們知道,51%的礦工可能會在網絡上造成嚴重破壞,至少在短時間內會如此,但這種情況從未發生過——可能是因為激勵措施並不適合礦工這樣做。理性的礦工不會選擇短期收益而殺死長期的金鵝。

- END-

相關焦點

  • 到底什麼是比特幣?BTC的價值在哪裡?比特幣安全嗎?
    與大多數貨幣不同,比特幣不依靠特定貨幣機構發行,它依據特定算法,通過大量的計算產生,比特幣經濟使用整個P2P網絡中眾多節點構成的分布式資料庫來確認並記錄所有的交易行為,並使用密碼學的設計來確保貨幣流通各個環節安全性。
  • Case:比特幣的實體錢包
    放在50年前的科幻小說裡,這個時間戳就代表著未來。罔顧各種在線支付app的侵襲,說起「支付」這個詞,人們最先想到的應該是信用卡。磁條自上而下地一刷,你的現金就就悄無聲息地溜走。對比特幣這種純粹的虛擬貨幣來說,一個實體錢包或多或少能夠讓我們感受一下支付的過程。為此,這款能夠放進錢包的設備也才有意義。
  • 時間戳
    什麼是時間戳在FDA 21 CFR §11.10(e)有提到時間戳(time-stamped)(e) Use ofsecure
  • 比特幣錢包發布0.17.1新版本更新
    Bitcoin Core(比特幣核心)是一個實現了全節點的比特幣錢包客戶端,它組成了整個比特幣網絡的支架。比特幣核心擁有極高的安全性、隱私性、穩定性。但是會佔用很多的磁碟和內存空間。完整的節點指南(英文)Bitcoin Core(比特幣核心)的特性資金掌控權:這個錢包讓你擁有對你的比特幣的全面掌控權。這意味著沒有第三方可以凍結或是弄丟你的資金。但你仍需注意保障安全和備份你的錢包。全面驗證:這種錢包是一個完整節點,它在比特幣網絡上驗證並輪詢交易。這意味著當驗證支付的時候,不需要信任第三方。
  • 了解一下,航天「時間戳」是個啥東東?
    時間戳(timestamp),是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。通俗地講,時間戳是一個能表示一份數據在某個特定時間之前已經存在的、完整的、可驗證的數據。它的提出主要是為用戶提供一份電子證據,以證明用戶的某些數據的產生時間。
  • 比特幣白皮書
    2008年11月1日,一個化名為中本聰(SatoshiNakamoto)的神秘密碼學極客發布了比特幣白皮書《比特幣白皮書:一種點對點的電子現金系統
  • 比特幣的學術譜系
    這個數據結構必須滿足一定的屬性要求——總帳本應該是不可變的。更準確地說,只能添加新的交易,不能修改刪除,也不能對已有交易重新排序。除此之外,還需要獲得總帳本狀態的密碼摘要。摘要是一個簡短的字符串,可以避免存儲整個總帳本。如果總帳本被篡改,所產生的摘要必然會發生變化,從而可以檢測到篡改。
  • 比特幣的礦工和挖礦是什麼意思?
    自從很多人知道了比特幣很值錢,還是通過挖礦挖出來的,內心就開始躁動了。可是,很多人又丈二和尚摸不著頭腦,搞不清什麼是比特幣挖礦,為什麼有些人會自稱比特幣礦工。今天,我們就一起來了解下,比特幣礦工和比特幣挖礦是怎麼一回事。
  • 比特幣錢包大全
    比特幣的核心是一個實現所有節點的比特幣客戶端,構成了整個比特幣網絡的支撐。比特幣核心具有很高的安全性、私密性和穩定性。但是它的功能較少,並且佔用大量的磁碟和內存空間。比特幣結.比特幣的很多節點都是一個完整的比特幣客戶端,已經建立了比特幣網絡的主幹。客戶端提供高級別的安全性、高隱私性和高標準穩定性。客戶端包含比比特幣核心更高級的功能,但是這些客戶端沒有經過很好的測試。客戶端佔用大量磁碟空間和計算機內存。Bither網站。
  • 比特幣一個多少人民幣?比特幣怎麼獲得?
    比特幣一個多少人民幣?比特幣怎麼獲得?很多沒有接觸過虛擬貨幣或想了解或想進入這個行業的投資者們都想知道的問題,下面小編給比特幣小白們簡單的說說比特幣一個多少人民幣?比特幣怎麼獲得?  比特幣是目前最知名的虛擬貨幣之一,但是比特幣的價格不是固定的,比特幣的價格是根據市場變化的,每時每刻都在變化。
  • 黑客大佬&蘋果聯合創始人遭「時間差攻擊」,被騙走 7 枚比特幣
    直到今天雷鋒網看到了這個消息——據 CNBC 北京時間 2 月 27 日報導,蘋果聯合創始人史蒂夫·沃茲尼亞克(Steve Wozniak)在印度《經濟時報》舉辦的全球商業峰會上透露,他曾被人騙走七枚比特幣,如今價值逾 7 萬美元。
  • 比特幣還有安全性可言麼?韓國Youbit被黑敲響行業警鐘
    據19日路透社報導,Youbit在其網站上宣布,在當地時間19日凌晨4:35分遭遇「黑客入侵」,Youbit當即採取補救措施,將大約75%的資產提取出來保存於冷錢包中,並且通過商業保險等措施,把資產損失降到17%以下。
  • Python | 時間戳轉換
    像上圖中的beginbidtime變量,這是時間戳。時間戳是啥?是指格林威治時間自 1970 年 1 月 1 日(00:00:00 GMT)(一般把這個時點稱為 unix 紀元或 POSIX 時間)至當前時間的總秒數。時間戳的好處是能夠唯一地表示某一刻的時間,但這顯然不利於肉眼觀察和分析數據,所以下面我們將時間戳轉化為常見的時間格式。2.
  • 時間伺服器番外篇
    眾所周知, 先有比特幣, 後有區塊鏈。區塊鏈不等於比特幣, 比特幣是眾多區塊鏈裡, 最著名的一個應用。 比特幣是基於工作量證明(PoW)的公鏈區塊鏈, 也叫非限制準入區塊鏈, 或者非許可鏈(permissionless blockchain)。許可鏈可以下次有時間再專門寫一篇。
  • 聊聊時間(3)UTC時間轉UNIX時間戳
    前一篇文章《聊聊時間(2)UNIX時間戳轉UTC時間》中,我們詳細地解釋了如何將一個32位無符號的UNIX時間戳利用軟體算法轉換成我們可以看得懂的
  • 比特幣???
    ,擴展比特幣一定時間內的交易量。為了得到這些新產生的比特幣,參與處理區塊的用戶端需要付出大量的時間和計算力(為此社會有專業挖礦機替代電腦等其他低配的網絡設備),這個過程非常類似於開採礦業資源,因此中本聰將資料處理者命名為「礦工」,將資料處理活動稱之為「挖礦」。這些新產生出來的比特幣可以報償系統中的資料處理者,他們的計算工作為比特幣點對點網絡的正常運作提供保障。
  • 比特幣錢包(BTC錢包)大全
    比特幣桌面錢包Bitcoin Core 網址(https://bitcoin.org/)比特幣核心是一個實現了全節點的比特幣客戶端,它組成了整個比特幣網絡的支架。比特幣核心擁有極高的安全性、隱私性、穩定性。但是它有較少的特性且會佔用很多的磁碟和內存空間。
  • php 獲取今日、昨日、上周、本月的起始時間戳和結束時間戳的方法
    php 獲取今日、昨日、上周、本月的起始時間戳和結束時間戳的方法,主要使用到了 php 的時間函數 mktime。
  • Pandas 時間序列 - 縱覽與時間戳
    時間序列縱覽時間戳 vs.時間段轉換時間戳提供格式參數用多列組合日期時間無效數據紀元時間戳把時間戳轉換為紀元應用 `origin` 參數生成時間戳範圍自定義頻率範圍時間戳的界限依託 NumPy 的 datetime64、timedelta64 等數據類型,pandas 可以處理各種時間序列數據,還能調用 scikits.timeseries 等 Python 支持庫的時間序列功能。
  • 時間戳轉換
    時間戳轉換function timestampToTime(timestamp)