A tutorial contract that detects whether a caller is a contract or an externally owned account.
Historical Significance
An early mainnet demonstration of contract detection via EXTCODESIZE, a pattern that became fundamental to smart contract security.
Context
Deployed in September 2015 during the Frontier era. Distinguishing between contracts and EOAs was a new concept that would later become critical for security patterns like reentrancy guards.
Key Facts
Description
A tutorial contract from Cyrus Adkisson's solidity-baby-steps series (contract #70) that demonstrates how to detect whether the caller is a smart contract or an externally owned account (EOA). Uses EXTCODESIZE to check if an address has code deployed.
Deployed on September 13, 2015. This pattern later became important for security considerations, as contracts and EOAs behave differently in certain contexts.
Source Verified
Exact creation bytecode match. Author Cyrus Adkisson published source at https://github.com/cyrusadkisson/solidity-baby-steps/blob/master/contracts/70_contract_detector.sol. Batch-matched against 357 deploy TXs from deployer 0xcf684dfb8304729355b58315e8019b1aa2ad1bac.
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Frontier Era
The initial release of Ethereum. A bare-bones implementation for technical users.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
// Given an address hash, detect whether it's a contract-type address or a normal one
/***
* _ _ ___ ______ _ _ _____ _ _ _____
* | | | |/ _ \ | ___ \ \ | |_ _| \ | | __ \
* | | | / /_\ \| |_/ / \| | | | | \| | | \/
* | |/\| | _ || /| . ` | | | | . ` | | __
* \ /\ / | | || |\ \| |\ |_| |_| |\ | |_\ \
* \/ \/\_| |_/\_| \_\_| \_/\___/\_| \_/\____/
*
* This contract DOES NOT WORK. It is not currently possible to
* determine whether an address hash is a contract or normal address
* from Solidity. - fivedogit 9/14/2015
*/
contract ContractDetector {
address creator;
string contract_or_normal = "not checked";
function ContractDetector()
{
creator = msg.sender;
}
function testContractOrNormal(address inc_addr)
{
if(inc_addr.call())
contract_or_normal = "normal";
else
contract_or_normal = "contract";
}
function getContractOrNormal(address inc_addr) constant returns (string)
{
return contract_or_normal;
}
/**********
Standard kill() function to recover funds
**********/
function kill()
{
if (msg.sender == creator)
{
suicide(creator); // kills this contract and sends remaining funds back to creator
}
}
}External Links
Related contracts
GetBalance
Same deployerCyrus Adkisson experimental getter (Sep 2015) exposing the ether balance of a hardcoded address via getMyBalance(). Verified byte-for-byte with soljson v0.1.1.
0x759ad4...239a87August 26, 2015Contract 0xddcd64...a08e7b
Same deployerThe greeter tutorial contract: it stores a greeting set at deployment and can be shut down by its owner.
0xddcd64...a08e7bAugust 26, 2015basicInfoGetter
Same deployerA tour of the EVM globals, carrying the constructor of the file it was copied from
0xad826c...d33547August 31, 2015Contract 0x3ea0db...b922e0
Same deployerThe basic info getter from the solidity-baby-steps tutorials, a read only window onto the block and message globals.
0x3ea0db...b922e0August 31, 2015Contract 0xba575c...78733f
Same deployerA contract built to probe what the msg globals actually return, endowed with 5 ETH, deployed 1 September 2015.
0xba575c...78733fSeptember 1, 2015Contract 0x8b180c...c084df
Same deployerA third deployment of the msgExaminer that records its own creation message
0x8b180c...c084dfSeptember 1, 2015