函數定義與訪問控制

函數定義與訪問控制

學習目標

掌握 Solidity 函數定義、可見性修飾符、交易屬性、modifier 和構造函數。


函數定義

一般形式

function fname([參數]) [可見性][交易屬性][modifier...] returns(返回值) { ... }
  • 函數簽名fname([參數]) —— 唯一標識一個函數
  • 返回值returns(返回值) —— 聲明函數返回的類型

函數可見性

Solidity 提供四種可見性修飾符,控制函數的調用範圍:

修飾符 說明
public 完全可見,內部和外部都能調用
private 僅本合約可見,子合約也不能訪問
internal 本合約和子合約可見(類似 Java 的 protected)
external 僅外部調用(通過 this 在內部調用會產生新的 message)

注意:變量默認 internal,函數默認 public。這與其他編程語言不同!

可見性示意圖

A 合約
├── private   pri()    → 僅 A 內部
├── internal  inter()  → A 內部 + 子合約 B
├── public    pub()    → 全部可見    ←── C 合約可調用
└── external  ext()    → 僅外部      ←── C 合約可調用

B is A(繼承 A)
├── inter()  可訪問
└── pub()    可訪問

交易屬性

交易屬性決定函數是否修改鏈上狀態,直接影響 gas 消耗:

屬性 說明
默認(無修飾) 寫操作,全網廣播,共識確認,消耗 gas
view 只讀操作,讀取合約狀態,不消耗 gas(外部調用時)
pure 純函數,與合約狀態無關,只依賴輸入參數

完整示例

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.2 <0.9.0;

contract NumberStorage {
    uint public x;

    // 寫操作(默認):修改狀態,消耗 gas
    function setX(uint px) public {
        x = px;
    }

    // view:只讀狀態
    function getX() public view returns(uint) {
        return x;
    }

    // pure:與狀態無關的純計算
    function add(uint a, uint b) private pure returns(uint) {
        return a + b;
    }
}

函數修飾器(Modifier)

Modifier 類似 AOP(面向切面編程),常用於訪問控制和前置條件檢查。

  • require / revert 進行條件檢查,不滿足時回滾交易
  • _; 表示執行被修飾的函數體
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract NumberModifier {
    uint private number;

    modifier nonZero() {
        require(number != 0, "Number is zero and cannot be processed.");
        _;
    }

    function doubleNumber() public nonZero {
        number *= 2;
    }

    function resetNumber() public {
        number = 0;
    }
}

構造函數(Constructor)

構造函數在合約部署時調用一次,常用於初始化狀態變量。msg.sender 是合約部署者的地址。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Constructor {
    address public owner;
    uint public x;

    constructor(uint _x) {
        owner = msg.sender;
        x = _x;
    }
}

綜合實例:Ownable 合約

結合構造函數、modifier 和可見性控制,實現一個「僅擁有者可操作」的權限管理合約:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

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

    function setOwner(address _newOwner) external onlyOwner {
        require(_newOwner != address(0), "invalid address");
        owner = _newOwner;
    }
}

Counter 合約示例

一個簡單的計數器合約,展示 external 可見性的使用:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Counter {
    uint public count;

    function inc() external {
        count += 1;
    }

    function dec() external {
        count -= 1;
    }
}

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://walker-learn.xyz/archives/7491

(0)
Walker的頭像Walker
上一篇 2026年3月8日 15:11
下一篇 2026年3月21日 01:05

相關推薦

  • 區塊鏈核心技術

    區塊鏈核心技術 學習目標 理解區塊鏈底層核心技術:哈希函數、默克爾樹、數字簽名、加密技術 掌握主流共識機制的原理與分類 瞭解區塊的運行原理與整體架構 認識聯盟鏈的特點與應用場景 前置知識 基本的計算機科學概念(數據結構、算法) 對密碼學有初步認知(非必須) 已閱讀 01-Web3 概述與願景 一、哈希函數 1.1 什麼是哈希函數 哈希函數(Hash Func…

    2026年3月10日
    7900
  • 引用類型詳解:數組、結構體、映射、字符串

    引用類型詳解:數組、結構體、映射、字符串 學習目標 掌握 Solidity 中四種引用類型(數組、結構體、映射、字符串/變長字節數組)的定義和使用方法。 前置知識 已學習值類型(整型、布爾、地址、定長字節數組等)。 數組(Array) storage 中的數組 Solidity 中數組分爲兩種: 靜態數組 T[K]:長度固定,編譯時確定 動態數組 T[]:長…

    Web3與WASM 2026年3月10日
    8300
  • Web3 概述與願景

    Web3 概述與願景 學習目標 理解 Web1、Web2、Web3 的演進歷程與核心區別 掌握 Web3 的核心理念:去中心化、數據確權、用戶主權 瞭解 Web3 帶來的創新機會與全新商業模式 熟悉 Web3 開發者的學習路線圖 前置知識 基本的互聯網使用經驗 對軟件開發有初步瞭解(非必須,但有助於理解技術部分) 一、Web1 → Web2 → Web3 的…

    Web3與WASM 2026年3月10日
    6200
  • 存儲位置與拷貝機制:storage、memory、calldata

    存儲位置與拷貝機制:storage、memory、calldata 學習目標 理解 EVM 中三種數據存儲位置的特點,以及引用類型在不同存儲位置之間賦值時的拷貝規則。 前置知識 已學習值類型和引用類型(數組、結構體、映射、字符串)。 三種存儲位置 storage —— 持久化存儲 類似數據庫,數據永久保存在區塊鏈上 成員變量(狀態變量)默認存儲在 stora…

    Web3與WASM 2026年3月10日
    8700
  • Solidity 入門與開發環境

    Solidity 入門與開發環境 學習目標 理解智能合約的本質與核心特性 掌握合約在以太坊上的運行原理(Transaction + EVM) 認識 Solidity 語言特點與開發工具鏈 編寫並部署第一個智能合約 前置知識 瞭解區塊鏈基本概念(區塊、交易、共識) 瞭解以太坊賬戶模型(EOA 與合約賬戶) 基本編程經驗(任意語言均可) 一、智能合約的根本性質 …

    2026年3月10日
    10100
簡體中文 繁體中文 English