合約創建者建立了一個非常簡單的代幣工廠合約。任何人都可以輕鬆創建新的代幣。在部署第一個代幣合約後,創建者發送了 0.001 以太幣以獲得更多代幣。他們從此失去了合約地址。
如果您可以從遺失的合約地址中恢復(或刪除)0.001 以太幣,即完成該挑戰。
題目給了一個創建代幣的工廠合約,並在創建後轉入 0.001 ETH,現在要求你將代幣合約的 0.001 轉回來,但是不知道代幣合約的地址。
看一下代幣的合約 SimpleToken
,可以轉出的方式有兩種:
transfer(address _to, uint256 _amount)
function destroy(address payable _to)
第 1 種方式只能轉出 msg.sender
的代幣,不符合現在的情境。所以只能呼叫合約自毀,為此我們必須找到代幣合約的地址。
這裡考的是創建合約時的地址生成方式,詳細可以參考以下幾篇,都有清楚的說明:
接下來就是計算合約生成地址,address 就是關卡產生的實例地址,nonce 的話則是 1(如果是 EOA 就是從 0 開始計算,合約生成合約是從 1 開始,因為自己生成時 nonce 就已經 +1 了)。
參數確定後代入地址生成的函數:
這裡 RLP_encode()
在 solidity 中沒有辦法直接呼叫指令計算(應該是有 Library,但我沒有找),我找了別人寫好的 code 來計算,如果想瞭解 RLP 的計算方式可以參考以下幾篇:
開始實作攻擊合約
RLP_encode()
(17-30行)其實除了自己計算合約地址之外,也可以透過 EtherScan (sepolia) 直接找到,畢竟區塊鏈的特色就是所有行為都會被記錄在鏈上。在 EtherScan (sepolia) 輸入關卡地址,找到創建合約的那筆交易紀錄並查看接收方的地址,就可以找到代幣合約的地址了