// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract Force { /* MEOW ? /\_/\ / ____/ o o \ /~____ =ø= / (______)__m_m) */ }컨트랙트 하나가 내용도 없이 선언되어 있다.문제는 이 컨트랙트에 잔고를 0보다 크게 만들라는 것이다.해당 컨트랙트에는 fallback함수도 없고 이더를 받는 함수도 없으므로 표면적으로는 불가능해 보인다. 하지만 Solidity에는 selfdestruct라는 얘가 있다.selfdestruct란 아래 공식문서에 나와있듯이 자신의 contract를 파괴하면서 잔고를 target..
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract Delegate { address public owner; constructor(address _owner) { owner = _owner; } function pwn() public { owner = msg.sender; }}contract Delegation { address public owner; Delegate delegate; constructor(address _delegateAddress) { delegate = Delegate(_delegateAddress); owner = msg.se..
// SPDX-License-Identifier: MITpragma solidity ^0.6.0;contract Token { mapping(address => uint256) balances; uint256 public totalSupply; constructor(uint256 _initialSupply) public { balances[msg.sender] = totalSupply = _initialSupply; } function transfer(address _to, uint256 _value) public returns (bool) { require(balances[msg.sender] - _value >= 0); balances[..
코드 자체는 심플하다.// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract Telephone { address public owner; constructor() { owner = msg.sender; } function changeOwner(address _owner) public { if (tx.origin != msg.sender) { owner = _owner; } }}tx.origin 과 msg.sender의 값이 다르면 된다.msg.sender는 그렇다 치고 tx.origin이 뭔지 몰라서 찾아본 결과처음 트랜잭션을 최초로 생성한 계정이 반환된다고 한다...
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract CoinFlip { uint256 public consecutiveWins; uint256 lastHash; uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968; constructor() { consecutiveWins = 0; } function flip(bool _guess) public returns (bool) { uint256 blockValue = uint256(blockhash(block.number - 1)..