Accounts are how we identify who owns or controls assets on a blockchain. There are two main types: Externally Owned Accounts (EOA) controlled by people, and Contract Accounts controlled by code.
Accounts (EOA vs contract accounts) in Blockchain / Solidity
EOA: Controlled by a private key, can send transactions. Contract Account: Has code, executes functions when called.
EOAs require a private key to sign transactions.
Contract accounts cannot initiate transactions themselves; they respond to calls.
// Example of an EOA sending Ether
web3.eth.sendTransaction({from: eoaAddress, to: recipientAddress, value: amount});// Deploying a contract account
const contract = new web3.eth.Contract(abi);
contract.deploy({data: bytecode}).send({from: eoaAddress});// Calling a function on a contract account
contract.methods.myFunction().send({from: eoaAddress});This program connects to the Ethereum blockchain, checks the balance of an EOA, and detects if a contract account exists at another address by checking for code.
// Simple example in JavaScript using web3.js async function example() { const Web3 = require('web3'); const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_PROJECT_ID'); // EOA address example const eoaAddress = '0xYourEOAAddress'; // Contract account address example const contractAddress = '0xYourContractAddress'; // Check balance of EOA const eoaBalance = await web3.eth.getBalance(eoaAddress); console.log(`EOA balance: ${web3.utils.fromWei(eoaBalance, 'ether')} ETH`); // Check if contract code exists at contract address const code = await web3.eth.getCode(contractAddress); if (code === '0x' || code === '0x0') { console.log('No contract found at this address.'); } else { console.log('Contract account detected at this address.'); } } example();
EOAs are controlled by private keys and can send transactions directly.
Contract accounts contain code and can only act when triggered by transactions from EOAs or other contracts.
Checking if an address is a contract can be done by checking if code exists at that address.
There are two main account types: EOAs (people) and contract accounts (code).
EOAs send transactions; contract accounts run code when called.
Understanding the difference helps you interact correctly with blockchain applications.
Practice
Solution
Step 1: Understand what an EOA is
An EOA is controlled by a private key and represents a user or person on the blockchain.Step 2: Identify EOA capabilities
EOAs can send transactions and initiate actions, unlike contract accounts which run code.Final Answer:
An account controlled by a private key, used by people to send transactions. -> Option DQuick Check:
EOA = user-controlled account [OK]
- Confusing EOAs with contract accounts
- Thinking EOAs run code automatically
- Believing EOAs cannot send transactions
Solution
Step 1: Check Solidity address syntax
Addresses must be hexadecimal starting with 0x and enclosed in proper type declaration.Step 2: Validate each option
The declaration 'address payable contractAddr = 0x1234567890abcdef1234567890abcdef12345678;' uses correct type and hex format. String assignments without type declaration are invalid, missing 0x prefix fails, and invalid hex characters like 'GHI' are not allowed.Final Answer:
address payable contractAddr = 0x1234567890abcdef1234567890abcdef12345678; -> Option AQuick Check:
Valid Solidity address syntax = address payable contractAddr = 0x1234567890abcdef1234567890abcdef12345678; [OK]
- Omitting 0x prefix
- Using invalid hex characters
- Assigning address as a plain string without type
address sender = msg.sender; bool isContract = sender.code.length > 0;
What does
isContract indicate?Solution
Step 1: Understand
This checks the length of the code at the sender's address; contracts have code, EOAs do not.msg.sender.code.lengthStep 2: Interpret the boolean value
If code length > 0, sender is a contract account; otherwise, it's an EOA.Final Answer:
True ifsenderis a contract account, false if EOA. -> Option BQuick Check:
Code length > 0 means contract [OK]
- Assuming
msg.senderis always EOA - Confusing code length meaning
- Thinking EOAs have code
function sendEther(address recipient) public {
recipient.transfer(1 ether);
}When calling this function with an EOA address, it fails with an error. What is the likely cause?
Solution
Step 1: Understand transfer() requirements
transfer() requires the recipient address to be payable to receive ether.Step 2: Analyze recipient type
If recipient is declared asaddress(notaddress payable), transfer will fail even if it's an EOA.Final Answer:
The recipient address is not payable, so transfer fails. -> Option AQuick Check:
Useaddress payablefor ether transfers [OK]
- Thinking EOAs can't receive ether
- Missing payable keyword on function
- Assuming transfer only works with contracts
Solution
Step 1: Check recipient code length to identify EOA
EOAs have no code, sorecipient.code.length == 0confirms EOA.Step 2: Use require to enforce condition and transfer ether
If recipient is EOA, convert to payable and transfer 1 ether safely.Final Answer:
require(recipient.code.length == 0, "Recipient must be EOA"); payable(recipient).transfer(1 ether); -> Option CQuick Check:
Code length 0 means EOA, then transfer [OK]
- Checking for code length > 0 to find EOAs
- Not converting address to payable before transfer
- Using balance check instead of code length
Ready to prove it?
Pass the test and this pattern moves unknown
