Reading and Writing to a State Variable

本節是《Solidity by Example》的中文翻譯與深入講解,專為零基礎或剛接觸區塊鏈開發的小白朋友打造。我們將通過“示例 + 解說 + 提示”的方式,帶你逐步理解每一段 Solidity 代碼的實際用途與背后的邏輯。

Solidity 是以太坊等智能合約平臺使用的主要編程語言,就像寫網頁要用 HTML 和 JavaScript,寫智能合約就需要會 Solidity。

如果你從沒寫過區塊鏈代碼也沒關系,只要你了解一點點編程概念,比如“變量”“函數”“條件判斷”,我們就能從最簡單的例子開始,一步步建立你的 Solidity 編程思維。

Reading and Writing to a State Variable

讀寫狀態變量

要寫入或更新狀態變量,你需要發送一筆交易。 另一方面,你可以免費讀取狀態變量,無需支付交易費用

  • 狀態變量:狀態變量是存儲在區塊鏈上的數據(例如一個數字或字符串),它們是智能合約的“持久化”數據,類似于數據庫中的記錄。
  • 寫入狀態變量:
    • 修改狀態變量(例如更新一個數字)需要發送一筆交易(transaction)。
    • 交易會改變區塊鏈的狀態,因此需要支付 Gas 費用(以太坊的計算和存儲費用)。
    • 交易必須由用戶或另一個合約發起,并由區塊鏈網絡確認。
  • 讀取狀態變量:
    • 讀取狀態變量(例如查看當前值)不需要發送交易。
    • 如果通過 鏈下調用(off-chain call,例如通過 Web3 庫查詢),讀取是免費的,因為它不會改變區塊鏈狀態。
    • 通常,讀取函數會標記為 view,表示它們只讀數據,不消耗 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 SimpleStorage {// 定義一個名為 `SimpleStorage` 的智能合約。// 合約是一個運行在以太坊區塊鏈上的程序,包含數據(狀態變量)和邏輯(函數)。// 這個合約的目的是展示如何讀寫狀態變量。// State variable to store a number// 用于存儲數字的狀態變量uint256 public num;// 聲明一個名為 `num` 的狀態變量,類型為 `uint256`(256 位無符號整數,范圍從 0 到 2^256-1)。// `public` 關鍵字表示該變量可以被外部訪問,Solidity 會自動為其生成一個 getter 函數(類似于 `function num() public view returns (uint256)`)。// 未初始化,默認值為 0,存儲在區塊鏈上。// You need to send a transaction to write to a state variable.// 你需要發送一筆交易來寫入狀態變量。function set(uint256 _num) public {// 定義一個名為 `set` 的公共函數,用于更新狀態變量 `num`。// 接受一個參數 `_num`,類型為 `uint256`,表示要設置的新值。// `public` 表示函數可以被外部調用(用戶、其他合約或 DApp)。// 沒有 `view` 或 `pure` 修飾符,表示函數會修改區塊鏈狀態,需要消耗 Gas。num = _num;// 將狀態變量 `num` 的值更新為傳入的參數 `_num`。// 修改狀態變量會觸發區塊鏈存儲更新,因此需要發送交易并支付 Gas。}// You can read from a state variable without sending a transaction.// 你可以無需發送交易即可讀取狀態變量。function get() public view returns (uint256) {// 定義一個名為 `get` 的公共函數,用于讀取狀態變量 `num` 的值。// `public` 表示函數可以被外部調用。// `view` 修飾符表示函數只讀取區塊鏈數據,不修改任何狀態,因此鏈下調用免費。// 返回值類型為 `uint256`,表示返回 `num` 的當前值。return num;// 返回狀態變量 `num` 的當前值。}
}

SimpleStorage 是一個簡單的智能合約,展示了如何在以太坊區塊鏈上讀寫狀態變量。它包含:

  • 一個狀態變量 num,用于存儲一個數字(初始值為 0)。
  • 一個函數 set,用于更新 num 的值(寫入操作)。
  • 一個函數 get,用于查看 num 的當前值(讀取操作)。

代碼做什么?

  • 狀態變量 num
    • 存儲一個數字,永久保存在區塊鏈上。
    • 因為是 public,可以直接通過 getter 函數(num())或 get 函數讀取。
  • 寫入操作(set 函數):
    • 接受一個新數字 _num,更新 num 的值。
    • 修改區塊鏈上的數據需要發送交易,消耗 Gas。
    • 例如,調用 set(42) 會將 num 改為 42。
  • 讀取操作(get 函數):
    • 返回 num 的當前值。
    • 只讀取數據,不修改區塊鏈狀態,因此鏈下調用免費。
    • 例如,調用 get() 會返回當前的 num 值(如 42)。
  • Gas 成本:
    • 部署合約時,初始化 num(默認 0)需要 Gas。
    • 調用 set 函數修改 num 需要 Gas(因為更改區塊鏈狀態)。
    • 調用 get 函數或 num 的 getter 函數是 view 操作,鏈下調用不消耗 Gas。

關鍵點:

  • 狀態變量:
    • 存儲在區塊鏈的 storage 中,永久保存。
    • 修改需要交易和 Gas,讀取通常免費。
  • 交易 vs. 調用:
    • 交易(Transaction):修改區塊鏈狀態(如調用 set),需要 Gas,記錄在區塊鏈上。
    • 調用(Call):只讀取數據(如調用 get),鏈下免費,不記錄在區塊鏈上。
  • 公共變量:
    • public 變量自動生成 getter 函數,功能與 get 函數類似。
    • 例如,num 本身可以直接查詢,等價于調用 get
  • 用途:
    • 讀寫狀態變量是智能合約的核心功能,廣泛用于存儲用戶數據、記錄狀態或實現業務邏輯。
    • 例如,SimpleStorage 可以用來記錄一個計數器、用戶余額或其他持久化數據。

讀寫狀態變量的注意事項

  • 寫入需要交易:
    • 任何修改狀態變量的操作(如 set)都需要發送交易,消耗 Gas。
    • 交易失敗(例如 Gas 不足或邏輯錯誤)會導致狀態回滾,但已消耗的 Gas 不退還。
  • 讀取免費:
    • view 函數(如 get)或 public 變量的 getter 函數在鏈下調用免費。
    • 如果在鏈上調用(例如另一個合約調用 get),會消耗少量 Gas。
  • 狀態變量的存儲成本:
    • 狀態變量存儲在區塊鏈的 storage 中,占用空間較大,初始化和修改成本高。
    • 選擇合適的類型(如 uint8uint256 更省空間)可以優化 Gas。
  • 安全性:
    • public 變量可以被任何人讀取,注意不要存儲敏感數據。
    • 修改狀態變量時,考慮添加權限控制(例如只有管理員可以調用 set)。
  • 溢出檢查:
    • 在 Solidity 0.8.0+ 中,uint256 的算術運算自動檢查溢出/下溢,失敗時交易會回滾。

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

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

相關文章

c# 深度解析:實現一個通用配置管理功能,打造高并發、可擴展的配置管理神器

文章目錄深入分析 ConfigManager<TKey, TValue> 類1. 類設計概述2. 核心成員分析2.1 字段和屬性2.2 構造函數3. 數據加載機制4. CRUD 操作方法4.1 添加數據4.2 刪除數據4.3 更新數據4.4 查詢數據4.5 清空數據5. 數據持久化6. 設計亮點7. 使用示例ConfigManager<TKey, …

運維打鐵: Python 腳本在運維中的常用場景與實現

文章目錄引言思維導圖常用場景與代碼實現1. 服務器監控2. 文件管理3. 網絡管理4. 自動化部署總結注意事項引言 在當今的 IT 運維領域&#xff0c;自動化和效率是至關重要的。Python 作為一種功能強大且易于學習的編程語言&#xff0c;已經成為運維人員不可或缺的工具。它可以幫…

【零基礎入門unity游戲開發——unity3D篇】3D光源之——unity反射和反射探針技術

文章目錄 前言實現天空盒反射1、新建一個cube2、全反射材質3、增加環境反射分辨率反射探針1、一樣把小球材質調成全反射2、在小球身上加添加反射探針3、設置靜態物體4、點擊烘培5、效果6、可以修改反射探針區域大小7、實時反射專欄推薦完結前言 當對象收到直接和間接光照后,它…

React Three Fiber 實現 3D 模型點擊高亮交互的核心技巧

在 WebGL 3D 開發中&#xff0c;模型交互是提升用戶體驗的關鍵功能之一。本文將基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;總結 3D 模型點擊高亮&#xff08;包括模型本身和邊框&#xff09;的核心技術技巧&#xff0c;幫助開發者快速掌握復雜…

卷積神經網絡實戰:MNIST手寫數字識別

夜漸深&#xff0c;我還在&#x1f618; 老地方 睡覺了&#x1f64c; 文章目錄&#x1f4da; 卷積神經網絡實戰&#xff1a;MNIST手寫數字識別&#x1f9e0; 4.1 預備知識?? 4.1.1 torch.nn.Conv2d() 三維卷積操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化層的作用&#x1f4…

HarmonyOS應用無響應(AppFreeze)深度解析:從檢測原理到問題定位

HarmonyOS應用無響應&#xff08;AppFreeze&#xff09;深度解析&#xff1a;從檢測原理到問題定位 在日常應用使用中&#xff0c;我們常會遇到點擊無反應、界面卡頓甚至完全卡死的情況——這些都可能是應用無響應&#xff08;AppFreeze&#xff09; 導致的。對于開發者而言&am…

湖北設立100億元人形機器人產業投資母基金

湖北設立100億元人形機器人產業投資母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;時長01:20 近日&#xff0c;湖北設立100億元人形機器人產業投資母基金&#xff0c;重點支持人形機器人和人工智能相關產業發展。 人形機器人產業投資母基金由湖北省財政廳依托省政府…

時序預測 | Pytorch實現CNN-LSTM-KAN電力負荷時間序列預測模型

預測效果 代碼主要功能 該代碼實現了一個結合CNN&#xff08;卷積神經網絡&#xff09;、LSTM&#xff08;長短期記憶網絡&#xff09;和KAN&#xff08;Kolmogorov-Arnold Network&#xff09;的混合模型&#xff0c;用于時間序列預測任務。主要流程包括&#xff1a; 數據加…

OCR 識別:車牌識別相機的 “火眼金睛”

車牌識別相機在交通管理、停車場收費等場景中&#xff0c;需快速準確識別車牌信息。但實際環境中&#xff0c;車牌可能存在污漬、磨損、光照不均等情況&#xff0c;傳統識別方式易出現誤讀、漏讀。OCR 技術讓車牌識別相機如虎添翼。它能精準提取車牌上的字符&#xff0c;不管是…

Java面試基礎:面向對象(2)

1. 接口里可以定義哪些方法抽象方法&#xff1a;抽象方法是接口的核心部分&#xff0c;所有實現接口的類都必須實現這些方法。抽象方法默認是 public 和 abstract 修飾&#xff0c;這些修飾符可以省略。public interface Animal {void Sound(); }默認方法&#xff1a;默認方法是…

有哪些更加簡潔的for循環?循環語句?

目錄 簡潔的for循環 循環過程修改循環變量 循環語句 不同編程語言支持的循環語句 foreach 無限循環 for循環歷史 break和continue 循環判斷結束值 循環標簽 循環語句優化 循環表達式返回值 簡潔的for循環 如果需要快速枚舉一個集合的元素&#xff0c;盡管C語言可以…

RK3568/3588 Android 12 源碼默認使用藍牙mic錄音

遇到客戶一個需求&#xff0c;如果連接了帶mic的藍牙耳機&#xff0c;默認所有的錄音要走藍牙mic通道。這個功能搞了好久&#xff0c;終于搞定了。1. 向RK尋求幫助&#xff0c;先打通 bt sco能力。此時&#xff0c;還無法默認就切換到藍牙 mic通道&#xff0c;接下來我們需求默…

解鎖HTTP:從理論到實戰的奇妙之旅

目錄一、HTTP 協議基礎入門1.1 HTTP 協議是什么1.2 HTTP 協議的特點1.3 HTTP 請求與響應的結構二、HTTP 應用場景大揭秘2.1 網頁瀏覽2.2 API 調用2.3 文件傳輸2.4 內容分發網絡&#xff08;CDN&#xff09;2.5 流媒體服務三、HTTP 應用實例深度剖析3.1 使用 JavaScript 的 fetc…

uvm_config_db examples

通過uvm_config_db類訪問的UVM配置數據庫,是在多個測試平臺組件之間傳遞不同對象的絕佳方式。 methods 有兩個主要函數用于從數據庫中放入和檢索項目,分別是 set() 和 get()。 static function void set ( uvm_component cntxt,string inst_name,string …

(C++)任務管理系統(文件存儲)(正式版)(迭代器)(list列表基礎教程)(STL基礎知識)

目錄 前言&#xff1a; 源代碼&#xff1a; 代碼解析&#xff1a; 一.頭文件和命名空間 1. #include - 輸入輸出功能2. #include - 鏈表容器3. #include - 字符串處理4. using namespace std; - 命名空間 可視化比喻&#xff1a;建造房子 &#x1f3e0; 二.menu()函數 …

Java 中的異步編程詳解

前言 在現代軟件開發中&#xff0c;異步編程&#xff08;Asynchronous Programming&#xff09; 已經成為構建高性能、高并發應用程序的關鍵技術之一。Java 作為一門廣泛應用于后端服務開發的語言&#xff0c;在其發展過程中不斷引入和優化異步編程的支持。從最初的 Thread 和…

MySQL邏輯刪除與唯一索引沖突解決

問題背景 在MySQL數據庫設計中&#xff0c;邏輯刪除&#xff08;軟刪除&#xff09;是一種常見的實踐&#xff0c;它通過設置標志位&#xff08;如is_delete&#xff09;來標記記錄被"刪除"&#xff0c;而不是實際刪除數據。然而&#xff0c;當表中存在唯一約束時&am…

php命名空間用正斜杠還是反斜杠?

在PHP中&#xff0c;命名空間使用反斜杠&#xff08;\&#xff09;作為分隔符&#xff0c;這是PHP語言規范明確規定的。反斜杠在命名空間中扮演路徑分隔的角色&#xff0c;用于區分不同層級的命名空間。 具體說明&#xff1a;語法規則 PHP命名空間使用反斜杠&#xff08;\&…

《從依賴糾纏到接口協作:ASP.NET Core注入式開發指南》

在C#的ASP.NET Core開發中&#xff0c;依賴注入絕非簡單的技術技巧&#xff0c;而是重構代碼關系的底層邏輯。它像一套隱形的神經網絡&#xff0c;讓程序模塊擺脫硬編碼的束縛&#xff0c;在運行時實現動態連接&#xff0c;從而為系統注入可測試、可進化的核心生命力。理解其深…

星云ERP本地環境搭建筆記

看到星云ERP兩個比較實用的功能&#xff0c;編號規則和打印模板&#xff0c;如下圖所示&#xff0c;于是本地跑起來學習學習。開發環境必備&#xff1a;1. JDK 1.82. MySQL 5.73. Redis 44. RabbitMQ 3.12.45. nodejs 206. pnpm 9.7.1 (npm install -g pnpm9.7.1)其他開發工具&…