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;
}
}
程式碼解說
pragma solidity ^0.8.20;
: 指定編譯器版本。這行告訴編譯器,這個合約需要使用0.8.20
或更新,但不高於0.9.0
的 Solidity 版本來編譯。contract HelloWorld { ... }
: 這是定義一個智能合約的關鍵字。HelloWorld
是這個合約的名稱。string public message;
:string
是一種用於儲存文字的變數類型。public
關鍵字很特別。當你將一個狀態變數設為public
時,Solidity 會自動為你創建一個同名的getter
函式。這意味著,任何人都可以透過呼叫message()
這個函式來讀取message
變數的值,而不需要我們自己手動寫一個getMessage
的函式。
constructor() { ... }
: 建構函式,只在合約部署到區塊鏈時執行一次。在這裡,我們將message
的初始值設定為"Hello World"
。function updateMessage(string memory _newMessage) public { ... }
:updateMessage
是一個公共函式,任何人都可以呼叫它。- 它接受一個名為
_newMessage
的參數,類型是string memory
。memory
表示這個字串是儲存在記憶體中,只在函式執行期間存在。 - 函式內部,我們將
message
的值更新為傳入的_newMessage
。由於這會改變區塊鏈的狀態,因此執行這個函式需要花費 Gas。
Remix IDE
Remix IDE (Integrated Development Environment,整合式開發環境) 是一個專為開發、測試和部署智能合約 (Smart Contracts) 而設計的強大開源工具。它最主要的優點是基於網頁,你不需要安裝任何東西,只需要一個瀏覽器就能開始使用。
將上述範例程式碼貼到 Remix IDE(一個線上開發環境)中,然後:
- 點擊左側的「
Compile
」標籤,編譯合約。 - 切換到「
Deploy & Run Transactions
」標籤,部署合約。 - 部署完成後,在
Deployed Contracts
下方看到合約的介面。- 每次佈署都會產生新的contract address,如果佈署多次會出現多個,選擇其中一個佈署的合約地址即可
- 展開合約,下方會出現一個新的區塊,顯示你合約中的所有
public
和external
函式。- 紅色按鈕: 代表這個函式會 修改 區塊鏈的狀態 (需要花費 Gas)。
- 藍色按鈕: 代表這個函式只會 讀取 區塊鏈的狀態 (不需要花費 Gas)。
- 藍色按鈕測試,可點擊
message
按鈕就會出現0:string: Hello World
。 - 紅色按鈕測試,可在
updateMessage
函式旁的輸入框中,輸入想更改的新訊息(例如"Hello Blockchain"
),然後點擊updateMessage
按鈕。可以注意到訊息提到花費了32263 gas - 再次點擊
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 測試網 的步驟:
- 點擊 MetaMask 瀏覽器擴充功能左上方的網路名稱。
- 在彈出的選單中,你會看到已有的網路列表。
- 如果列表中沒有
Sepolia
,請確保你已經開啟了 「Show test networks」(顯示測試網路) 這個選項。 - 開啟後,在列表中選擇
Sepolia
網路。
SepoliaETH
測試網用的測試幣,測試網的設計目的就是要完全模擬主網的運作環境,這也包括了 Gas 消耗機制。為了測試你的智能合約在部署和執行時會消耗多少 Gas,測試網就需要一個等價的代幣來進行計量和支付。
免費測試幣領取網址 https://www.alchemy.com/faucets/ethereum-sepolia
免費領取方式:為防止機器人或惡意使用者濫用,要領取 Sepolia 測試幣,需要確保用來連線的 MetaMask 錢包地址,在 以太坊主網上 至少有 0.001 ETH。
- 切換到主網:在你的 MetaMask 中,將網路從
Sepolia
切換回Ethereum Mainnet
(以太坊主網)。 - 確認餘額:檢查你的地址餘額是否大於 0.001 ETH。
- 重新嘗試:如果餘額足夠,再切換回
Sepolia
網路,然後重新嘗試領取測試幣。
remix連接metamask
- 在 MetaMask 中選擇網路:首先,確保你的 MetaMask 錢包已切換到
Sepolia
測試網。這是決定你在哪個區塊鏈上操作的關鍵。 - 在 Remix 中選擇環境:在 Remix IDE 的
Deploy & Run Transactions
面板中,選擇Injected Provider
。 - 建立連接:Remix 會自動偵測你瀏覽器中的 MetaMask 擴充功能,並請求你授權連接。當你同意後,Remix 就會與你的 MetaMask 建立連線。
- 顯示帳戶資訊:連線成功後,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 會重新彈出連接請求,讓你選擇帳戶進行連接。
部署流程詳解
- Remix 準備部署:當你在 Remix 中點擊
Deploy
按鈕時,Remix IDE 會生成一筆交易,這筆交易的內容就是你合約的位元碼(bytecode)。 - MetaMask 跳出確認視窗:Remix 會將這筆交易傳送給你的 MetaMask 錢包,要求你簽名確認。此時,MetaMask 會彈出一個視窗,顯示交易的詳細資訊。
- 二次檢查(非常重要!):在這個 MetaMask 彈窗中,你可以進行以下重要的二次檢查:
- 網路:確認你所在的網路是否為 Sepolia 測試網。這可以防止你意外地將合約部署到主網並花費真實的 ETH。
- 帳戶:確認交易是從你指定的 Sepolia 地址 發出的。
- Gas 費用:你可以檢查估算的交易費用。
- 確認並發送:
- 如果所有資訊都正確無誤,點擊 「確認」 按鈕。
- 此時,MetaMask 會將這筆已簽名的交易發送到 Sepolia 網路。
- 交易被打包:接下來,你需要等待驗證者將你的交易打包進區塊中。一旦交易被確認,你的合約就會正式部署到 Sepolia 測試網上,Remix 終端機也會顯示部署成功的訊息。
metamask佈署記錄說明
metamask會顯示相關智能合約部署交易在 MetaMask 中的詳細記錄,這些數據解釋了這筆交易的成本和技術細節。以下是每個欄位的解釋:
Status: view on block explore
- 可直接到sepolia瀏覽器查相關訊息。https://sepolia.etherscan.io/tx/0x68f6bdbd350fca5e048c2fbd2a66fede6d2d49d35593c7170f633720e1ea6b70
交易 (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 fee
和Priority 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
數據,如果建構函式沒有參數,這裡就會顯示為空物件。
- Remix 嘗試解碼
- 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
識別出你呼叫的函式名稱。
- 這是 Etherscan 根據
MethodID: 0x1923be24
- 這是一個 函式選擇器 (Function Selector)。它是
updateMessage(string)
這個函式名稱(包括其參數類型)的 Keccak-256 雜湊值的前四個位元組。EVM 會用這個MethodID
來判斷要執行合約中的哪個函式。
- 這是一個 函式選擇器 (Function Selector)。它是
[0]: 0000000000000000000000000000000000000000000000000000000000000020
- 這是第一個參數的 位移量 (offset)。因為
string
是一個動態長度的資料類型,EVM 需要知道它的實際數據從哪裡開始。這個0x20
(十進位 32)表示字串的數據在參數數據區塊中的第 32 個位元組開始,但如果從交易數據的開頭算起,實際上是36位元組後開始(之前的4位元組+32位元組)。
- 這是第一個參數的 位移量 (offset)。因為
[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 | Before | After | State Difference |
---|---|---|---|
0x6a7aA9b8…9f12F06a3 Producer | 11,344.200487598400158907 EthNonce: 8 | 11,344.200529877400158907 EthNonce: 8 | +0.000042279 |
0xa01aB66d…35FE32916 | 0 EthNonce: 1 | 0 EthNonce: 1 | |
0xc697F3dd…43EC465ee | 0.008276538790082038 EthNonce: 2 | 0.008234259786812462 EthNonce: 3 | -0.000042279 |
Address
:受影響的區塊鏈地址。Before
:交易執行前的地址狀態。After
:交易執行後的地址狀態。State Difference
:交易造成的淨變化。
動作說明
0xc697F3dd...43EC465ee
(發送者錢包地址)- 交易後,發送者的 ETH 餘額減少了
0.000042279003269576
,這正是這筆交易支付的 Gas 費用。同時,Nonce
從 2 變為 3,這代表成功發送了一筆交易。
- 交易後,發送者的 ETH 餘額減少了
0xa01aB66d...35FE32916
(合約地址)- 由於這筆交易只是一次函式呼叫 (call),沒有涉及 ETH 的轉移或合約的部署,因此合約本身的ETH餘額沒有變化。
0x6a7aA9b8...9f12F06a3 (Producer)
(區塊生產者地址)- 這是打包你的交易的區塊驗證者(或礦工)的地址。你支付的 Gas 費用中,優先費(Priority Fee) 部分會被支付給這個驗證者,這就是為什麼他的餘額增加了。
State Difference
顯示的增加金額,正是發送者支付給他的費用。
- 這是打包你的交易的區塊驗證者(或礦工)的地址。你支付的 Gas 費用中,優先費(Priority Fee) 部分會被支付給這個驗證者,這就是為什麼他的餘額增加了。
Storage
合約地址在展開可看到Storage內容,這是智能合約在區塊鏈上的永久儲存空間,用於存放合約的狀態變數。
Storage (1)
Storage Address: 0x0000000000000000000000000000000000000000000000000000000000000000
Before: Text > Hello World
After: Text > hello blockchain
Storage
(1)
:這個數字代表在這筆交易中,有多少個儲存槽 (storage slot) 被修改了。你的合約只有一個message
變數,所以這裡顯示為1
。Storage Address
:0x0000000000000000000000000000000000000000000000000000000000000000
- 這是儲存槽的索引或位址。在 Solidity 中,合約的狀態變數會被連續地存放在從
0
開始的儲存槽中。 - 你的
message
變數是合約中的第一個變數,所以它的儲存槽位址就是0
。
- 這是儲存槽的索引或位址。在 Solidity 中,合約的狀態變數會被連續地存放在從
Before
:Hello World
- 這是交易執行前,儲存在這個儲存槽中的數據。這正是你合約的建構函式所設定的初始訊息。
After
:hello blockchain
- 這是交易執行後,儲存在這個儲存槽中的新數據。這證明了你的
updateMessage
函式成功地將訊息更新了。
- 這是交易執行後,儲存在這個儲存槽中的新數據。這證明了你的