買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > 火幣APP > Info

GET:在以太坊上安裝 “炸彈”_togetherbnb全部劇情攻略

Author:

Time:1900/1/1 0:00:00

本文是講解我在 go-ethereum(Geth)客戶端中發現的 Bug 系列的第二篇。如果你還不了解它,請看第一篇(中文譯本)。

這篇文章要講的 bug 位于 Geth 客戶端的狀態下載器內,它可以用來欺騙下載器,使之不能與主網正確同步。攻擊者可以利用這個 bug 給以太坊區塊鏈設置陷阱、任意觸發硬分叉。

當你想運行一個以太坊節點的時候,首先必須同步上整個網絡,即,下載和計算構建最新區塊時刻的區塊鏈狀態所需的所有數據。根據用戶自身的需要,同步方式可以在安全性和速度之間有所取舍,所以(在撰文之時) Geth 支持兩種同步模式:完全同步和快速同步。

顧名思義,完全同步就是獨立地執行完對以太坊區塊鏈的整個同步過程。這就意味著,你的 Geth 節點會下載和驗證每個區塊的工作量證明(PoW),此外,它還會計算區塊內的每一條事務;由此,節點可以在本地生成區塊鏈的最新狀態,而無需信任其它節點。這種模式更安全,但速度上有很大犧牲。Geth 的完全同步可能要花幾天乃至幾周不等的時間。

但是,有些用戶可能不想等上幾周。也許他們的時間很緊,又或者,他們并不覺得這種犧牲是值得的。因此,Geth 提供了一個模式:在近期的某個區塊(稱為 “pivot 區塊”)之前的所有鏈數據,都用更快的方法來同步,只有 pivot 區塊之后的區塊鏈,才使用更慢的完全同步算法。在快速同步模式中,Geth 會下載區塊,但僅隨機選取一些區塊來驗證工作量證明,而不是每個區塊都驗證;而且,它也將不再自己執行事務,而是從網絡中的其它節點處直接下載狀態樹,以此獲得最終的區塊鏈狀態。

Angryb于7月16日在以太網絡發布:據官方消息,預購機制實驗項目Angryb 已于7月16日在以太網絡發布其治理代幣ANB憤怒幣,該項目已獲得派盾(PeckShield)安全公司審計。

據悉,ANB是一種半價預約機制實驗項目,且具備回購銷毀,強通縮性。Angryb完全去中心化,由DAO protocol治理,并歸社區所有。

該項目的空投計劃將于7月25日在官方電報群開啟。[2021/7/24 1:13:19]

當然,Geth 也不會盲目相信其他節點發回的狀態樹數據,因為一個惡意的節點也可以聲稱某個賬戶只有一點點錢(但實際有很多)。要理解 Geth 如何能辨別收到的數據正確與否,我們先要理解默克爾帕特里夏樹(Merkle-Patricia trie)。

默克爾帕特里夏樹(MPT)是 Geth 客戶端中的一種關鍵數據結構,它是默克爾樹和帕特里夏樹兩者的結合。

簡而言之,帕特里夏樹會基于數據的前綴將數據存到一個樹狀結構中。相較于其它技術(如哈希表,hashmap)來說,帕特里夏樹本身非常適合存儲相似的數據,盡管在速度上可能有所犧牲。下面來看看,多個以 r 開頭的單詞是如何存到一棵帕特里夏樹里的。

接著來說說默克爾樹。在一棵默克爾樹上,每個葉節點是數據的哈希值,每個非葉節點是它的兩個子節點的哈希值。如果用戶知道了默克爾樹的默克爾根(即,頂端哈希值),并且想要確認某個數據是否存儲在這棵樹里,他只需要用到這棵樹上的一條路徑,這條路徑所涉及的節點數量只跟葉節點數量的對數(注意不是葉節點數量)成正比。如下圖所示,假設用戶要證明 L2 存儲在這棵樹里,他只需提供 Hash 0-0 和 Hash 1。接著,驗證者生成 Hash 0-1、Hash 0 和 Top Hash,再將 Top Hash 與其所預期的默克爾根進行比較。

USDT在以太坊上發行量擊穿200億美元:據DeBank數據顯示,穩定幣USDT在以太坊區塊鏈上的發行量已擊穿200億美元,本文撰寫時為20,017,877,740美元,24小時USDT活躍地址數達95854個,24小時轉賬次數達到177,518次,轉賬額為6,841,620,818美元。以太坊上的穩定幣是用于區塊鏈網絡中的法幣,通常和法幣價格鉚定,由第三方審計,有真實美元作為儲備或由復雜的算法來保障其價格,目前USDT是以太坊上發行量最大的穩定幣,其次是USDC和DAI。[2021/2/19 17:28:55]

默克爾帕特里夏樹將帕特里夏樹基于前綴的存儲結構與默克爾樹相結合,創造出了一種新的數據結構,不僅支持密碼學驗證方式,而且還能保持良好的運行時性能。

在默克爾帕特里夏樹中,鍵和值都是任意的字節串。要想獲得一個鍵的值,我們首先要將這個鍵轉換成一個十六進制字符序列,即,將每個字節變成兩個十六進制字符。然后,我們要先根據序列中的第一個字符,向根節點查詢下一個節點是什么;得到此子節點后,再根據第二個字符向下查詢節點,依次類推,直至找到最后一個節點,獲得最后一個字符。

在下面這個例子中,我們可以看到默克爾帕特里夏樹實際上包含三種不同的節點。擴展節點(在 Geth 代碼庫中又被稱為短節點)是經過優化的,負責存儲一連串字符。在下圖所示案例中,根節點存儲了所有以 a7 開頭的鍵,無需使用兩個不同的節點來代表 a 和 7。分支節點(或稱 “完整節點”)包含每個可能字符的指針以及一個額外的空檔來存儲當前節點的值。最后,葉節點(又稱值節點)的 key-end 字段必然與其所存儲的 key 的后綴相匹配 1 。

外媒:委內瑞拉將在以太坊上創建去中心化證券交易所:10月2日消息,委內瑞拉將在以太坊上創建去中心化證券交易所。盡管委內瑞拉熱衷于高度集中的行政程序,但在當前的法律框架內,該交易所將盡可能實現去中心化。委內瑞拉政府表示,所有合同和協議都是公開且可審核的,并且參與者將擁有他們自己的密鑰和代幣。據稱,該交易所是一個運行在以太坊區塊鏈上的DeFi平臺,交易者可以根據情況以ERC223合約(ERC20的替代品)和ERC721(唯一代幣)的形式交換代幣化的傳統資產。此前消息,委內瑞拉總統馬杜羅表示,該國正在研究除石油幣外在貿易中增加使用加密貨幣的可行性,這可能既包括私人也包括國家的工具。(Decrypt )[2020/10/2]

既然我們已經知道默克爾帕特里夏樹是如何運作的了,我們可以開始探究什么是全局狀態樹。

區塊鏈的絕大部分數據都存儲在全局狀態樹中。雖然將狀態樹作為獨一無二的實體包含在每個區塊內這個設想看似便利,但實際上每個區塊都要復制完整的狀態樹是極其低效的,因為每個區塊之間的狀態樹只有細微差別。Geth 采用了不同的方案。你可以想象一下,Geth 維護了一個 MPT 節點池。每個區塊的狀態樹只是整個池的子集。每當有新的區塊被挖出或導入,就會有新的 MPT 節點被添加到池中。

要想識別節點池中的根節點,我們必須查詢區塊頭。每個區塊都包含一個指向 stateRoot 的字段,該字段指向 MPT 的根節點(而該 MPT存儲以賬戶地址 ?2 作為鍵的賬戶數據)。這樣一來,Geth 就可以使用我們上文描述的算法查詢賬戶信息,如任意地址的 nonce 或余額。

可口可樂裝瓶商正在以太坊上測試DeFi:金色財經報道,北美最大的可口可樂裝瓶商技術合作伙伴CONA Services(Coke One North America)宣布建立了“可口可樂裝瓶港”,以減少供應商的技術壁壘。該項目由針對大型公司的中間件解決方案The Baseline Protocol促成,使可口可樂瓶裝商不僅可以在以太坊公共區塊鏈上私下進行通信和交易,還可以訪問DeFi應用程序并代幣化資產。該項目計劃在2020年第四季度展示其初步成果。[2020/8/4]

請注意,如果是合約的話,賬戶狀態將包含一個非空的 storageRoot 字段和 codeHash 字段。storageRoot 字段指向另一個根節點。但是,此時所涉及的 MPT 的用途是存儲該合約的存儲項數據;該 MPT 會將存儲空檔(storage slot)作為鍵,將原始數據作為值。

為了將 MPT 存儲在磁盤上,Geth 選擇使用 LevelDB 作為數據庫。然而,LevelDB 是只支持字符串到字符串映射的鍵值數據庫,MPT 不是字符串到字符串映射。為了解決這個問題,Geth 將每個節點編寫成鍵值對,從而實現全局狀態樹的扁平化:將節點的哈希值作為鍵,將序列化的節點作為值。這樣一來,Geth 就能查詢任意區塊的狀態樹,因為區塊頭中的 stateRoot 字段就是鍵,可以用來查找 LevelDB 中的序列化 MPT 節點(譯者注:即一棵 MPT 的根節點)。

動態 | 美國即將啟用的新拆借利率部分將運行在以太坊上:前美國商品期貨交易委員會(CFTC)主席Christopher Giancarlo表示,由紐約聯邦儲備銀行推出的 SOFR (擔保隔夜融資利率)和美國芝加哥期權交易所與美國金融交易所(AFX)聯合推出的 Ameribor(無擔保貸款隔夜基準利率),將作為互為補充的擔保隔夜融資利率標準,分別將被用于美國大型金融機構和中小企業間的借貸交易。Ameribor 將在“需許可的”以太坊上運行。不同于公開的、無需許可的以太坊公鏈,“需許可的”以太坊的共識算法為權威證明(proof-of-authority),而非以太坊公鏈上需要全網共識的工作量證明(proof-of-work)。在 Amberibor 的使用場景下, 美國金融交易所將對交易參與方發放 ERC 721 標準的非同質代幣(Non Fungible Token,NFT),每枚代幣將在交易開始時自動生成,并通過智能合約完成自動化的結算。(福布斯)[2019/11/22]

因此,假設你啟動了一個 Geth 節點,并使用快速同步模式連接到網絡。Geth 將快速下載所有區塊數據,但是不執行任何事務。不久之后,你將得到一個沒有狀態信息的區塊鏈。此時,Geth 通過狀態下載器從 pivot 區塊的 stateRoot 開始進行同步。

狀態下載器會向對等節點請求與 MPT 節點鍵對應的 MPT 節點數據。收到結果后,狀態下載器會對節點數據進行哈希計算,驗證得到的哈希值是否與節點鍵相同。如果相同,狀態下載器就知道這個 MPT 節點是正確的,然后就會發送更多請求,請求該 MPT 節點的每個子節點。

如果遇到葉節點(包含序列化的賬戶狀態),賬戶的代碼和狀態樹將排隊等待被獲取。

請注意同步子樹和原始條目之間的區別。雖然二者都下載任意的數據塊,但是如果同步器預期要同步的是原始樹,它會將該數據解析為樹節點,并開始同步其子節點。另一方面,如果同步器預期要同步的是原始條目,它會將數據塊寫入數據庫并終止。

另外還要注意的是,Geth 想要多次向同一個節點發送請求的情況并不少見。例如,如果兩個合約存儲相同的數據,那它們的 stateRoot 可能相同,也有可能出現兩個賬戶擁有同樣的賬戶狀態。在這些情況下,Geth 不想讓網絡充斥這些請求,因此會將它們合并。

然而,同步器不會合并請求的 raw 屬性。這意味著,如果已經有了一個未決的原始條目請求,但是同步器又安排了一個具有相同哈希值的子樹請求,后者將被合并,最終結果還是只有一個原始條目請求。

請記住,原始條目請求不會為了同步子節點而處理節點(不像子樹請求)。這意味著,如果我們能以某種方式在原始條目和子樹節點之間引發沖突,我們就能讓 Geth 同步一個不完整的狀態樹。另外,遇到一個本地不存在的樹節點時,Geth 不會退出(報錯),這等于是假設,如果下載器報告同步成功,這種(本地缺失狀態數據的)情況就不會發生。這就意味著,缺少一個樹節點的 Geth 節點在行為上與其它完全同步樹的節點截然不同。

那么,如何引發沖突呢?事實證明非常簡單:我們只需用我們控制的某個合約的序列化狀態根部署另一個合約,因此該合約代碼的哈希值必定與(我們所控制的合約的)狀態根哈希值相同,這就意味著如果合約代碼先同步,另一個合約的狀態樹不會被全部下載下來。

如果有人利用這個漏洞作惡,需完成要多個步驟并等待很長時間。

首先,我們部署一個合約(我們會利用漏洞將這個合約的狀態樹覆蓋掉)。這個合約應該有一個獨一無二的 stateRoot,從而避免與這個 stateRoot 相關的 MPT 節點提前同步。

現在我們就大功告成了。當新的 Geth 節點使用快速同步加入網絡時,它們會先請求 Exploit 合約,同步其狀態子樹及代碼。當 Exploit 合約的代碼被同步時,它會創建一個看起來與 Discrepancy 的狀態根請求完全相同的原始條目請求,但它不會被當作子樹請求處理。這意味著,該節點永遠不會下載 Discrepancy 的狀態 trie,因此未來讀取 magic 的請求將返回 0 而非 1。

經過足夠長的時間后,我們要做的就是調用 Hardfork.hardfork(discrepancy)。每個正確同步整個網絡的節點都會看到一個回滾交易,而每個使用快速同步加入網絡的 Geth 節點都會看到一個成功的交易。這將導致一個區塊產生兩個不同的狀態根,也就是說我們可以隨心所欲地觸發鏈分裂。

Geth 團隊通過處理 PR #21039 中的樹讀取錯誤快速解決了該攻擊,然后通過區分 PR #21080 中的代碼部分和樹部分完全修復了這個漏洞。

這是一個非常有趣的漏洞,它可以讓攻擊者在以太坊網絡上設置一個 “炸彈”,并隨時引爆,從而導致所有使用快速同步的 Geth 節點從主網中分叉。這個陷阱利用的是 Geth 的同步和數據存儲代碼中極其復雜的邏輯,這或許是它很長時間來都沒有引起人們注意的原因。

敬請期待本系列的第三篇也是最后一篇文章。在這篇文章中,我們將探索 Geth 客戶端的最新 bug,具體細節不便透露。

從技術層面來說,Geth 中的值節點不包含后綴。你可以將其理解成一個后面跟著值節點(只包含原始數據)的擴展節點。

實際上,Geth 使用的是 “安全的 trie”,即,通過 SHA-3 算法對所有鍵進行哈希計算,從而確保所有鍵都是固定長度。

原文鏈接: https://samczsun.com/booby-trapping-the-ethereum-blockchain/

作者: samczsun

翻譯&校對: 閔敏 & 阿劍

Tags:ETHGETGETH以太坊eth官網中文版togetherbnb全部劇情攻略togetherbnb手游下載最新版以太坊價格今日行情

火幣APP
區塊鏈:從 “橋” 的角度思考Layer 2協議_LAYER

- “橋” 的 安全/威脅 模型各有不同 -通過鏈下協議增強網絡可擴展性的方案在密碼學貨幣社區內掀起了一股熱潮.

1900/1/1 0:00:00
CEL:“鯨魚”在這次暴跌中趁機抄底7.7萬枚比特幣_ELS

根據區塊鏈分析公司Chainalysis的數據,大型投資者上周利用比特幣的價格暴跌抄底了更多的幣.

1900/1/1 0:00:00
MYB:用區塊鏈技術進行胚胎可視化 仁濟醫院為國內首家_BABY

原文標題:《用區塊鏈技術進行胚胎可視化 仁濟醫院為國內首家》央廣網上海6月2日消息(記者楊靜)“傳承創新.

1900/1/1 0:00:00
300:新華社:百倍杠桿 瘋狂的“幣圈”帶來“暴富”還是“爆倉”?_區塊鏈用大白話解釋

虛擬貨幣價格的大幅震蕩之下,多少人渴望的“一夜暴富”,變成了“一夜爆倉”,血本無歸。“幣圈”資深投資者劉鵬沒想到,一頓晚飯的功夫,年初以來賺的十多萬元全部“打水漂”了.

1900/1/1 0:00:00
DEF:DeFi世界 如何保障你的資金安全?_EFI

"加密貨幣的牛市,也是黑客和犯罪者的天堂"DeFi 作為此次行業爆發的引線,自從去年下半年崛起后,便徹底激活了整個行業,構建出了DEX、去中心化借貸、預言機、資產跨鏈橋等一整套DeFi生態.

1900/1/1 0:00:00
BTC:晚間必讀5篇 | ETH價格上漲11%后 DeFi代幣市場回暖_EFI

1.金色觀察 | ETH價格上漲11%后 DeFi代幣市場回暖加密市場經歷過周末行情低迷后,有所回暖,ETH價格則有較大幅度的上漲。在過去24小時內ETH價格上漲了11%,達到2640美元高點.

1900/1/1 0:00:00
ads