Bird
Raised Fist0
Blockchain / Solidityprogramming~5 mins

Diamond pattern (EIP-2535) 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 Diamond pattern (EIP-2535) in blockchain development?
The Diamond pattern (EIP-2535) is a design that allows a smart contract to be split into multiple smaller contracts called facets. This helps manage large contracts by organizing code into pieces that can be added, replaced, or removed without losing data.
Click to reveal answer
beginner
Why is the Diamond pattern useful for smart contracts?
It helps overcome the size limits of smart contracts by splitting code into facets. It also allows upgrading parts of the contract without redeploying everything, making maintenance easier and cheaper.
Click to reveal answer
beginner
What are 'facets' in the Diamond pattern?
Facets are smaller contracts that hold specific functions. The Diamond contract delegates calls to these facets, allowing modular and flexible contract design.
Click to reveal answer
intermediate
How does the Diamond pattern handle function calls?
The Diamond contract uses a fallback function to forward calls to the correct facet based on the function selector. This way, it acts like a router sending requests to the right place.
Click to reveal answer
intermediate
What is the role of the 'diamondCut' function in EIP-2535?
The 'diamondCut' function manages adding, replacing, or removing facets and their functions. It updates the diamond's function selector mappings to control which facet handles which function.
Click to reveal answer
What problem does the Diamond pattern (EIP-2535) primarily solve?
AIncreasing transaction speed on blockchain
BManaging large smart contracts by splitting them into facets
CEncrypting smart contract data
DReducing gas fees by removing functions
In the Diamond pattern, what is a 'facet'?
AA small contract containing specific functions
BA type of blockchain node
CA user interface for smart contracts
DA token standard
How does the Diamond contract know which facet to call for a function?
AIt randomly picks a facet
BIt stores all code in one place
CIt calls all facets simultaneously
DIt uses a fallback function with function selectors
What does the 'diamondCut' function do?
AAdds, replaces, or removes facets and their functions
BMines new blocks
CEncrypts contract data
DTransfers tokens
Which of these is NOT a benefit of the Diamond pattern?
AAllows contract upgrade without losing data
BSplits contract code into manageable parts
CAutomatically increases blockchain speed
DReduces deployment costs for large contracts
Explain the Diamond pattern (EIP-2535) and how it helps manage smart contracts.
Think about how big contracts can be broken into smaller pieces.
You got /3 concepts.
    Describe the role of the 'diamondCut' function in the Diamond pattern.
    It's like the control center for managing facets.
    You got /3 concepts.

      Practice

      (1/5)
      1.

      What is the main purpose of the Diamond pattern (EIP-2535) in blockchain smart contracts?

      easy
      A. To split a large contract into smaller, manageable facets
      B. To increase the gas cost of contract deployment
      C. To prevent any contract upgrades
      D. To combine multiple unrelated contracts into one

      Solution

      1. Step 1: Understand the Diamond pattern concept

        The Diamond pattern divides a big contract into smaller parts called facets to organize code better.
      2. Step 2: Identify the main benefit

        This splitting allows easier upgrades and management of smart contracts.
      3. Final Answer:

        To split a large contract into smaller, manageable facets -> Option A
      4. Quick Check:

        Diamond pattern = splitting contract into facets [OK]
      Hint: Remember: Diamond pattern breaks big contracts into smaller parts [OK]
      Common Mistakes:
      • Thinking it prevents upgrades
      • Assuming it increases deployment cost
      • Confusing it with contract merging
      2.

      Which of the following is the correct Solidity syntax to declare a facet interface in the Diamond pattern?

      interface IFacet {
          function myFunction() external;
      }
      easy
      A. contract IFacet { function myFunction() public {} }
      B. interface IFacet { function myFunction() external; }
      C. library IFacet { function myFunction() internal; }
      D. struct IFacet { function myFunction() external; }

      Solution

      1. Step 1: Identify correct Solidity declaration for interface

        Interfaces use the keyword interface and declare functions without bodies.
      2. Step 2: Match function visibility and syntax

        Function in interface must be external and end with a semicolon, no body.
      3. Final Answer:

        interface IFacet { function myFunction() external; } -> Option B
      4. Quick Check:

        Interface syntax = interface IFacet { function myFunction() external; } [OK]
      Hint: Interfaces have no function bodies and use 'external' functions [OK]
      Common Mistakes:
      • Using contract instead of interface
      • Adding function bodies in interface
      • Using wrong visibility like public or internal
      3.

      Given the following Solidity snippet using the Diamond pattern, what will be the output when calling diamond.facetFunction()?

      contract FacetA {
          function facetFunction() external pure returns (string memory) {
              return "Facet A called";
          }
      }
      
      contract Diamond {
          FacetA facetA;
          constructor() {
              facetA = new FacetA();
          }
          function facetFunction() external view returns (string memory) {
              return facetA.facetFunction();
          }
      }
      medium
      A. "Facet A called"
      B. Compilation error due to missing function
      C. "Diamond called"
      D. Runtime error: function not found

      Solution

      1. Step 1: Understand contract interaction

        The Diamond contract creates an instance of FacetA and calls its facetFunction.
      2. Step 2: Trace the function call and return value

        Calling diamond.facetFunction() returns the string from FacetA: "Facet A called".
      3. Final Answer:

        "Facet A called" -> Option A
      4. Quick Check:

        Diamond calls FacetA function = "Facet A called" [OK]
      Hint: Diamond delegates calls to facets returning their outputs [OK]
      Common Mistakes:
      • Assuming Diamond returns its own string
      • Expecting compilation error due to delegation
      • Confusing runtime errors with correct delegation
      4.

      Identify the error in this simplified Diamond pattern Solidity code snippet:

      contract Diamond {
          mapping(bytes4 => address) public facets;
      
          function addFacet(bytes4 selector, address facetAddress) public {
              facets[selector] = facetAddress;
          }
      
          fallback() external {
              address facet = facets[msg.sig];
              (bool success, ) = facet.delegatecall(msg.data);
              require(success, "Delegatecall failed");
          }
      }
      medium
      A. Using delegatecall instead of call
      B. Fallback function must be external payable
      C. Mapping key type should be bytes32, not bytes4
      D. Missing return statement in fallback function

      Solution

      1. Step 1: Analyze fallback function behavior

        The fallback uses delegatecall but does not return data to the caller.
      2. Step 2: Identify missing return data forwarding

        Delegatecall returns data that must be returned by fallback to preserve call behavior.
      3. Final Answer:

        Missing return statement in fallback function -> Option D
      4. Quick Check:

        Fallback must return delegatecall data [OK]
      Hint: Fallback must return delegatecall results to caller [OK]
      Common Mistakes:
      • Ignoring return data in fallback
      • Confusing delegatecall with call
      • Assuming payable is mandatory for fallback
      5.

      You want to upgrade a Diamond contract by adding a new facet with a function selector that already exists in another facet. What will happen if you do not remove the old selector before adding the new one?

      hard
      A. The Diamond will route calls to the new facet for that selector
      B. The Diamond will have two facets for the same selector causing ambiguity
      C. The old facet's function will still be called, ignoring the new one
      D. The contract will fail to compile due to duplicate selectors

      Solution

      1. Step 1: Understand selector uniqueness in Diamond pattern

        Each function selector maps to exactly one facet address in the Diamond.
      2. Step 2: Analyze what happens when adding duplicate selectors

        If you add a selector without removing the old one, the mapping still points to the old facet, so calls route there.
      3. Final Answer:

        The old facet's function will still be called, ignoring the new one -> Option C
      4. Quick Check:

        Duplicate selector without removal = old facet called [OK]
      Hint: Remove old selector before adding new to update facet [OK]
      Common Mistakes:
      • Assuming Diamond supports multiple facets per selector
      • Expecting compile-time errors for duplicates
      • Thinking new facet automatically overrides old without removal