Solidity運作方式

Solidity 的運作方式可以分解為三個主要步驟:編寫、編譯 和 執行。開發者能用人類能懂的語言寫程式,然後編譯器將其翻譯成機器語言,最終由各節點在去中心化的環境中執行。

1. 編寫 (Writing)

首先,開發者使用 Solidity 語言來編寫智能合約。這段程式碼包含了合約的邏輯、規則和變數,例如一個代幣合約如何處理轉帳、或一個拍賣合約如何管理出價。

2. 編譯 (Compiling)

寫好的 Solidity 程式碼是人類可讀的,但區塊鏈的底層虛擬機(例如 EVM,以太坊虛擬機)無法直接理解。因此,我們需要使用一個稱為 Solidity 編譯器 (solc) 的工具,將程式碼轉換成 EVM 能夠執行的 位元碼 (bytecode)。

這個位元碼是合約的機器語言,由一系列低階的指令(稱為 opcode)組成。編譯過程還會產生 ABI (Application Binary Interface),它就像是合約的公開介面說明書,告訴外界如何與合約互動。

3. 執行 (Executing)

一旦合約被編譯成位元碼,它就可以被部署到區塊鏈上。當用戶與合約互動(例如呼叫一個函式)時,這個過程會在所有運行區塊鏈網路的節點上發生。

  • 交易 (Transaction):如果互動會改變區塊鏈的狀態(例如發送代幣),那麼這會是一個交易。這筆交易會被發送到網路上,由礦工或驗證者打包到區塊中。
  • 節點運算:每個節點的底層虛擬機都會載入合約的位元碼,並執行其中的指令。節點EVM 會追蹤所有的狀態變動,並確保每個節點都得到相同的結果。這就是區塊鏈達成共識的關鍵。


Solidity範例

以下是Solidity可顯示Hello World的範例程式碼

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

contract HelloWorld {
    string public message;

    constructor() {
        message = "Hello World";
    }

    function updateMessage(string memory _newMessage) public {
        message = _newMessage;
    }
}

程式碼解說

  1. pragma solidity ^0.8.20;: 指定編譯器版本。這行告訴編譯器,這個合約需要使用 0.8.20 或更新,但不高於 0.9.0 的 Solidity 版本來編譯。
  2. contract HelloWorld { ... }: 這是定義一個智能合約的關鍵字。HelloWorld 是這個合約的名稱。
  3. string public message;:
    • string 是一種用於儲存文字的變數類型。
    • public 關鍵字很特別。當你將一個狀態變數設為 public 時,Solidity 會自動為你創建一個同名的 getter 函式。這意味著,任何人都可以透過呼叫 message() 這個函式來讀取 message 變數的值,而不需要我們自己手動寫一個 getMessage 的函式。
  4. constructor() { ... }: 建構函式,只在合約部署到區塊鏈時執行一次。在這裡,我們將 message 的初始值設定為 "Hello World"
  5. function updateMessage(string memory _newMessage) public { ... }:
    • updateMessage 是一個公共函式,任何人都可以呼叫它。
    • 它接受一個名為 _newMessage 的參數,類型是 string memorymemory 表示這個字串是儲存在記憶體中,只在函式執行期間存在。
    • 函式內部,我們將 message 的值更新為傳入的 _newMessage。由於這會改變區塊鏈的狀態,因此執行這個函式需要花費 Gas。

Remix IDE

Remix IDE (Integrated Development Environment,整合式開發環境) 是一個專為開發、測試和部署智能合約 (Smart Contracts) 而設計的強大開源工具。它最主要的優點是基於網頁,你不需要安裝任何東西,只需要一個瀏覽器就能開始使用。

將上述範例程式碼貼到 Remix IDE(一個線上開發環境)中,然後:

  1. 點擊左側的「Compile」標籤,編譯合約。
  2. 切換到「Deploy & Run Transactions」標籤,部署合約。
    • ENVIRONMENT選Remix VM,任一個都可以
    • ACCOUNT選任何一個都可以
    • 佈署完後會出現訊息,例如[vm]from: 0x5B3...eddC4to: HelloWorld.(constructor)value: 0 weidata: 0x608...e0033logs: 0hash: 0xcc6...0ac72
    • 展開訊息會看到contract address,例如0x7EF2e0048f5bAeDe046f6BF797943daF4ED8CB47
  3. 部署完成後,在Deployed Contracts下方看到合約的介面。
    • 每次佈署都會產生新的contract address,如果佈署多次會出現多個,選擇其中一個佈署的合約地址即可
  4. 展開合約,下方會出現一個新的區塊,顯示你合約中的所有 publicexternal 函式。
    • 紅色按鈕: 代表這個函式會 修改 區塊鏈的狀態 (需要花費 Gas)。
    • 藍色按鈕: 代表這個函式只會 讀取 區塊鏈的狀態 (不需要花費 Gas)。
  5. 藍色按鈕測試,可點擊 message 按鈕就會出現 0:string: Hello World
  6. 紅色按鈕測試,可在 updateMessage 函式旁的輸入框中,輸入想更改的新訊息(例如 "Hello Blockchain"),然後點擊 updateMessage 按鈕。可以注意到訊息提到花費了32263 gas
  7. 再次點擊 message 按鈕就會出現0:string: Hello Blockchain,會發現訊息已經被成功更新。


ABI

ABI (Application Binary Interface)就像是合約的「說明書」,用來定義合約中所有函式的公開介面。有了這個 ABI,外部應用程式(如 Remix IDE、MetaMask 錢包或任何 dApp)才能知道如何與你的智能合約互動。

Remix的Compile頁面下方可以產生ABI,分區說明如下

1. 建構函式 (Constructor)

{
  "inputs": [],
  "stateMutability": "nonpayable",
  "type": "constructor"
}
  • type: "constructor":這部分說明了這是一個建構函式,只在合約部署時執行一次。
  • inputs: []:空的陣列表示這個建構函式不接受任何參數。
  • stateMutability: "nonpayable":表示這個函式會修改區塊鏈的狀態(例如設定初始訊息),因此需要支付 Gas 費用。

2. updateMessage 函式

{
  "inputs": [
    {
      "internalType": "string",
      "name": "_newMessage",
      "type": "string"
    }
  ],
  "name": "updateMessage",
  "outputs": [],
  "stateMutability": "nonpayable",
  "type": "function"
}
  • type: "function":這是一個普通的函式。
  • name: "updateMessage":函式的名稱。
  • inputs:這個函式接受一個參數:
    • name: "_newMessage":參數的名稱。
    • type: "string":參數的類型是字串。
  • outputs: []:空的陣列表示這個函式不回傳任何值。
  • stateMutability: "nonpayable":表示這個函式會修改區塊鏈的狀態(更新訊息),因此需要支付 Gas 費用。

3. message 函式

{
  "inputs": [],
  "name": "message",
  "outputs": [
    {
      "internalType": "string",
      "name": "",
      "type": "string"
    }
  ],
  "stateMutability": "view",
  "type": "function"
}
  • type: "function":這是一個普通的函式。
  • name: "message":函式的名稱。
  • inputs: []:空的陣列表示這個函式不接受任何參數。
  • outputs:這個函式有一個回傳值:
    • type: "string":回傳值的類型是字串。
  • stateMutability: "view":這是最重要的部分。它表明這個函式是一個 只讀函式,它不會修改區塊鏈的狀態。因此,呼叫這個函式是 免費的,不需要支付 Gas 費用。


Environment (環境)

在 Remix IDE的Deploy & Run Transactions中,Environment可指定在哪個區塊鏈環境中執行你的合約,決定了你的合約會部署到哪裡。

  • Remix VM (Remix 虛擬機):這是 Remix 內建的模擬區塊鏈環境。
    • 優點: 區塊鏈的運作速度非常快,不需要連接到任何外部網路,所有交易都是即時的。你可以免費測試合約,不需要花費任何 Gas。
    • 缺點: 交易記錄只存在於瀏覽器中,刷新頁面後會消失。這是一個隔離的沙盒環境,不具備真實的區塊鏈功能。
  • Injected Provider:這個選項會連接你瀏覽器中的錢包擴充程式,例如 MetaMask
    • 優點: 讓你可以在真實的區塊鏈網路(如主網、測試網或本地網路)上部署和互動合約。你可以使用你的真實帳戶並花費真實的 Gas。
    • 缺點: 需要連接到網路,交易需要等待區塊確認時間,並且會消耗真實的 Gas。
  • Hardhat Provider :這選項讓你連接到本地端運行的開發環境。
    • 優點: 提供了更強大的開發和測試功能,適合進階開發者。
    • 缺點: 需要額外設定本地開發環境。

Account (帳戶)

在 Remix IDE的Deploy & Run Transactions中,Account用來選擇一個帳戶來部署或執行交易。

  • Remix VM 這裡會預設提供幾個帶有虛擬資金的測試帳戶,你可以任意選擇一個來使用,不用擔心花費。
  • Injected Provider 這個列表會顯示你連接的 MetaMask 錢包中所有可用的帳戶。

主網 (Mainnet)

主網是區塊鏈的 正式、生產環境。這裡的所有活動都是真實的:

  • 真實價值:主網上的加密貨幣(例如以太坊上的 ETH)具有實際的市場價值。每一筆交易都涉及真實的資產,並且是不可逆轉的。
  • 高安全性:主網承載著整個網路的價值,因此它的安全性、穩定性和去中心化程度都是最高的。
  • 主要用途:用於所有實際的商業運營、價值轉移和去中心化應用程式(dApps)的正式運作。

測試網 (Testnet)

測試網是主網的 模擬、開發環境。它的設計目的是讓開發者能夠安全地進行測試:

  • 無價值資產:測試網上的代幣(例如 Sepolia 測試網上的 Sepolia ETH)是免費領取的,不具備任何市場價值。
  • 低風險:開發者可以在測試網上自由地部署和測試智能合約,不必擔心因程式碼錯誤而造成真實的財務損失。
  • 主要用途:用於開發者除錯、驗證合約邏輯,以及在正式上線前讓用戶體驗產品功能。

顯示Sepolia網路

在 MetaMask 中切換到 Sepolia 測試網 的步驟:

  1. 點擊 MetaMask 瀏覽器擴充功能左上方的網路名稱。
  2. 在彈出的選單中,你會看到已有的網路列表。
  3. 如果列表中沒有 Sepolia,請確保你已經開啟了 「Show test networks」(顯示測試網路) 這個選項。
  4. 開啟後,在列表中選擇 Sepolia 網路。

SepoliaETH

測試網用的測試幣,測試網的設計目的就是要完全模擬主網的運作環境,這也包括了 Gas 消耗機制。為了測試你的智能合約在部署和執行時會消耗多少 Gas,測試網就需要一個等價的代幣來進行計量和支付。

免費測試幣領取網址 https://www.alchemy.com/faucets/ethereum-sepolia

免費領取方式:為防止機器人或惡意使用者濫用,要領取 Sepolia 測試幣,需要確保用來連線的 MetaMask 錢包地址,在 以太坊主網上 至少有 0.001 ETH。

  1. 切換到主網:在你的 MetaMask 中,將網路從 Sepolia 切換回 Ethereum Mainnet (以太坊主網)。
  2. 確認餘額:檢查你的地址餘額是否大於 0.001 ETH。
  3. 重新嘗試:如果餘額足夠,再切換回 Sepolia 網路,然後重新嘗試領取測試幣。

remix連接metamask

  1. 在 MetaMask 中選擇網路:首先,確保你的 MetaMask 錢包已切換到 Sepolia 測試網。這是決定你在哪個區塊鏈上操作的關鍵。
  2. 在 Remix 中選擇環境:在 Remix IDE 的 Deploy & Run Transactions 面板中,選擇 Injected Provider
  3. 建立連接:Remix 會自動偵測你瀏覽器中的 MetaMask 擴充功能,並請求你授權連接。當你同意後,Remix 就會與你的 MetaMask 建立連線。
  4. 顯示帳戶資訊:連線成功後,Remix 會自動同步 MetaMask 中目前選擇的帳戶資訊。在 Account 欄位中,你將看到你 當前選中的 Sepolia 地址,以及該地址上可用的 Sepolia ETH 餘額。

切換 Sepolia 帳戶

如果要切換到另一個 Sepolia 地址,有2種方式如下:

  • 在 MetaMask 中切換
    • 點擊 MetaMask 瀏覽器擴充功能。
    • 在帳戶列表(通常在最上面)中,直接選擇你想要使用的另一個地址。
  • 中斷並重新連接
    • 如果 Remix 沒有自動更新,你可以透過中斷連接的方式強制重新同步。
    • 在 MetaMask 中,點擊你的帳戶圖示,然後找到 「Connected sites」「All Permissions」
    • 在列表中找到 remix.ethereum.org,並選擇 「Disconnect」
    • 回到 Remix,再次選擇 Injected Provider,此時 MetaMask 會重新彈出連接請求,讓你選擇帳戶進行連接。


部署流程詳解

  1. Remix 準備部署:當你在 Remix 中點擊 Deploy 按鈕時,Remix IDE 會生成一筆交易,這筆交易的內容就是你合約的位元碼(bytecode)。
  2. MetaMask 跳出確認視窗:Remix 會將這筆交易傳送給你的 MetaMask 錢包,要求你簽名確認。此時,MetaMask 會彈出一個視窗,顯示交易的詳細資訊。
  3. 二次檢查(非常重要!):在這個 MetaMask 彈窗中,你可以進行以下重要的二次檢查:
    • 網路:確認你所在的網路是否為 Sepolia 測試網。這可以防止你意外地將合約部署到主網並花費真實的 ETH。
    • 帳戶:確認交易是從你指定的 Sepolia 地址 發出的。
    • Gas 費用:你可以檢查估算的交易費用。
  4. 確認並發送
    • 如果所有資訊都正確無誤,點擊 「確認」 按鈕。
    • 此時,MetaMask 會將這筆已簽名的交易發送到 Sepolia 網路。
  5. 交易被打包:接下來,你需要等待驗證者將你的交易打包進區塊中。一旦交易被確認,你的合約就會正式部署到 Sepolia 測試網上,Remix 終端機也會顯示部署成功的訊息。

metamask佈署記錄說明

metamask會顯示相關智能合約部署交易在 MetaMask 中的詳細記錄,這些數據解釋了這筆交易的成本和技術細節。以下是每個欄位的解釋:

Status: view on block explore

交易 (Transaction)

  • Nonce (交易號)1 。這是你的錢包發出的交易序列號,每個帳戶從 0 開始,每筆新交易會自動遞增。這確保了交易的執行順序。
  • 數量 (Amount)-0 SepoliaETH。這表示這筆交易 沒有 轉移任何 Sepolia ETH 到其他地址。這個值為零是正常的,因為你在部署合約,而不是發送 ETH。

燃料 (Gas) 成本

這些數字說明了你為部署這份合約所支付的費用。

  • Gas 上限 (Gas Limit)434690。這是你願意為這筆交易支付的 最大 Gas 單位數量。你在發送交易時會設定這個值,以防止交易因運算量過大而耗盡你所有的 ETH。
  • Gas 用量 (Gas Used)430109。這是部署合約 實際消耗 的 Gas 單位數量。這個數字通常會略小於 Gas 上限,代表交易成功執行且運算在預算內。
  • Base fee (基礎手續費)0.000000934 GWEI。這是以太坊區塊的基礎費用,由網路自動設定,會被銷毀(burn),不會支付給礦工或驗證者。
  • Priority fee (優先費)1.5 GWEI。這是你額外支付給驗證者的「小費」,以鼓勵他們優先打包你的交易。這個值通常由你設定,但 MetaMask 會提供預設值。
  • Max fee per gas (每單位 Gas 的最大費用)0.000000002 SepoliaETH。這是你願意為每個 Gas 單位支付的最高費用。這個值必須足夠支付 Base feePriority fee 的總和。

總費用

  • Total gas fee (總燃料費)0.000645 SepoliaETH
    • 這是這筆交易的 最終總成本。它的計算方式為:(Gas 用量 * (Base fee + Priority fee)) + Gas 用量 * Priority fee
    • 簡單來說,它是你實際使用的 Gas 量乘以每單位的 Gas 價格。
  • 總量 (Total Amount)0.00064516 SepoliaETH
    • 這是從你的帳戶中扣除的總費用。這個數字與 Total gas fee 相同,因為你沒有轉移任何 ETH。

總結來說,這筆記錄顯示你成功地將合約部署到了 Sepolia 測試網上。整個過程總共消耗了 430109 個 Gas 單位,並為此支付了總計約 0.000645 個 Sepolia ETH。

Remix佈署記錄說明

Remix 終端機顯示的交易細節,說明了智能合約部署成功。以下是各個欄位的詳細解釋:

交易狀態

  • status: 0x1 Transaction mined and execution succeed
    • 0x1 是十六進位碼,代表交易成功。這表示你的交易已經被打包到區塊中,並且執行時沒有出錯。
  • transaction hash: 0x68f6bdbd350fca5e048c2fbd2a66fede6d2d49d35593c7170f633720e1ea6b70
    • 這是這筆交易的唯一識別碼,類似於交易的收據或編號。你可以使用這個雜湊值在區塊鏈瀏覽器(如 Sepolia Etherscan)上查詢交易的詳細資訊。

區塊資訊

  • block hash: 0x21ef920a194dbb8ee1193c199b553c9d15535af7d28a7ee47a30905c2278f865
    • 這是包含這筆交易的區塊的唯一雜湊值。每個區塊都有一個獨特的雜湊,它能確保區塊的內容沒有被篡改。
  • block number: 8947805
    • 這是包含這筆交易的區塊的編號。你可以用這個編號找到區塊鏈上這筆交易被處理的位置。

合約與地址

  • contract address: 0xa01ab66df445a718943faf29d14589335fe32916
    • 這是你的智能合約 部署後在區塊鏈上的地址。未來所有與這個合約的互動,都將透過這個地址進行。
  • from: 0xc697F3ddC8157Fe176e6c7FC8AEf1ad43EC465ee
    • 這是發起這筆交易的錢包地址,也就是 部署合約的地址
  • to: HelloWorld.(constructor)
    • 這筆交易沒有傳送到已存在的地址。由於你是在部署一個新合約,to 欄位會顯示為 (constructor),代表這筆交易的目的是執行合約的建構函式來創建一個新合約。

費用與數據

  • gas: 434690 gas
    • 這是交易時設定的 Gas 上限。代表你願意為這筆交易支付的最多 Gas 單位。
  • transaction cost: 430109 gas
    • 這是這筆交易實際消耗的Gas單位。最終的交易費用就是這個數字乘以當下的 Gas 價格。
  • input: 0x608...e0033
    • 這是發送到區塊鏈的 原始交易數據,包括合約的位元碼 (bytecode) 和建構函式所需的任何參數。
  • decoded input: {}
    • Remix 嘗試解碼 input 數據,如果建構函式沒有參數,這裡就會顯示為空物件。
  • decoded output: -
    • 合約部署交易通常沒有回傳值,因此這裡為空。
  • logs: []raw logs: []
    • 這兩個欄位顯示交易觸發的事件 (Events)。由於你的範例合約在建構函式中沒有觸發任何事件,所以這裡會顯示為空。

合約測試

合約在讀取和寫入在鏈上的影響整理如下

特性寫入 (交易)讀取 (呼叫)
區塊鏈影響修改狀態 (寫入數據)不修改狀態 (讀取數據)
費用需支付 Gas不需支付費用
區塊鏈紀錄永久記錄在區塊中只在本地端執行,無紀錄
交易雜湊產生,可在區塊鏈瀏覽器查詢不產生,Remix 顯示的不是真正的交易雜湊

讀取測試

  • 點擊藍色的 message 按鈕。
  • 區塊鏈運作:這是一個 只讀操作,稱為 「呼叫 (call)」。你的錢包或 Remix IDE 會向單一區塊鏈節點發送請求,取得 message 狀態變數的當前值。
  • 結果:立即回傳值 "Hello World"。這個操作是免費的,不需要交易,因此區塊鏈上不會產生 transaction hash

寫入測試(紅色按鈕)

  • 可在 updateMessage 函式旁的輸入框中,輸入想更改的新訊息(例如 "hello blockchain"),然後點擊 updateMessage 按鈕。
  • 區塊鏈運作:這是一個 寫入操作,會啟動一筆 「交易 (transaction)」。這筆交易會透過更新 message 變數來改變區塊鏈的狀態。
  • Gas 費用:因為這項操作消耗網路資源並永久修改資料,所以需要支付 Gas 費用。
  • MetaMask 確認:你的 MetaMask 錢包會彈出一個視窗,要求你授權簽署並廣播這筆交易到網路。這是你在交易發送前的最後一次確認機會。
  • Remix 終端機輸出:當你在 MetaMask 中確認後,交易被發送。一旦交易被礦工打包,Remix 會顯示一個 transaction hash,例如 0xab964d117e5417d6e5751c78b3205d22d8094d578d8cd38857316662485a9d61。這個雜湊值是這筆交易的唯一識別碼。
  • sepolia.etherscan.io 查詢:可以將這個 transaction hash 複製到區塊鏈瀏覽器進行查詢。例如:https://sepolia.etherscan.io/tx/0xab964d117e5417d6e5751c78b3205d22d8094d578d8cd38857316662485a9d61。瀏覽器會顯示你的交易所有公開細節,包括:
    • 交易被打包的區塊號碼。
    • 傳送者和接收者的地址。
    • 支付的 Gas 費用。
    • 觸發 updateMessage 函式的Input Data

Input Data

智能合約交易的 Input Data (輸入數據),它包含了呼叫函式的指令和傳入的參數。區塊鏈瀏覽器會嘗試解碼這些十六進位(hexadecimal)數據,讓它變得可讀。可在sepolia.etherscan.io的Overview查詢。

View input As選擇Default View如下

Function: updateMessage(string newMessage) ***

MethodID: 0x1923be24
[0]:  0000000000000000000000000000000000000000000000000000000000000020
[1]:  0000000000000000000000000000000000000000000000000000000000000010
[2]:  68656c6c6f20626c6f636b636861696e00000000000000000000000000000000

區塊鏈上的交易數據都是十六進位格式,Etherscan 根據一個標準的編碼規則ABI來解碼成以上格式,說明如下。

  • Function: updateMessage(string newMessage)
    • 這是 Etherscan 根據 MethodID 識別出你呼叫的函式名稱。
  • MethodID: 0x1923be24
    • 這是一個 函式選擇器 (Function Selector)。它是 updateMessage(string) 這個函式名稱(包括其參數類型)的 Keccak-256 雜湊值的前四個位元組。EVM 會用這個 MethodID 來判斷要執行合約中的哪個函式。
  • [0]: 0000000000000000000000000000000000000000000000000000000000000020
    • 這是第一個參數的 位移量 (offset)。因為 string 是一個動態長度的資料類型,EVM 需要知道它的實際數據從哪裡開始。這個 0x20(十進位 32)表示字串的數據在參數數據區塊中的第 32 個位元組開始,但如果從交易數據的開頭算起,實際上是36位元組後開始(之前的4位元組+32位元組)。
  • [1]: 0000000000000000000000000000000000000000000000000000000000000010
    • 這代表了字串的 長度0x10(十進位 16)表示hello blockchain字串的長度是 16 個位元組。
  • [2]: 68656c6c6f20626c6f636b636861696e00000000000000000000000000000000
    • 這是實際的 字串數據,以十六進位形式編碼。如果將 68656c6c6f20626c6f636b636861696e 轉換為 ASCII 碼,你將得到 hello blockchain。後面的 00 則是填充,讓數據達到 32 位元組的倍數。

總結來說,這串看似複雜的十六進位數據,其實就是區塊鏈底層用來傳達「呼叫 updateMessage 函式,並傳入字串參數 hello blockchain」的指令。Etherscan 幫我們把這些編碼後的數據解析成可讀的格式,讓開發者和用戶能輕鬆理解交易內容。

交易數據結構分解

實際位元組範圍內容佔用大小
位元組 0-3函式選擇器 (MethodID)4 個位元組
位元組 4-35
靜態參數部分
updateMessage 函式的第一個參數
– offset 0x20
32 個位元組
位元組 36-…動態參數部分
– 實際字串長度 0x10
– 實際字串內容 "hello blockchain"
不定

如果View input As選擇UTF-8如下,可看到之前更改的新訊息(例如 "hello blockchain"

#¾$ hello blockchain

State

sepolia.etherscan.io中也可以觀察這筆交易對區塊鏈狀態造成的影響。 以下數據列出了在交易執行前後,所有受影響的地址的餘額 (Eth) 和交易號 (Nonce) 變化。

Address BeforeAfterState Difference
0x6a7aA9b8…9f12F06a3
Producer
11,344.200487598400158907
EthNonce: 8
11,344.200529877400158907
EthNonce: 8
+0.000042279
0xa01aB66d…35FE329160
EthNonce: 1
0
EthNonce: 1
0xc697F3dd…43EC465ee0.008276538790082038
EthNonce: 2
0.008234259786812462
EthNonce: 3
-0.000042279
  • Address:受影響的區塊鏈地址。
  • Before:交易執行前的地址狀態。
  • After:交易執行後的地址狀態。
  • State Difference:交易造成的淨變化。

動作說明

  1. 0xc697F3dd...43EC465ee (發送者錢包地址)
    • 交易後,發送者的 ETH 餘額減少了 0.000042279003269576,這正是這筆交易支付的 Gas 費用。同時,Nonce 從 2 變為 3,這代表成功發送了一筆交易。
  2. 0xa01aB66d...35FE32916 (合約地址)
    • 由於這筆交易只是一次函式呼叫 (call),沒有涉及 ETH 的轉移或合約的部署,因此合約本身的ETH餘額沒有變化。
  3. 0x6a7aA9b8...9f12F06a3 (Producer) (區塊生產者地址)
    • 這是打包你的交易的區塊驗證者(或礦工)的地址。你支付的 Gas 費用中,優先費(Priority Fee) 部分會被支付給這個驗證者,這就是為什麼他的餘額增加了。State Difference 顯示的增加金額,正是發送者支付給他的費用。

Storage

合約地址在展開可看到Storage內容,這是智能合約在區塊鏈上的永久儲存空間,用於存放合約的狀態變數。

Storage (1)
 Storage Address: 0x0000000000000000000000000000000000000000000000000000000000000000
 Before: Text > Hello World
 After: Text > hello blockchain
  • Storage(1):這個數字代表在這筆交易中,有多少個儲存槽 (storage slot) 被修改了。你的合約只有一個 message 變數,所以這裡顯示為 1
  • Storage Address0x0000000000000000000000000000000000000000000000000000000000000000
    • 這是儲存槽的索引或位址。在 Solidity 中,合約的狀態變數會被連續地存放在從 0 開始的儲存槽中。
    • 你的 message 變數是合約中的第一個變數,所以它的儲存槽位址就是 0
  • BeforeHello World
  • 這是交易執行前,儲存在這個儲存槽中的數據。這正是你合約的建構函式所設定的初始訊息。
  • Afterhello blockchain
    • 這是交易執行後,儲存在這個儲存槽中的新數據。這證明了你的 updateMessage 函式成功地將訊息更新了。