Bird
Raised Fist0
Blockchain / Solidityprogramming~10 mins

Function modifiers in Blockchain / Solidity - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Function modifiers
Call function
↓
Enter modifier code
↓
Run pre-function checks or code
↓
Execute function body
↓
Run post-function code if any
↓
Return result or finish
When a function with a modifier is called, the modifier code runs first, then the function body, then any post-code in the modifier.
Execution Sample
Blockchain / Solidity
modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _;
}

function changeOwner(address newOwner) public onlyOwner {
    owner = newOwner;
}
This code uses a modifier to check if the caller is the owner before changing ownership.
Execution Table
StepActionEvaluationResult
1Call changeOwner with msg.sender = 0x123Enter onlyOwner modifierProceed to require check
2Check require(msg.sender == owner)msg.sender == 0x123, owner == 0xabcFalse, revert with 'Not owner'
3Call changeOwner with msg.sender = 0xabcEnter onlyOwner modifierProceed to require check
4Check require(msg.sender == owner)msg.sender == 0xabc, owner == 0xabcTrue, continue
5Execute function body: owner = newOwnernewOwner = 0xdefowner updated to 0xdef
6Function endsReturn successOwnership changed
💡 Execution stops if require condition fails; otherwise function completes normally.
Variable Tracker
VariableStartAfter Step 5Final
owner0xabc0xdef0xdef
msg.sendervariesvariesvaries
Key Moments - 2 Insights
Why does the function stop when msg.sender is not the owner?
Because the require statement in the modifier fails (see step 2 in execution_table), it reverts the transaction and stops execution before the function body runs.
What does the underscore (_) mean in the modifier?
The underscore marks where the function body runs inside the modifier. Before it runs, pre-checks happen; after it runs, post-code can run.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what happens at step 2 when msg.sender is not the owner?
AThe function continues to execute
BThe require check passes
CThe transaction reverts with 'Not owner'
DThe owner variable is updated
💡 Hint
Check the 'Evaluation' and 'Result' columns at step 2 in execution_table
At which step does the owner variable get updated?
AStep 4
BStep 5
CStep 2
DStep 6
💡 Hint
Look at the 'Action' and 'Result' columns in execution_table for when owner changes
If the underscore (_) was removed from the modifier, what would happen?
AThe function body would not run
BThe require check would be skipped
CThe function would run twice
DThe modifier would have no effect
💡 Hint
Recall that underscore (_) indicates where the function body runs inside the modifier
Concept Snapshot
Function modifiers run code before and/or after a function.
Use '_' inside modifier to mark function body location.
Common for access control like 'onlyOwner'.
If modifier code fails (e.g. require), function stops.
Modifiers help reuse checks and logic cleanly.
Full Transcript
Function modifiers in blockchain let you run extra code before or after a function runs. When you call a function with a modifier, the modifier code runs first. It can check conditions like if the caller is the owner. The underscore (_) in the modifier shows where the function's main code runs. If a check fails, like require(msg.sender == owner), the function stops immediately and reverts. This helps keep your code safe and clean by reusing checks in many functions.

Practice

(1/5)
1. What is the main purpose of a function modifier in blockchain smart contracts?
easy
A. To change the return type of a function
B. To add extra rules or checks around a function
C. To rename a function
D. To delete a function from the contract

Solution

  1. Step 1: Understand function modifiers

    Function modifiers are used to add extra rules or steps before or after a function runs.
  2. Step 2: Compare options

    Only To add extra rules or checks around a function correctly describes adding extra rules or checks around a function.
  3. Final Answer:

    To add extra rules or checks around a function -> Option B
  4. Quick Check:

    Function modifiers add rules [OK]
Hint: Modifiers add rules or checks around functions [OK]
Common Mistakes:
  • Thinking modifiers rename or delete functions
  • Confusing modifiers with return type changes
  • Believing modifiers execute functions themselves
2. Which of the following is the correct syntax to define a function modifier in Solidity?
easy
A. modifier onlyOwner() => { require(msg.sender == owner); _; }
B. modifier onlyOwner() : { require(msg.sender == owner); _; }
C. modifier onlyOwner() -> { require(msg.sender == owner); _; }
D. modifier onlyOwner() { require(msg.sender == owner); _; }

Solution

  1. Step 1: Recall Solidity modifier syntax

    Modifiers use the keyword 'modifier', name, parentheses, and curly braces with '_;' inside.
  2. Step 2: Identify correct syntax

    modifier onlyOwner() { require(msg.sender == owner); _; } matches the correct Solidity syntax with braces and '_;'. Others use invalid symbols like '=>', '->', or ':'.
  3. Final Answer:

    modifier onlyOwner() { require(msg.sender == owner); _; } -> Option D
  4. Quick Check:

    Modifier syntax uses braces and '_;' [OK]
Hint: Modifiers use braces { } and _; inside [OK]
Common Mistakes:
  • Using arrows (=>, ->) instead of braces
  • Omitting the '_;' statement
  • Using colon ':' instead of braces
3. What will be the output of the following Solidity code snippet?
contract Test {
    address owner;
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }
    function setOwner(address _owner) public {
        owner = _owner;
    }
    function secureAction() public onlyOwner {
        // action code
    }
}
If msg.sender is not the owner and calls secureAction(), what happens?
medium
A. The function runs normally
B. The owner address changes
C. The transaction reverts with error 'Not owner'
D. The function ignores the modifier

Solution

  1. Step 1: Understand the modifier behavior

    The modifier checks if msg.sender equals owner; if not, it calls require which reverts with "Not owner".
  2. Step 2: Analyze the call with wrong sender

    If msg.sender is not owner, require fails and the transaction reverts with the error message.
  3. Final Answer:

    The transaction reverts with error 'Not owner' -> Option C
  4. Quick Check:

    require fails if sender not owner [OK]
Hint: require reverts if condition false inside modifier [OK]
Common Mistakes:
  • Assuming function runs even if require fails
  • Thinking owner changes on secureAction call
  • Ignoring the require statement effect
4. Identify the error in this Solidity code using a function modifier:
contract Sample {
    address owner;
    modifier onlyOwner() {
        require(msg.sender == owner);
        _
    }
    function changeOwner(address newOwner) public onlyOwner {
        owner = newOwner;
    }
}
medium
A. Missing semicolon after '_' in modifier
B. Incorrect function visibility for changeOwner
C. owner variable not initialized
D. Modifier name should be 'OnlyOwner' with capital O

Solution

  1. Step 1: Check modifier syntax

    The modifier has '_', but it misses the semicolon '_;' which is required to mark function execution point.
  2. Step 2: Verify other parts

    Function visibility 'public' is correct, owner can be uninitialized but not a syntax error, and modifier names are case-sensitive but not required to be capitalized.
  3. Final Answer:

    Missing semicolon after '_' in modifier -> Option A
  4. Quick Check:

    Modifier must have '_;' not just '_' [OK]
Hint: Modifier must end '_' with semicolon ';' [OK]
Common Mistakes:
  • Forgetting semicolon after '_' in modifier
  • Thinking function visibility causes error here
  • Assuming variable initialization causes syntax error
5. You want to create a modifier that allows a function to run only if the contract is not paused. The contract has a boolean paused. Which modifier code correctly implements this logic?
hard
A. modifier whenNotPaused() { require(!paused, "Paused"); _; }
B. modifier whenNotPaused() { if(paused) { revert("Paused"); } }
C. modifier whenNotPaused() { require(paused, "Paused"); _; }
D. modifier whenNotPaused() { if(!paused) { _; } }

Solution

  1. Step 1: Understand the paused logic

    The function should run only if paused is false, so require(!paused) ensures this.
  2. Step 2: Check modifier completeness

    modifier whenNotPaused() { require(!paused, "Paused"); _; } uses require with negation and includes '_;' to run the function. modifier whenNotPaused() { if(paused) { revert("Paused"); } } lacks '_;', so function never runs. modifier whenNotPaused() { require(paused, "Paused"); _; } requires paused to be true, which is opposite. modifier whenNotPaused() { if(!paused) { _; } } runs function only if not paused but lacks else handling and is less clear.
  3. Final Answer:

    modifier whenNotPaused() { require(!paused, "Paused"); _; } -> Option A
  4. Quick Check:

    Require !paused with '_;' runs function [OK]
Hint: Use require(!paused) and include '_;' to run function [OK]
Common Mistakes:
  • Reversing paused condition in require
  • Omitting '_;' causing function not to run
  • Using if without else or revert
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