📜 [專欄新文章] EIP-1014 產生可控的智能合約地址
✍️ 飛天的狸貓
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
先前在 Solidity Taiwan 讀書會 群中看到一個討論,裡面應該是一個套利機器人,打開他的合約會發現 Contract 標記著 Reinit,大致上意思是在相同地址上曾經 Self Destruct 後又佈署新的 Byte Code。這其中就用到了 Vitalik 提出的 EIP-1014,來達成在固定的地址上佈署。
合約地址是怎麼產生的
如果對於以太坊智能合約佈署不陌生,應該會知道合約地址是依據佈署者的地址和他的 Nonce 來決定的。假如地址 0xa1 在 Nonce 為 1 的交易中建立了合約,合約地址是 0x01,則當他到了其他鏈而再次使用 Nonce 1 建立合約時,就也會得到相同的合約地址 0x01。
而在以太坊中,Nonce 是嚴格遞增的,這主要是為了避免雙花攻擊,因此很顯然的,再次佈署到同一個地址是不可行的。而在 EIP-1014 以前,在合約中建立的子合約也是透過這個方式達成。
EIP-1014 做了什麼
前面說到合約中可以建立子合約,通常使用的指令是 create,這個指令便會根據主合約的地址與合約本身的 Nonce 來算出子合約的地址。在 EIP-1014 中,提出了另外一個指令 create2,接受的參數是一個 salt 和 init code(建立合約的 Byte Code)。這個指令會透過 keccak256 雜湊,混和參數和主合約的地址來算出子合約地址。
可以留意到,salt 和 init code 都是可控的,主合約地址是固定的,因此就讓子合約地址是可控制的(當然不是說想要產生在哪裡就在哪裡)。在 create 中,Nonce 是漸次增加的,所以無法重複,並且若要控制到特定 Nonce 需要發起多筆交易。
但是當再次佈署到相同地址時,EIP-684 說明若該地址 Nonce 不為零或者存在 Byte Code 時將直接拋出錯誤,因此若要佈署到同一個位置,就必須利用 Self Destruct 來抹去 Nonce 和 Byte Code。
為什麼要 EIP-1014
EIP-1014 在起初是基於 State Channel 的需求,主要是因為某些狀況下可能還沒有要和合約做互動,但需要先知道合約地址。因此只要是需要先知道地址,但沒有要立即使用的合約就十分適合通過這個指令來建立。
例如對於交易所來說,替所有要入金的人建立私鑰有管理上的問題,若透過智能合約則相對有彈性,但卻不是所有申請地址的人都真的會入金,此時就適合利用這個指令先行取得地址,當真的有入金時再佈署合約。
如何使用 EIP-1014
除了直接寫 Opcode 以外,Solidity 0.6.2 加入了利用 create2 建立合約的語法。使用方式是 new Contract{salt: someByte}(...args),其中 new Contract(...args) 就是傳統的佈署方式,而 someByte 是一個 bytes32。
資安疑慮
回到開頭,Etherscan 之所以會標記 Reinit 則是因為可能有資安的疑慮。回顧地址產生的過程,兩個參數都沒有限制條件,因此碰撞的可能也是存在的。如果不肖人士先佈署一個正常的合約,接著通過 Self Destruct 刪除後再佈署假的合約,就可能讓沒注意到的使用者上當。
但或許因為碰撞的機會太低,所以並不太構成問題。而若真的要從使用者的角度防範,可以通過檢查合約有沒有 Self Destruct、Delegate Call、Call Code 指令(如果沒有的話無法刪除合約,再次 create2 時就會被 revert)來避免。
2021/4/23 補充
後來看了幾個討論,也想了一下,資安的疑慮應該遠不只上面這麼簡單。
例如一個宣稱鎖定 ERC-20 代幣的合約,雖然使用者可以檢閱程式碼,並確認其中解鎖 function unlock() 必須在 uint256 block 之後才能執行,並且 block 是無法變更的,但攻擊者可能透過上述方法來消除 block 狀態,進而提前執行 unlock。
參考資料
https://consensys.net/diligence/blog/2019/02/smart-contract-security-newsletter-16-create2-faq/
https://www.chainnews.com/zh-hant/articles/803272341363.htm
如有錯誤敬請指正,原文載於:https://limaois.me/archives/265
EIP-1014 產生可控的智能合約地址 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
byte意思 在 Weifan Chang 張衞帆 Facebook 的最讚貼文
剛看了Dark Soul作曲家Motoi Sakuraba的專訪,有一段很有意思
GS: What kind of research do you need to do for your work?
你為你的工作做了什麼研究?
MS: I do not make any research.
Motoi Sakuraba:我沒有做任何研究
其實我覺得創作上有意思的地方就是這個。創作這件事並沒有什麼明確的邊界和對錯。創作者的經歷和對故事解讀的角度就是創作的本身,而這些部分也許可以用一些技法來代替,我說,運氣好的話。
以我的經歷來說,我覺得很多很棒的創作都非技法的本身,而一種態度、一種角度。這部分不見得研究就可以得到什麼,好好活著,自己把事情想清楚再把想法提出來,這才是最重要的事。
https://www.gamespot.com/…/sound-byte-meet-th…/1100-6337813/
byte意思 在 Lamp Disco Facebook 的最佳解答
6/25這個禮拜六,我們有來自智利的世界冠軍DJ Byte!!別錯過了喔
BTW那時看到他在2015東京的演出後,心想:這人的出頭太多了,無論他有沒有贏都一定要敲來表演,誰知道真的冠軍了,價格立刻三級跳的意思⋯
影片在這,無聊就認真看完它不要滑走,看完你們會懂我的感覺的!
byte意思 在 KB、MB,KiB、MiB都有什么区别?硬盘容量不符竟是这个的 ... 的推薦與評價
Bit、 Byte 、kb、KB、MB,KiB、MiB都有什么区别?硬盘容量不符竟是这个的原因! ... <看更多>
byte意思 在 在Swift 裡頭操作Bytes | zonble 的推薦與評價
bigEndian) { bytes in return String(bytes: Array(bytes), encoding: .ascii) }. 我們就可以得到“fmt?” 這個字串,大概可以當成“format?” 的意思, ... ... <看更多>
byte意思 在 [理工] 計組byte offset定義! - 看板Grad-ProbAsk - 批踢踢實業坊 的推薦與評價
感覺好矛盾,出現(每個區塊X word)時,就沒問題,當出現per block就會有錯,像這
張圖,32 byte per block 32=2^5,offset應該是5吧?結果是2
然後這張標準又變,offset=4
2^4 byte*8=128 bits來算完全沒問題………
明明offset要表達的是一個block有幾個byte,而byte per.block就是這個意思,為何有
時就是會錯啊??
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.9.108.81
※ 文章網址: https://www.ptt.cc/bbs/Grad-ProbAsk/M.1545903847.A.A67.html
※ 編輯: Aa841018 (39.9.108.81), 12/27/2018 17:44:56
... <看更多>