Bird
Raised Fist0
Blockchain / Solidityprogramming~5 mins

Function modifiers in Blockchain / Solidity

Choose your learning style10 modes available
Introduction

Function modifiers help change how functions work without changing their code. They add extra checks or actions before or after a function runs.

To check if a user has permission before running a function.
To make sure a function runs only once or under certain conditions.
To add logging or tracking around function calls.
To reuse common code like validation in many functions.
To protect functions from being called by unauthorized users.
Syntax
Blockchain / Solidity
modifier modifierName() {
    // code to run before function
    _; // placeholder for the function body
    // code to run after function
}

function someFunction() modifierName() public {
    // function code
}

The underscore _; is where the original function's code runs.

Modifiers can run code before and/or after the function.

Examples
This modifier checks if the caller is the owner before running the function.
Blockchain / Solidity
modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _;
}
This modifier checks if enough Ether was sent with the call.
Blockchain / Solidity
modifier costs(uint price) {
    require(msg.value >= price, "Not enough Ether");
    _;
}
This modifier runs the function first, then checks if the deadline passed.
Blockchain / Solidity
modifier afterDeadline() {
    _;
    require(block.timestamp > deadline, "Too early");
}
Sample Program

This contract uses a modifier onlyOwner to allow only the owner to increase the count.

Blockchain / Solidity
pragma solidity ^0.8.0;

contract SimpleContract {
    address public owner;
    uint public count;

    constructor() {
        owner = msg.sender;
        count = 0;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    function increment() public onlyOwner {
        count += 1;
    }

    function getCount() public view returns (uint) {
        return count;
    }
}
OutputSuccess
Important Notes

Modifiers help keep your code clean by reusing common checks.

Always place _; in the modifier where you want the function code to run.

Modifiers can take parameters to customize their behavior.

Summary

Function modifiers add extra rules or actions around functions.

Use _; inside modifiers to run the original function code.

Modifiers help keep your contract safe and organized.

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