本節是《Solidity by Example》的中文翻譯與深入講解,專為零基礎或剛接觸區塊鏈開發的小白朋友打造。我們將通過“示例 + 解說 + 提示”的方式,帶你逐步理解每一段 Solidity 代碼的實際用途與背后的邏輯。
Solidity 是以太坊等智能合約平臺使用的主要編程語言,就像寫網頁要用 HTML 和 JavaScript,寫智能合約就需要會 Solidity。
如果你從沒寫過區塊鏈代碼也沒關系,只要你了解一點點編程概念,比如“變量”“函數”“條件判斷”,我們就能從最簡單的例子開始,一步步建立你的 Solidity 編程思維。
Constants
常量是不能修改的變量。
常量的值是硬編碼(固定寫死)的,使用常量可以節省 Gas 成本。
// SPDX-License-Identifier: MIT
// 聲明代碼采用 MIT 開源許可證,這是一種常見的開源許可協議,允許自由使用、修改和分發代碼。pragma solidity ^0.8.26;
// 指定 Solidity 編譯器版本必須大于或等于 0.8.26 并且小于 0.9.0。
// `pragma` 指令確保合約使用兼容的編譯器版本,`^0.8.26` 表示支持 0.8.26 或更高版本(但不超過 0.9.0)。contract Constants {// 定義一個名為 `Constants` 的智能合約。// 合約是一個運行在以太坊區塊鏈上的程序,包含數據(狀態變量)和邏輯(函數)。// 這個合約的目的是展示 Solidity 中的常量(constants)。// Constants are variables that cannot be modified.// 常量是不可修改的變量。// Their value is hard coded and using constants can save gas cost.// 常量的值是硬編碼(固定寫死)的,使用常量可以節省 Gas 成本。// coding convention to uppercase constant variables// 編碼規范:常量變量通常使用全大寫字母命名。address public constant MY_ADDRESS =0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;// 聲明一個名為 `MY_ADDRESS` 的常量,類型為 `address`(以太坊地址,20 字節)。// `constant` 關鍵字表示這個變量的值在定義后不可修改。// 初始化值為一個固定的以太坊地址 `0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc`。// `public` 關鍵字表示該常量可以被外部訪問,Solidity 會自動為其生成一個 getter 函數。// 按照命名規范,常量通常用全大寫字母(如 `MY_ADDRESS`)。uint256 public constant MY_UINT = 123;// 聲明一個名為 `MY_UINT` 的常量,類型為 `uint256`(256 位無符號整數,范圍從 0 到 2^256-1)。// `constant` 關鍵字表示這個變量的值不可修改。// 初始化值為 123。// `public` 允許外部訪問,并生成 getter 函數。// 同樣遵循全大寫命名規范。
}
Constants
是一個簡單的智能合約,展示了 Solidity 中的常量(constants)。常量是一種特殊的變量,它們的值在合約部署時就固定了,之后不能被修改。
代碼做什么?
- 定義常量:
MY_ADDRESS
存儲一個固定的以太坊地址。MY_UINT
存儲一個固定的數字123
。
- 不可修改:因為使用了
constant
關鍵字,這兩個變量的值在合約部署后不能被改變。 - 公開訪問:因為是
public
,外部可以通過 getter 函數讀取這些常量的值(例如MY_ADDRESS()
和MY_UINT()
)。 - 節省 Gas:常量在區塊鏈上存儲時比普通狀態變量更節省 Gas,因為它們的值是硬編碼的,編譯器可以優化存儲和訪問。
關鍵點
- 常量的特點:
- 使用
constant
關鍵字定義。 - 值在合約部署時固定,之后不可修改(硬編碼)。
- 通常用于存儲不會改變的數據(如固定地址、配置值)。
- 使用
- Gas 優化:
- 常量不像普通狀態變量那樣需要動態存儲空間,編譯器會將它們的值內聯到代碼中,減少存儲和訪問的 Gas 成本。
- 例如,
MY_UINT
的值123
可能直接嵌入到調用它的函數中,而不是每次從區塊鏈存儲中讀取。
- 命名規范:
- 常量通常用全大寫字母命名(如
MY_ADDRESS
),以區別于普通變量。 - 這是一個社區約定,便于代碼可讀性。
- 常量通常用全大寫字母命名(如
- 狀態變量:
- 盡管是常量,
MY_ADDRESS
和MY_UINT
仍然是狀態變量,存儲在區塊鏈上(storage
)。 public
提供了外部訪問的 getter 函數,調用這些函數是view
操作,鏈下調用免費。
- 盡管是常量,
- 用途:
- 常量常用于存儲合約中固定的配置值,例如管理員地址、最大限制值、協議參數等。
常量的注意事項
- 不可修改:嘗試修改常量(如
MY_ADDRESS = newAddress;
)會導致編譯錯誤。 - 硬編碼:常量的值必須在編譯時確定,不能在運行時動態設置(與
immutable
不同)。 - 命名規范:雖然不強制,但全大寫命名是最佳實踐,方便區分常量和普通變量。
- Gas 優化:常量適合存儲不會改變的值(如固定地址、配置參數),可以減少存儲和訪問成本。
- 限制:常量不能用于復雜數據類型(如動態數組
uint[]
或映射mapping
),僅支持值類型(如uint256
、address
、bytes32
)。