Create2
是否可以從交易本身(即沒有代理/創建者智能 c)創建具有確定性地址的智能合約(如 CREATE2 所做的)?
我找到
- 來自乙太坊黃色白皮書
交易包含欄位:
- 隨機數
- 天然氣價格
- 氣體限制
- 到
- 價值
- v, r, s
- init(包含應返回“智能合約執行時程式碼”的“智能合約創建程式碼”)或數據(呼叫智能合約的參數,通常是“solidity 函式名稱雜湊”和“函式參數”)
還
創建帳戶時使用了許多內在參數:…………,新帳戶地址的鹽(ζ)……
鹽 ζ 可能失去(ζ = ∅);……
如果創建是由 CREATE2 引起的,則 ζ = ∅。
- “智能合約初始化程式碼”應該
- 複製程式碼到記憶體
- 使用 RETURN(start_offset_of_memory, end_offset) 返回“執行時程式碼”
似乎如果我在從 EOA 發出的交易中提供“salt”(當然還有“init”和除“data”之外的所有其他欄位)欄位,它將創建具有確定地址的智能合約(就像 CREATE2 操作碼一樣)
但是沒有用於交易的“鹽”欄位,我看到每個人都使用“ProxyFactory 智能合約”(OpenZeppelin 1和2或此處的 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是工廠的地址