Bird
Raised Fist0
Blockchain / Solidityprogramming~5 mins

Accounts (EOA vs contract accounts) in Blockchain / Solidity - Quick Revision & Key Differences

Choose your learning style10 modes available
Recall & Review
beginner
What is an Externally Owned Account (EOA) in blockchain?
An Externally Owned Account (EOA) is a blockchain account controlled by a private key. It can send transactions, hold cryptocurrency, and initiate actions on the blockchain.
Click to reveal answer
beginner
What is a Contract Account in blockchain?
A Contract Account is a blockchain account controlled by code (smart contract). It cannot initiate transactions but can execute code when triggered by EOAs or other contracts.
Click to reveal answer
intermediate
How does an EOA differ from a Contract Account?
EOAs are controlled by private keys and can initiate transactions. Contract Accounts are controlled by code and only execute when called by EOAs or other contracts.
Click to reveal answer
beginner
Can Contract Accounts hold cryptocurrency?
Yes, Contract Accounts can hold cryptocurrency and manage it according to their programmed rules in the smart contract code.
Click to reveal answer
beginner
Who controls the actions of an EOA?
The owner of the private key controls the actions of an EOA, including sending transactions and interacting with contracts.
Click to reveal answer
Which account type can initiate transactions on the blockchain?
AContract Account
BExternally Owned Account (EOA)
CBoth EOA and Contract Account
DNeither
What controls a Contract Account?
ASmart contract code
BBlockchain miner
CUser password
DPrivate key
Can a Contract Account send transactions by itself?
AOnly when triggered by an EOA or another contract
BYes, anytime
CNo, never
DOnly if it has a private key
Which account type holds the private key?
AContract Account
BNeither
CBoth
DExternally Owned Account (EOA)
What happens when an EOA sends a transaction to a Contract Account?
AThe contract code executes
BThe contract account sends a transaction back
CNothing happens
DThe EOA loses its private key
Explain the main differences between an Externally Owned Account (EOA) and a Contract Account.
Think about who controls each account and how they interact with the blockchain.
You got /4 concepts.
    Describe how a Contract Account operates when it receives a transaction from an EOA.
    Focus on what happens inside the contract after receiving a transaction.
    You got /4 concepts.

      Practice

      (1/5)
      1. Which of the following best describes an Externally Owned Account (EOA) on a blockchain?
      easy
      A. An account that can only receive tokens but not send them.
      B. An account that only stores data but cannot send transactions.
      C. An account that automatically executes code when called.
      D. An account controlled by a private key, used by people to send transactions.

      Solution

      1. Step 1: Understand what an EOA is

        An EOA is controlled by a private key and represents a user or person on the blockchain.
      2. Step 2: Identify EOA capabilities

        EOAs can send transactions and initiate actions, unlike contract accounts which run code.
      3. Final Answer:

        An account controlled by a private key, used by people to send transactions. -> Option D
      4. Quick Check:

        EOA = user-controlled account [OK]
      Hint: EOAs are user accounts with private keys [OK]
      Common Mistakes:
      • Confusing EOAs with contract accounts
      • Thinking EOAs run code automatically
      • Believing EOAs cannot send transactions
      2. Which syntax correctly represents a contract account address in Solidity?
      easy
      A. address payable contractAddr = 0x1234567890abcdef1234567890abcdef12345678;
      B. contractAddr = '0x1234567890abcdef1234567890abcdef12345678';
      C. address contractAddr = 1234567890abcdef1234567890abcdef12345678;
      D. address contractAddr = 0xGHIJKL7890abcdef1234567890abcdef12345678;

      Solution

      1. Step 1: Check Solidity address syntax

        Addresses must be hexadecimal starting with 0x and enclosed in proper type declaration.
      2. 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.
      3. Final Answer:

        address payable contractAddr = 0x1234567890abcdef1234567890abcdef12345678; -> Option A
      4. Quick Check:

        Valid Solidity address syntax = address payable contractAddr = 0x1234567890abcdef1234567890abcdef12345678; [OK]
      Hint: Solidity addresses start with 0x and use 'address' type [OK]
      Common Mistakes:
      • Omitting 0x prefix
      • Using invalid hex characters
      • Assigning address as a plain string without type
      3. Consider the following Solidity code snippet:
      address sender = msg.sender;
      bool isContract = sender.code.length > 0;

      What does isContract indicate?
      medium
      A. True if sender is an EOA, false if contract.
      B. True if sender is a contract account, false if EOA.
      C. Always true because msg.sender is a contract.
      D. Always false because msg.sender has no code.

      Solution

      1. Step 1: Understand msg.sender.code.length

        This checks the length of the code at the sender's address; contracts have code, EOAs do not.
      2. Step 2: Interpret the boolean value

        If code length > 0, sender is a contract account; otherwise, it's an EOA.
      3. Final Answer:

        True if sender is a contract account, false if EOA. -> Option B
      4. Quick Check:

        Code length > 0 means contract [OK]
      Hint: Check code length to distinguish contract vs EOA [OK]
      Common Mistakes:
      • Assuming msg.sender is always EOA
      • Confusing code length meaning
      • Thinking EOAs have code
      4. You have this Solidity function:
      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?
      medium
      A. The recipient address is not payable, so transfer fails.
      B. EOA addresses cannot receive ether.
      C. The function lacks the payable modifier.
      D. transfer() only works with contract accounts.

      Solution

      1. Step 1: Understand transfer() requirements

        transfer() requires the recipient address to be payable to receive ether.
      2. Step 2: Analyze recipient type

        If recipient is declared as address (not address payable), transfer will fail even if it's an EOA.
      3. Final Answer:

        The recipient address is not payable, so transfer fails. -> Option A
      4. Quick Check:

        Use address payable for ether transfers [OK]
      Hint: Use address payable to send ether [OK]
      Common Mistakes:
      • Thinking EOAs can't receive ether
      • Missing payable keyword on function
      • Assuming transfer only works with contracts
      5. You want to write a Solidity function that sends 1 ether only if the recipient is an EOA (not a contract). Which code snippet correctly implements this check?
      hard
      A. require(recipient.balance > 0, "Recipient must have balance"); recipient.transfer(1 ether);
      B. require(recipient.code.length > 0, "Recipient must be contract"); payable(recipient).transfer(1 ether);
      C. require(recipient.code.length == 0, "Recipient must be EOA"); payable(recipient).transfer(1 ether);
      D. require(msg.sender == recipient, "Sender must be recipient"); recipient.transfer(1 ether);

      Solution

      1. Step 1: Check recipient code length to identify EOA

        EOAs have no code, so recipient.code.length == 0 confirms EOA.
      2. Step 2: Use require to enforce condition and transfer ether

        If recipient is EOA, convert to payable and transfer 1 ether safely.
      3. Final Answer:

        require(recipient.code.length == 0, "Recipient must be EOA"); payable(recipient).transfer(1 ether); -> Option C
      4. Quick Check:

        Code length 0 means EOA, then transfer [OK]
      Hint: Check code length == 0 to confirm EOA before sending [OK]
      Common Mistakes:
      • Checking for code length > 0 to find EOAs
      • Not converting address to payable before transfer
      • Using balance check instead of code length
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard