函數定義與訪問控制

函數定義與訪問控制

學習目標

掌握 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
上一篇 5天前
下一篇 2025年2月26日 17:17

相關推薦

  • 區塊鏈核心技術

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

    1天前
    500
  • 合約交互與 ABI

    合約交互與 ABI 學習目標 掌握合約間調用方式、接口定義、ABI 數據結構、Web3.js 訪問合約的方法。 合約間調用基礎 EOA(外部賬號)發起調用,可能觸發合約間的調用鏈 調用者必須持有被調用合約的地址 方式一:同文件內直接調用 當兩個合約在同一個文件中時,可以直接通過合約類型和地址進行調用: // SPDX-License-Identifier: …

    1天前
    200
  • 繼承多態與庫合約

    繼承多態與庫合約 學習目標 掌握 Solidity 繼承機制與多態 理解 C3 線性化算法 掌握庫合約(library)的定義和使用 繼承基礎 繼承定義 使用 is 關鍵字 繼承的實現方式是代碼拷貝:部署後變成一個合約 可見性與繼承 private:子合約不可見,但不能定義同名成員 internal:子合約可見 public:完全可見 event 和 mod…

    Web3與WASM 20小時前
    200
  • Solidity 入門與開發環境

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

    1天前
    1200
  • Web3 概述與願景

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

    Web3與WASM 19小時前
    600
簡體中文 繁體中文 English