之前的文章 Solidity 智能合約 - 工廠模式 (Factory Pattern)Solidity 智能合約 - 地址生成規則說明了工廠模式和地址生成的規則。在了解這些之後我們會發現某些情況可能存在重組的問題,本篇文章將說明這個安全問題,以及解決方式。

重組 (Reorg)

我們這裡只簡略的說明這個現象,簡單說就是區塊打包的結果有可能發生變動,造成原本執行交易的結果發生變化

問題

在工廠模式中採用 create 的地址生成規則的時候,會和執行順序有關。我們考慮以下的模擬情境:

  1. 使用者 A 建立一個多簽錢包 0x1234...
  2. 使用者 A 轉入 ETH 到 0x1234...
  3. 使用者 B 建立一個多簽錢包 0x5678...

由於發生重組,順序改變了:

  1. 使用者 B 建立一個多簽錢包 0x1234...
  2. 使用者 A 建立一個多簽錢包 0x5678...
  3. 使用者 A 轉入 ETH 到 0x1234...

結果使用者 A 的 ETH 跑到使用者 B 建立的 0x1234...

解決方案

等待區塊確認

如同中心化交易所入金一樣,等待足夠多的區塊確認後再進行下一步,使用者 A 可以等一段時間後看最後建立的錢包地址是什麼再進行轉帳。

使用 create2

使用之前文章提到的 create2 相關方法,帶入一個相同的 salt 能夠確保產生固定的地址。上面的例子稍微修改一下:

  1. 使用者 A 用 salt 0xabcd... 建立一個多簽錢包 0x9876...
  2. 使用者 A 轉入 ETH 到 0x9876...
  3. 使用者 B 用 salt 0xdcba... 建立一個多簽錢包 0x5432...

如果發生重組,順序改變了:

  1. 使用者 B 用 salt 0xdcba... 建立一個多簽錢包 0x5432...
  2. 使用者 A 用 salt 0xabcd... 建立一個多簽錢包 0x9876...
  3. 使用者 A 轉入 ETH 到 0x9876...

順序不同不會改變產生的地址。

延伸閱讀

Solidity 智能合約 - 工廠模式 (Factory Pattern)
Solidity 智能合約 - 地址生成規則