Create2

是否可以從交易本身(即沒有代理/創建者智能 c)創建具有確定性地址的智能合約(如 CREATE2 所做的)?

  • February 10, 2022

我找到

  1. 來自乙太坊黃色白皮書

交易包含欄位:

  • 隨機數
  • 天然氣價格
  • 氣體限制
  • 價值
  • v, r, s
  • init(包含應返回“智能合約執行時程式碼”的“智能合約創建程式碼”)或數據(呼叫智能合約的參數,通常是“solidity 函式名稱雜湊”和“函式參數”)

創建帳戶時使用了許多內在參數:…………,新帳戶地址的鹽(ζ)……

鹽 ζ 可能失去(ζ = ∅);……

如果創建是由 CREATE2 引起的,則 ζ = ∅。

  1. “智能合約初始化程式碼”應該
  • 複製程式碼到記憶體
  • 使用 RETURN(start_offset_of_memory, end_offset) 返回“執行時程式碼”

在此處輸入圖像描述


似乎如果我在從 EOA 發出的交易中提供“salt”(當然還有“init”和除“data”之外的所有其他欄位)欄位,它將創建具有確定地址的智能合約(就像 CREATE2 操作碼一樣)

但是沒有用於交易的“鹽”欄位,我看到每個人都使用“ProxyFactory 智能合約”(OpenZeppelin 12此處的 Deployer 智能合約)創建具有確定地址的智能

這好像是:

  • 如果 EOA 從交易中創建智能合約 - 智能合約將使用 CREATE 方法隱式創建
  • 如果智能合約創建智能合約 - 可以使用 CREATE 或 CREATE2 操作碼創建

問題:是否有可能/為什麼不使用 ProxyFactory 方法就無法從交易本身創建具有確定地址的智能合約?

Tnx 致 Paul Razvan Berg

這是設計使然,這就是我想听到的

所以當人們喜歡這裡https://ethereum.stackexchange.com/a/761/82396

對於 CREATE2 創建的合約,其地址為:

keccak256(0xff ++ 發件人地址 ++ 鹽 ++ keccak256(init_code))

$$ 12: $$ 請注意,senderAddress 可以是外部擁有的帳戶 (EOA) 或契約。

我會知道不,它不可能是EOA,因為senderAddress是工廠的地址

在此處輸入圖像描述

引用自:https://ethereum.stackexchange.com/questions/110700