Bird
Raised Fist0
Blockchain / Solidityprogramming~5 mins

Proxy pattern (upgradeable contracts) in Blockchain / Solidity - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is the Proxy pattern in upgradeable contracts?
The Proxy pattern is a design that separates contract logic from data storage. It uses a proxy contract to forward calls to a logic contract, allowing the logic to be upgraded without changing the contract address.
Click to reveal answer
beginner
Why do upgradeable contracts use a proxy?
Because blockchain contracts are immutable, a proxy allows changing the logic by pointing to a new implementation contract, while keeping the same address and stored data.
Click to reveal answer
beginner
What is the role of the implementation contract in the Proxy pattern?
The implementation contract contains the actual business logic and functions. The proxy delegates calls to it while storing the data itself.
Click to reveal answer
intermediate
How does the proxy forward calls to the implementation contract?
The proxy uses a special low-level function called 'delegatecall' to execute the implementation's code in the proxy's context, preserving storage and address.
Click to reveal answer
intermediate
What is a common risk when using the Proxy pattern in upgradeable contracts?
Incorrect storage layout between proxy and implementation can cause data corruption. Also, malicious upgrades can change logic unexpectedly.
Click to reveal answer
What does the proxy contract store in upgradeable contracts?
AOnly the contract data
BNeither logic nor data
CBoth logic and data
DOnly the contract logic
Which function is used by the proxy to execute the implementation's code?
Atransfer
Bsend
Ccall
Ddelegatecall
Why is the Proxy pattern important for upgradeable contracts?
AIt prevents any changes to the contract
BIt allows changing the contract address
CIt allows changing the contract logic without changing the address
DIt stores all contract data off-chain
What can happen if storage layouts differ between proxy and implementation?
AData corruption or unexpected behavior
BThe contract will run faster
CThe proxy will ignore the implementation
DThe implementation will be deleted
Which of these is NOT a component of the Proxy pattern?
AProxy contract
BStorage contract
CImplementation contract
DDelegatecall mechanism
Explain how the Proxy pattern enables contract upgrades on blockchain.
Think about separating data and logic and how calls are forwarded.
You got /4 concepts.
    Describe the risks involved in using the Proxy pattern for upgradeable contracts.
    Consider what can go wrong if data or logic changes unexpectedly.
    You got /4 concepts.

      Practice

      (1/5)
      1.

      What is the main purpose of using the Proxy pattern in smart contracts?

      easy
      A. To upgrade contract logic without changing the contract address
      B. To reduce gas fees by optimizing code
      C. To create multiple copies of the same contract
      D. To prevent any changes to the contract after deployment

      Solution

      1. Step 1: Understand the Proxy pattern role

        The Proxy pattern allows a contract to forward calls to another contract, enabling upgrades.
      2. Step 2: Identify the main benefit

        This forwarding lets you change the logic contract without changing the proxy's address.
      3. Final Answer:

        To upgrade contract logic without changing the contract address -> Option A
      4. Quick Check:

        Proxy pattern = Upgrade logic without address change [OK]
      Hint: Proxy pattern upgrades logic, keeps address same [OK]
      Common Mistakes:
      • Thinking proxy reduces gas fees
      • Believing proxy creates contract copies
      • Assuming proxy prevents all changes
      2.

      Which Solidity keyword is used inside a proxy contract to forward calls to the implementation contract?

      easy
      A. delegatecall
      B. call
      C. transfer
      D. send

      Solution

      1. Step 1: Recall Solidity call types

        Solidity has several low-level calls: call, delegatecall, send, transfer.
      2. Step 2: Identify forwarding call for proxy

        Proxy contracts use delegatecall to run implementation code in proxy's context.
      3. Final Answer:

        delegatecall -> Option A
      4. Quick Check:

        Proxy forwarding uses delegatecall [OK]
      Hint: Proxy uses delegatecall to keep storage context [OK]
      Common Mistakes:
      • Confusing call with delegatecall
      • Using transfer or send which are for Ether
      • Not knowing delegatecall preserves storage
      3.

      Consider this simplified proxy contract snippet in Solidity:

      contract Proxy {
          address implementation;
          
          fallback() external payable {
              (bool success, ) = implementation.delegatecall(msg.data);
              require(success);
          }
      }

      What happens if implementation address is zero?

      medium
      A. The contract will self-destruct
      B. The call will succeed but do nothing
      C. The fallback function will be ignored
      D. The call will fail and revert the transaction

      Solution

      1. Step 1: Understand delegatecall to zero address

        Calling delegatecall on address zero means no code to execute.
      2. Step 2: Effect of delegatecall failure

        delegatecall returns false on failure; require(success) then reverts transaction.
      3. Final Answer:

        The call will fail and revert the transaction -> Option D
      4. Quick Check:

        delegatecall to zero address = revert [OK]
      Hint: delegatecall to zero address always fails [OK]
      Common Mistakes:
      • Assuming call succeeds silently
      • Thinking fallback is skipped
      • Believing contract self-destructs
      4.

      Identify the bug in this proxy upgrade function:

      function upgradeTo(address newImplementation) public {
          implementation = newImplementation;
      }

      What is the main issue?

      medium
      A. Implementation address is not validated
      B. Missing event emission after upgrade
      C. No access control, anyone can upgrade implementation
      D. Function should be external, not public

      Solution

      1. Step 1: Check function access control

        The function is public, so anyone can call it and change implementation.
      2. Step 2: Understand security risk

        Without restricting access, attackers can hijack the contract logic.
      3. Final Answer:

        No access control, anyone can upgrade implementation -> Option C
      4. Quick Check:

        Upgrade function needs access control [OK]
      Hint: Always restrict upgrade function access [OK]
      Common Mistakes:
      • Ignoring access control importance
      • Focusing only on event emission
      • Thinking public vs external affects security
      5.

      You want to upgrade a proxy contract to a new implementation that adds a new state variable. What must you ensure to avoid breaking storage layout?

      hard
      A. Rearrange all variables in the new implementation for optimization
      B. Add new variables only at the end of existing storage variables
      C. Remove unused variables from the old implementation
      D. Change variable types to reduce storage size

      Solution

      1. Step 1: Understand storage layout importance

        Proxy pattern requires storage layout consistency between implementations.
      2. Step 2: Correct way to add variables

        New variables must be appended to avoid overwriting existing storage slots.
      3. Final Answer:

        Add new variables only at the end of existing storage variables -> Option B
      4. Quick Check:

        Storage layout consistency = append variables [OK]
      Hint: Append new variables to preserve storage layout [OK]
      Common Mistakes:
      • Rearranging variables breaks storage
      • Removing old variables causes data loss
      • Changing types shifts storage slots