Solidity 智能合約 - 工廠模式的重組問題 (Reorg)
之前的文章 Solidity 智能合約 - 工廠模式 (Factory Pattern) 和 Solidity 智能合約 - 地址生成規則說明了工廠模式和地址生成的規則。在了解這些之後我們會發現某些情況可能存在重組的問題,本篇文章將說明這個安全問題,以及解決方式。
重組 (Reorg)
我們這裡只簡略的說明這個現象,簡單說就是區塊打包的結果有可能發生變動,造成原本執行交易的結果發生變化
問題
在工廠模式中採用 create
的地址生成規則的時候,會和執行順序有關。我們考慮以下的模擬情境:
- 使用者 A 建立一個多簽錢包
0x1234...
。 - 使用者 A 轉入 ETH 到
0x1234...
。 - 使用者 B 建立一個多簽錢包
0x5678...
。
由於發生重組,順序改變了:
- 使用者 B 建立一個多簽錢包
0x1234...
。 - 使用者 A 建立一個多簽錢包
0x5678...
。 - 使用者 A 轉入 ETH 到
0x1234...
。
結果使用者 A 的 ETH 跑到使用者 B 建立的 0x1234...
解決方案
等待區塊確認
如同中心化交易所入金一樣,等待足夠多的區塊確認後再進行下一步,使用者 A 可以等一段時間後看最後建立的錢包地址是什麼再進行轉帳。
使用 create2
使用之前文章提到的 create2
相關方法,帶入一個相同的 salt 能夠確保產生固定的地址。上面的例子稍微修改一下:
- 使用者 A 用 salt
0xabcd...
建立一個多簽錢包0x9876...
。 - 使用者 A 轉入 ETH 到
0x9876...
。 - 使用者 B 用 salt
0xdcba...
建立一個多簽錢包0x5432...
。
如果發生重組,順序改變了:
- 使用者 B 用 salt
0xdcba...
建立一個多簽錢包0x5432...
。 - 使用者 A 用 salt
0xabcd...
建立一個多簽錢包0x9876...
。 - 使用者 A 轉入 ETH 到
0x9876...
。
順序不同不會改變產生的地址。
延伸閱讀
Solidity 智能合約 - 工廠模式 (Factory Pattern)
Solidity 智能合約 - 地址生成規則
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 小殘的程式光廊!
Comment