Constants

本節是《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_ADDRESSMY_UINT 仍然是狀態變量,存儲在區塊鏈上(storage)。
    • public 提供了外部訪問的 getter 函數,調用這些函數是 view 操作,鏈下調用免費。
  • 用途:
    • 常量常用于存儲合約中固定的配置值,例如管理員地址、最大限制值、協議參數等。

常量的注意事項

  • 不可修改:嘗試修改常量(如 MY_ADDRESS = newAddress;)會導致編譯錯誤。
  • 硬編碼:常量的值必須在編譯時確定,不能在運行時動態設置(與 immutable 不同)。
  • 命名規范:雖然不強制,但全大寫命名是最佳實踐,方便區分常量和普通變量。
  • Gas 優化:常量適合存儲不會改變的值(如固定地址、配置參數),可以減少存儲和訪問成本。
  • 限制:常量不能用于復雜數據類型(如動態數組 uint[] 或映射 mapping),僅支持值類型(如 uint256addressbytes32)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88696.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五鏡頭傾斜攝影相機的技術優勢與應用原理

傾斜攝影技術作為三維實景建模的核心手段,其硬件設計直接影響數據采集效率與模型質量。在眾多鏡頭配置方案中,五鏡頭結構(下視前、后、左、右四個傾斜視角)已成為行業主流選擇。這一設計并非偶然,而是基于嚴苛的技術需…

ThinkSound V2版 - 一鍵給無聲視頻配音,為AI視頻生成匹配音效 支持50系顯卡 一鍵整合包下載

ThinkSound 是阿里通義實驗室開源的首個音頻生成模型,它能夠讓AI像專業“音效師”一樣,根據視頻內容生成高度逼真、與視覺內容完美契合的音頻。 ThinkSound 可直接應用于影視后期制作,為AI生成的視頻自動匹配精準的環境噪音與爆炸聲效&#x…

如何從0開始構建自己的第一個AI應用?(Prompt工程、Agent自定義、Tuning)

一、前言 從0開始基于自定義Agent構建AI應用,涉及從創建智能Agent到使用、測試及優化提示詞等一系列步驟。前置:什么是LLM、Prompt、Mcp和Agent? 二、步驟一:規劃和設計AI應用 在創建AI應用之前,你需要明確應用的目標…

Java ThreadLocal詳解:從原理到實踐

Java ThreadLocal詳解:從原理到實踐(圖解極簡示例) 一、什么是ThreadLocal?——線程的"專屬儲物柜" ThreadLocal 是 Java 提供的線程本地存儲機制,通俗來說,它能為每個線程創建一個獨立的變量副本…

如何在 Visual Studio Code 中使用 Cursor AI

在當今快節奏的開發環境中,像 Cursor AI 這樣的 AI 工具正在徹底改變開發人員編寫和管理代碼的方式。Cursor AI 通過提供智能代碼建議、自然語言編輯和多文件項目更新功能,增強了“ Visual Studio Code (VS Code )”的功能,所有這些功能均由 …

阿里面試:服務與發現 ,該選擇 CP 還是 AP?為什么?

說在前面 最近有小伙伴拿到了一線互聯網企業如微博、阿里、汽車之家、極兔、有贊、希音、百度、網易、滴滴的面試資格,遇到一幾個很重要的面試題: 服務注冊發現,該選 AP 還是 CP? 為什么? 最近有小伙伴在面 阿里。 小伙…

模擬實現Vue2-Vue3響應式更新

Vue2作為 MVVM框架/* Vue2 通過 Object.defineProperty 監聽、挾持數據,實現響應式 并通過 Dep(依賴收集器) 和 Watcher 實現依賴收集,通知視圖更新 *//* 但是 Vue2用Object.defineProperty 無法監聽新增屬性、無法監聽數組索引變…

一文理解鋰電池充電、過放修復與電量測量:從原理到實戰

一、為什么要看這篇文章? 手機電量突然從20%跳到0%?電動車冬天續航腰斬?18650過放后還能救嗎? 本文用一張思維導圖一張表格一段口訣,一次性講透鋰電池的充電四階段、過放修復全方案、電量測量底層原理,并給…

【爬蟲】01 - 爬蟲原理及其入門

爬蟲01 - 爬蟲原理及其入門 文章目錄爬蟲01 - 爬蟲原理及其入門一:爬蟲原理1:爬蟲的優勢?2:爬蟲的核心庫3:經典舉例4:合規問題一:爬蟲原理 學習爬蟲之前前置知識需要了解這些: 我的HTTP介紹, 了…

React對于流式數據和非流式數據的處理和優化

React 在處理流式數據和非流式數據時,可以借助其組件模型、狀態管理以及 React 18 引入的并發特性來實現高效的數據處理與渲染優化。 文章目錄一、流式數據(Streaming Data)1. 定義2. 常見來源3. 處理方式使用 useState / useReducer 管理狀態…

3、Vue 中使用 Cesium 實現可拖拽點標記及坐標實時顯示功能

在 Cesium 地圖開發中,實現點標記的拖拽交互并實時顯示坐標信息是一個常見的需求。本文將詳細介紹如何在 Vue 框架中使用 Cesium 的 Primitive 方式創建點標記,并實現拖拽功能及坐標提示框跟隨效果。先看效果圖功能實現概述我們將實現的功能包括&#xf…

Anthropic:從OpenAI分支到AI領域的領軍者

自2021年由前OpenAI高管Dario和Daniela Amodei創立以來,Anthropic已迅速崛起為人工智能(AI)領域的重要力量。 公司專注于開發安全、可控且具備深度推理能力的AI系統,其Claude系列模型在生成式AI領域取得了顯著成就。 此外&#xf…

前端開發中的輸出問題

前端開發中的輸出問題:console.log輸出[object Object]在前端開發中,一個常見問題是使用console.log輸出對象時顯示為[object Object],而不是對象的詳細內容。這通常發生在開發者試圖直接打印對象時,瀏覽器默認只顯示對象的字符串…

DSSA(Domain-Specific Software Architecture)特定領域架構

DSSA(Domain-Specific Software Architecture) 定義:針對特定應用領域設計的可復用軟件架構,為領域內產品族提供統一基礎。 目標: ? 最大化復用(需求/設計/代碼)? 保證系統一致性? 降低開發成…

單調棧單調隊列【算法進階】

這周學完之后最大的收獲就是單調棧和單調隊列了!!!感覺好厲害能把時間復雜度瞬間壓縮為O(N),不行我必須再紀念一下這么美妙的算法!!! 單調棧問題: 如果題目要求一個元素左邊或右邊…

C++編程基礎

編程題一問題分析 題目要求使用 n 根小木棒,按照特定的方式排列,形成一個數字。具體規則如下: 每個數字由小木棒組成,例如: 1 需要 2 根小木棒。0 需要 6 根小木棒。其他數字(如 2, 3, 4, 5, 6, 7, 8, 9&am…

張量拼接操作

一.前言本章節來介紹一下張量拼接的操作,掌握torch.cat torch.stack使?,張量的拼接操作在神經?絡搭建過程中是?常常?的?法,例如: 在后?將要學習到的殘差?絡、注意?機 制中都使?到了張量拼接。二.torch.cat 函數的使用torch.cat 函數…

Dify 連接本地 SpringAI MCP Server

Dify 連接本地 SpringAI MCP server 連接 MCP server 的方式大致有兩種,一種是基于 stdio,一種是基于 sse,如果對于穩定和性能好的方案的話,sse 要比 stdio 好的多,所以本文采用的是基于 sse 和 Spring AI 部署本地 MC…

基于 Python 的數據分析技術綜述

先說一點個人的看法“”MDX、OLAP(Mondrian)技術更適合構建面向業務用戶的標準化分析產品,尤其當產品需要滿足以下特點時:分析維度固定(如時間、區域、產品類別);需支持高并發查詢(如…

Live555-RTSP服務器

RTSP Server創建 RTSP服務器初始化: RTSPServer::createNew->new RTSPServer::RTSPServer->GenericMediaServer::GenericMediaServer->turnOnBackgroundReadHandling(IPV4sock/IPV6sock,incomingConnectionHandlerIPv4)如上流程,創建RTSP服務器…