Chainhunters
CREATE2
?Normaal gesproken wordt het adres van een smart contract bepaald door:
new_address = hash(sender, nonce)
Maar bij CREATE2
wordt het contractadres op voorhand berekend met deze formule:
new_address = keccak256(0xFF, sender, salt, bytecode)
Waarbij:
0xFF
→ Een vaste byte om botsingen te voorkomen.deployer
→ Het adres van de factory die het contract maakt.salt
→ Een willekeurig getal gekozen door de deployer (zorgt ervoor dat verschillende contracten met dezelfde code toch unieke adressen kunnen krijgen).keccak256(bytecode)
→ De hash van de contractcode zelf.Voordelen van CREATE2
:
Maar… dit opent ook de deur voor oplichters!
Werkwijze:
CREATE2
.CREATE2
met een verborgen backdoor, zoals een 100% verkoopbelasting of een eigenaar die alle tokens kan confisqueren.Codevoorbeeld van een Factory Contract die dit mogelijk maakt:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Factory { function deployChild(uint256 _salt) public returns (address) { bytes memory bytecode = type(Child).creationCode; address childAddress; assembly { childAddress := create2(0, add(bytecode, 32), mload(bytecode), _salt) } require(childAddress != address(0), "Failed to deploy"); return childAddress; } function computeChildAddress(uint256 _salt) public view returns (address) { bytes memory bytecode = type(Child).creationCode; bytes32 hash = keccak256( abi.encodePacked(bytes1(0xff), address(this), _salt, keccak256(bytecode)) ); return address(uint160(uint256(hash))); } }
Waarom werkt dit?
CREATE2
kan op een later moment nieuwe code deployen op datzelfde adres!Werkwijze:
CREATE2
.Waarom werkt dit?
** Werkwijze:**
approve
) aan dit adres om hun tokens te laten traden.transferFrom()
exploit.Codevoorbeeld van een scam-token die goedgekeurde funds rooft:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract EvilToken { function stealFunds(IERC20 token, address victim) public { uint256 amount = token.allowance(victim, address(this)); token.transferFrom(victim, msg.sender, amount); } }
Waarom werkt dit?
approve
op een adres, maar de code op dat adres kan later malafide zijn!transferFrom()
om alles te stelen zodra het live gaat.Check of een contract via CREATE2
is gemaakt.
Gebruik "revocable approvals".
Vertrouw nooit een contract dat alleen een adres deelt.
Check of het contract net is gedeployed voordat je ermee interactie hebt.
CREATE2
is een krachtig hulpmiddel voor innovatieve use-cases zoals wallet-upgrades en Layer 2-scaling. Maar omdat het contractadressen vooraf voorspelbaar maakt, kunnen oplichters dit dus gebruiken om:
CREATE2
een scam-versie te deployen.CREATE2
een contract te deployen die later een selfdestruct
bevat. Dit is wel deprecated, maar nog wel een mogelijkheid.Door bewust te zijn van deze methodes en altijd de volledige contract te checken, kun je voorkomen dat je slachtoffer wordt van een CREATE2
scam.