menu-icon
anue logo
熱門時事鉅亨號鉅亨買幣
search icon

區塊鏈

靚號地址也可以安全?詳解無許可多鏈部署的唯一安全方法

BlockBeats 律動財經 2023-01-12 18:30

cover image of news article
律動財經圖片

1.6 億美元不翼而飛,而丟失資金的 Wintermute 是業內最敏銳的做市基金之一,在 9 月份的一個早上,當 Wintermute 負責人醒來時,發現他們的一個重要錢包丟失了 9 位數的資金。那是什麼導致了 Wintermute 被盜?這是由一個靚號地址生成器中糟糕的隨機性引起的。黑帽駭客從頭開始暴力破解私鑰&公開地址對,然後,大量的加密資產就這麼被轉走了。

還有一個關於 Indexed Finance 被盜的故事,他們在 2021 年 10 月被盜走了 1600 萬美元,然後被盜資金轉移到了 以 0xba5ed… 開頭的地址。他們不知道的是,這個靚號地址也受到了困擾 Wintermute 的糟糕隨機性漏洞的影響,2022 年 9 月,所有的錢都再次被盜,流向了另一個駭客錢包地址。盜賊是無情的。

那這些天才開發者到底遇到了什麼問題,我們能從中學到什麼?


左邊是用於 WETH 合約的普通地址。右側是用於 MEV 機器人優化的帶有 14 個前導零的靚號地址。最常見的靚號地址類型是帶有許多前導零的地址。

首先,什麼是靚號地址(又稱虛榮地址)?靚號地址是指用戶刻意創建與其錢包或智能合約相關聯的公共地址,也許它以 0x0000000 開頭,也許以 0xdeadbeef 開頭,也許是其他規律的地址。它們受歡迎的原因有幾個:

1、Gas 優化:Wintermute 因為使用了一個有多個前導零的 EOA 地址而節省了 15000 美元。聽起來很傻嗎 ? 很多人都同意,但這就是 EVM 的工作方式 ! 如果你的地址中有很多零,那麼交易 gas 費用就能下降。所以你如果用一個很多前導零的智能合約地址,當用戶在和它交互時,他們會感到很開心,因為這可以為他們省錢。

以太坊黃皮書描述了前導零地址如何可以實現更便宜的 gas

2、協議品牌。你知道 1inch Token合約是以 0x111111111 開頭……的嗎?

1inch Token 合約

3、多鏈重複性。在我看來,這是重中之重,也是為什麼每個協議都應該為它們的部署使用一個靚號地址。你的應用可以存在於 15 條不同的 EVM 鏈上,並且在任何地方都具有相同的地址!這對開發者和用戶來說不是更容易嗎?



那什麼時候靚號地址是安全的?

以太坊地址有兩種類型:外部擁有帳戶(EOA)和智能合約帳戶。如果你使用過像 MetaMask 這樣的錢包,其中的每個地址都是一個 EOA,它是用來簽署消息和進行交易處理的。將此與 Uniswap 合約等智能合約帳戶進行比較,人們可以與之交互,但它不能在不被觸發的情況下採取自己的行動。總結一下,很簡單,靚號地址對 EOA 帳戶來說是不安全的,但對於智能合約帳戶是安全的。

那為什麼會是這樣?我們將在下面進行更詳細的解釋,但這取決於靚號地址是如何生成的。對於 EOA 帳戶,你循環使用數百萬個私鑰,直到找到一個與美觀的公共地址相對應的私鑰。然而,私鑰控制着 EOA 帳戶內的資金,因此,如果你用來遍歷私鑰的隨機性遭到破壞,那麼你的整個帳戶就會被毀了。另一方面,創建智能合約靚號地址只需要遍歷公共種子,這些種子不授予智能合約的任何管理權限。

這就是為什麼 Wintermute 會失敗,而 OpenSea 卻成功的原因——用不安全的軟體在不安全的內存中生成私鑰是不好的。但是以這種方式生成公共種子卻非常好!所以 EOA 靚號地址是一條破產之路,而智能合約靚號地址是一條成功之路。

為什麼協議需要靚號地址

更簡單的文檔!你可以在所有鏈上指向一個合約地址;

用戶可驗證!只有當且僅當字節碼是逐字節匹配時,才會出現相同的合約地址;

開發者可驗證!由於相同的合約地址只發生在完全匹配的情況下,因此你可以在部署腳本中捕捉到棘手的小修改;

更簡單的集成!其他協議可以將你的合約地址硬編碼到它們的多鏈代碼中,而不必使用基於 chainId 的 if 語句。

註:我們即將深入研究一份詳細說明手冊。這是第一次把所有的部分放在一起,我們正在深入技術領域,目標受眾是具有在鏈上部署智能合約經驗的智能合約開發人員。如果你感興趣,請繼續閱讀,但如果不適合你,請不要擔心跟不上! 最後還有一個額外的技術挑戰 ( 有獎勵 )。

智能合約靚號地址

有一種方法可以生成 100% 安全的智能合約靚號地址,無論你使用哪種軟體,迭代技術是否公開泄露都無關緊要。它被稱為「CREATE2 工廠法」,這不僅提供了靚號地址,而且還是確保你在多條鏈上擁有相同合約部署地址的萬無一失的方法。它還允許其他人無需信任地代表你部署代碼,而無需任何私鑰共享或 nonce 假設。

首先,快速概述一下如何選擇智能合約地址。有兩個部署選項,分別是 CREATE 和 CREATE2 。當你直接從 EOA 部署智能合約時,默認流程是 CREATE。該地址是通過將合約創建者地址與合約創建者 nonce 進行哈希運算來確定的。這個 nonce 是指一個地址發送了多少筆交易,所以一個新的錢包是從 0 開始,每次發送一筆新交易都會增加 1。以下是 CREATE 部署的智能合約地址的神奇公式:

new_address = hash(sender, nonce)

不太常見,但更有趣的,是使用 CREATE2 部署的智能合約地址,以下是其公式:

new_address = hash(0xFF, sender, salt, bytecode)

前者看起來更簡單,對吧?但是,讓我們舉一個例子,說明與更健壯的 CREATE2 流程相比,這種簡單性在哪些方面會產生不利影響。

Airy Alice:多鏈出了問題

想象一個名叫 Alice 的 crypto 開發者創建了兩個智能合約:一個名為 GriddleSwap 的 Uniswap 分叉,以及一個名為 ph00ts 的 NFT 項目。它們都是不可變的獨立原語,這意味著沒有外部依賴或跨鏈橋風險。Alice 使用 nonce 0 將 GriddleSwap 部署到以太坊,然後使用 nonce 1 將 ph00ts 部署到以太坊。遺憾的是,Alice 的注意力持續時間很短,在將她的工作部署到第二大智能合約平台幣安智能鏈(BSC)之前,她在加密推特上分心了幾分鐘。

糟糕,搞砸了部署順序!

但是等等! 她搞砸了部署順序,在 GriddleSwap 之前部署了 ph00ts。由於智能合約地址僅依賴於創建者地址,並且在部署區塊鏈中,以太坊 gridleswap 與 BSC ph00ts 具有完全相同的地址 ! 雪上加霜的是,以太坊 ph00ts 的地址與 BSC GriddleSwap 的地址相同。認為終端用戶會感到困惑是一種保守的說法。事實上,它可能被惡意部署者濫用,以欺騙人們認為在鏈上的合約行為是相同的——這是一個公平的假設,給定相同的地址!

細心的 Alice :仍然會有問題

即使 Alice 在部署時很認真,並且從不混淆她的 nonce 順序,還有其他的問題。如果 Alice 正確部署到以太坊和 BSC 上,但隨後在 Polygon 上進行了一筆不相關的交易,則 nonce 0 已被用完。她永遠不能在那裡部署 GriddleSwap,因為她的 nonce 已經增加了。因此,必須不惜一切代價保護部署者私鑰。如果 Alice 泄露了它,惡意破壞者就可以進行不相關的交易。如果 Alice 丟失了它,她也將失去在新鏈上再次部署到該地址的能力。這是一個永久性的漏洞,依賴於一個誠實的個人來保護私鑰。 如果連比特幣 core 開發者做不到,那我們其他人又該如何做到呢?

解決方案:CREATE2

值得慶幸的是,有一種更好的方法可以跨鏈獲得一致的地址——不依賴於秘密私鑰,不依賴於單個部署者,並且在整個過程中可以抵抗部署者的錯誤。請記住用於查找使用 CREATE2 部署的智能合約地址的公式:

new_address = hash(0xFF, sender, salt, bytecode)

第一個參數 0xFF 是一個可以忽略的常數值。第二個參數 (sender address) 可以通過在大多數 EVM 鏈中選擇 z0age 的 CREATE2Factory 部署 0x0000000000FFe8B47B3e2130213B802212439497 來保持一致。第三個參數是一個用戶選擇的 salt,我們可以用它來找到一個靚號地址,然後在鏈上保持不變。第四個是合約字節碼,它可以作為一個有用的完整性檢查,以確保我們在鏈上部署完全相同的功能。無論任何單個部署者做什麼,所有四個參數都可以保持相同。

為什麼這樣更好呢? 與私鑰不同,部署者選擇的 salt 是可以被公開的! 知道 salt 可以部署合約,但對合約資產或功能的控制為零。因為它不綁定任何秘密資訊,所以任何人都可以在不泄露或共享私鑰的情況下將合約部署到新鏈上。字節碼參數還確保當且僅當字節碼相同時,這些新的無許可部署將具有相同的地址。因此,最終用戶無需做詳細的代碼差異就能得到更強的保證。

有關更深入的概述,請參閱 OpenZeppelin 的科普文章‌。

創建你自己的靚號地址

認為以太坊合併後,工作量證明(PoW)就沒用了嗎?再想一想!同樣的 GPU 功能,有助於為比特幣區塊尋找具有大量前導零的哈希原像,在為 EVM 智能合約找到具有大量前導零的哈希原像方面也非常出色。來自 OpenSea 的 z0age(這篇文章多虧了他的解釋)找到了一個簡單的設置來創建你自己的靚號地址。

1、使用 vast.ai‌ 啟動一個 GPU 示例實例,每秒嘗試約 20 億次,成本約為 25 美分 / 小時:

Image:nvidia / opencl

GPU: 1x RTX 3090 

需要分配的磁盤空間:1.83 GB

2、SSH 並安裝 rust + create2crunch

sudo apt install build-essential -y; curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y; source "$HOME/.cargo/env"; git clone https://github.com/0age/create2crunch && cd create2crunch; sed -i "s/0x4/0x40/g" src/lib.rs

3、運行種子搜尋。對於環境變量,INIT_CODE_HASH 是合約創建代碼的 keccak256。可以在此處‌找到一個打印出來的樣本代工測試 - 確保在消耗大量計算資源之前對其進行驗證!LEADING 應該是你想要的前導零字節數,TOTAL 應該是你想要在合約地址中的總零字節數。

export FACTORY="0x0000000000ffe8b47b3e2130213b802212439497"; export CALLER="0x0000000000000000000000000000000000000000"; export INIT_CODE_HASH="0xabc...def"; export LEADING=5; export TOTAL=7; cargo run --release $FACTORY $CALLER $INIT_CODE_HASH 0 $LEADING $TOTAL

當 z0age 首次發布他的 repo 時,它能夠在上述 vastAI 硬體上每秒運行 19 億次嘗試。從那時起,矢量化在某些 OpenGL 內核上變得瘋狂起來,我觀察到每秒有 21.5 億次嘗試。這意味著找到一個 5 前導零字節地址需要 256^5/(2150000000 * 60) ~= 8 分鐘,找到一個 6 前導零字節地址需要 256^6/(2150000000 * 3600) ~ = 36 小時,找到一個 7 前導零字節地址需要 256^7/(2150000000 * 86400) ~= 387 天。請注意,一個字節等於兩個十六進制字符,因此一個 5 前導字節的地址將有 10 個零。當然,這種搜尋可以完全並行化,隨著時間的推移,實際成功的機率將遵循泊松分布。

部署 CREATE2 工廠

精明的讀者可能已經注意到,CREATE2 Factory 在所有鏈上都已經存在於 0x0000000000FFe8B47B3e2130213B802212439497。這有點像雞生蛋還是蛋生雞的問題,一致的地址部署如何依賴於一致的地址部署?

當我最初了解到這種方法時,我以為它只是一個由比我更聰明的人持有的私鑰 ( 上面的「細心的 Alice」場景 )。但它實際上比這健壯得多! ENS 創始人 Nick Johnson 的「無密鑰交易」方法利用了這樣一個事實,即你可以從任何交易簽名中恢復公共地址,而無需知道簽署它的相應私鑰。因此,可以創建一筆交易(「部署一個 create2 工廠」),然後為其發明一個偽造的簽名,例如僅由 2 組成的簽名。存在這個偽造簽名的私鑰,但沒有人知道它是什麼。但是我們可以恢復「無密鑰簽名」對應的公共地址,給它發送一些 ETH,然後將簽名的交易提交給內存池。儘管這種方法很模糊,但它是一筆有效的交易,而且實際上是唯一可以從這個公共地址發出的有效交易。

結果呢 ? 任何人都可以在沒有任何專有資訊的情況下將 factory 部署到新的鏈上,同時防止惡意行為者造成損害。創建一個只能部署一個事務的單用途 EOA 是非常巧妙的技術。

無密鑰交易過程中創建的具體地址和合約

這可以通過三個簡單的「forge cast」命令來完成。字節碼太長,無法在此處複製,但你可以按照 https://github.com/ProjectOpenSea/seaport/blob/main/docs/Deployment.md‌ 上的說明,在你選擇的任何鏈上無需許可地部署 CREATE2 Factory!

當然,如果已經部署過了,就沒有必要再部署了。

旁註: EIP-155 要求是糟糕的

簡短的嘗試來支持我的 L1 治理冒險行為,請隨意跳過。EIP-155‌ 是 Vitalik 於 2016 年提出的一項提案,其引入了「鏈 ID」的概念以防止重放攻擊(replay attacks)。每條鏈都有自己的唯一標識符——以太坊是 1,BSC 是 56,Polygon 是 137——這些標識符將包含在已簽名的交易中以防止重放攻擊,它很快被以太坊採用,而其他所有 EVM 鏈都跟着採用了這個提案。這很好,但問題來了,當選擇幾條鏈,例如 Evmos 最近決定明確禁止 EIP-155 前的交易‌,在奇怪的理由下,它可以防止一個操作錯誤,即 Optimism 將 2000 萬 OP Token 發送到 Wintermute 不存在的一個多重簽名(是的,又是他們)地址,聲稱擁有但從未初始化。但是,禁用 155 之前的交易會顯著破壞一整套跨鏈部署,例如 CREATE2 factory 以及 Seaport 等領先項目。這些治理提案應該立即回滾,像這樣的保護細節應該來自錢包而不是共識層。如果多鏈是未來,那麼這些不必要的限制,將是頂級項目部署在你的區塊鏈上的巨大障礙。

有趣的東西:部署賞金

今天 https://delegate.cash 部署在 7 個不同的 EVM 鏈(Ethereum、Polygon、Optimism、Celo、Avalanche、Fantom 和 Arbitrum)以及與這些鏈對應的 7 個測試網上。所有這些的合約地址都是相同的:0x00000000000076A84feF008CDAbe6409d2FE638B。

那這就夠了嗎?不,我們需要更多的鏈。因為 delegatecash 是一個零依賴的獨立原語,這意味著多鏈的風險實際上為零。這是純粹的好處!因此,對於前 5 名將 delegatecash 智能合約部署並驗證到新鏈和相應的測試網上的人,我將獎勵 100 USDC 獎金!

你需要在此處‌使用開源儲存庫中的部署腳本。這可能需要部署 CREATE2 Factory(如果它不存在),並且不要忘記 Etherscan 驗證!愉快部署,享受體驗式學習!

原文連結

暢行幣圈交易全攻略,專家駐群實戰交流

▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

前往鉅亨買幣找交易所優惠

文章標籤


Empty