--- source: Flora --- # 區塊鏈中的 Block 與 State 是什麼?從新手到進階一次搞懂 (還會再潤飾/重寫,施工中) 在區塊鏈世界中,有兩個核心概念非常重要:**Block(區塊)** 和 **State(狀態)**。 你可以這樣理解它們的角色: **Block 是一組「發生了什麼」的紀錄 →** 包含了所有被打包進去的交易,是區塊鏈上的事件日誌。 **State 是「事情發生後的結果」→** 表示目前整條鏈上的帳戶餘額、智能合約儲存值等最新狀況。 $$ stateₙ + blockₙ₊₁ → stateₙ₊₁ $$ 這是區塊鏈最基本的邏輯: 「當你從某個狀態(stateₙ)開始,執行一個新的區塊(blockₙ₊₁)裡的所有交易後,會進入一個新的狀態(stateₙ₊₁)」 舉例來說: 假設 A 帳戶有 100 元,B 有 50 元(這是 state₀),接著出現一個新區塊 block₁,其中 A 轉給 B 30 元,經過交易執行後,A 變成 70 元,B 變成 80 元(這是 state₁)。 區塊鏈就這樣不斷地從一個狀態前進到下一個狀態,每個節點都照著同樣的規則執行,這個過程就叫做**狀態轉換(state transition)**。 詳細來說,在區塊鏈中,所謂的「state(狀態)」指的是某一時刻鏈上所有資料的總體樣貌。這些資料可能是帳戶的餘額、合約中的變數、交易的輸出、甚至是部署在鏈上的程式碼。每一條鏈都有自己的定義方式,因此 state 並不是單一固定的形式,而是一個高度依賴系統設計的概念。 以 Ethereum 為例,它是 account-based 架構,state 包含了每個帳戶的餘額(balance)、交易次數(nonce)、智能合約代碼(code)與儲存資料(storage)。Bitcoin 則是 UTXO-based,這裡的 state 是由「所有尚未被花費的交易輸出」(UTXOs)所構成。Solana 採用的是另一種方式,它將帳戶本身作為儲存容器,每個帳戶內部都可以保存應用狀態、資產資料或執行程式碼,類似一個鏈上的獨立資料區塊。 抽象來看,state 可以是「目前這條鏈的整體狀況快照」,是每筆交易執行後所推進的結果,也是所有節點同步共識的核心依據。正因為每個區塊都會修改 state,所以區塊鏈也可以被視為一個不斷變化的「狀態機」(state machine):從一個舊的狀態,透過區塊中的交易執行,推進到一個新的狀態。 在討論區塊鏈機制時,理解「state 是什麼」有助於看懂智能合約怎麼互動、共識如何運作、鏈上資料為什麼不可竄改。它是區塊鏈運作的底層邏輯之一,也是交易、合約、資產變化的基礎起點。 在像 Ethereum 這樣的區塊鏈系統中,block 和 state 其實各自有明確的資料結構與驗證機制: ### Block(區塊)結構 一個區塊包含三個主要部分: 1. **Header(區塊標頭)**:紀錄時間戳、parentHash(前一個區塊)、stateRoot 等 2. **Transactions(交易列表)**:用戶提交的轉帳或合約操作 3. **Metadata(其他統計資訊)**:例如礦工資訊、Gas 限制等 ### State(鏈上狀態) 鏈上的狀態本質上是一個**Key-Value 資料庫**,裡面記錄了: 1. 帳戶餘額(balance) 2. nonce(帳戶送出交易的順序編號) 3. 智能合約程式碼(contract code) 4. 合約內部儲存(storage) 這些資訊並不是直接存在於某個區塊中,而是由Merkle Trie(或稱 Patricia Merkle Trie)這種資料結構來組成與壓縮的。 ---(以下可不放)--- 關鍵名詞解釋 stateRoot:區塊執行後所對應狀態的 Merkle Trie root hash,保證資料一致性。 parentHash:指向前一個區塊,確保鏈條連續性。 Merkle Trie:結合 Trie + Merkle Tree 的高效儲存結構,用來存帳戶和狀態。 state transition function:區塊鏈協議定義的運算規則,讓每個節點執行交易後都能得到同樣的結果。 Merkle Tree vs Merkle Trie: 這兩者雖然名字相似,但**不能互換** | 特徵 | Merkle Tree | Merkle Trie(Patricia Trie) | | --- | --- | --- | | 資料結構 | 樹狀、固定長度 | 字典樹(類似 key-value) | | 用途 | 驗證資料是否存在 | 儲存與快速查詢狀態、合約、帳戶等 | | 是否可查詢 | 不擅長(需遍歷) | 高效支援查詢 | | 是否支援動態更新 | 否(需重建) | 是(可局部更新) | | hash 結構 | 每層兩兩合併 hash | 每個節點帶 hash,根據 key 導航 | | 應用案例 | Bitcoin 的交易驗證(SPV) | Ethereum 的 state、storage、receipts | **Ethereum 內部就用的是 Merkle Trie,不是 Merkle Tree**,因為它需要 key-value 快速查詢與部分更新。若應用只是做「資料存在性驗證」,Merkle Tree 就夠。若要建一個狀態資料庫或智能合約儲存結構,那就需要 Merkle Trie。 參考連結: https://cardanofoundation.org/blog/merkle-patricia-tries-deep-dive https://medium.com/ethereum-stories/merkle-patricia-trie-in-ethereum-a-silhouette-c8d04155b490 nonce,其實這個詞是「number used once」的縮寫,意思是「只使用一次的數字」。這個概念源自密碼學,主要目的是為了避免重複、確保資料或操作的唯一性。區塊鏈系統中,nonce 的角色依據使用場景大概可以分為兩種形式。 第一種是帳戶型的 nonce,這是以太坊、Solana 等鏈上帳戶發送交易時會使用的。每當帳戶要發送一筆交易時,系統會要求這筆交易帶上一個遞增的 nonce 值,用來驗證這筆交易是否為新的、是否與先前的交易順序一致。這不只是單純的「交易次數」,更重要的功能是防止重播攻擊(replay attack),也就是惡意者試圖重送過去已經發生過的交易來竄改帳戶狀態。因此,帳戶 nonce 的本質是用來排序、驗證與保證交易唯一性,是整個交易驗證流程的核心之一。 第二種則是在工作量證明(PoW)機制中常見的挖礦 nonce,例如在比特幣系統中,礦工會不斷嘗試不同的 nonce 值,直到找到一個能讓區塊的 hash 符合指定難度條件(例如 hash 的前幾位要是 0)。這裡的 nonce 是一個試算用的變數,用來暴力搜尋正確答案,是挖礦的關鍵運算過程之一。 在以太坊等 PoS 區塊鏈中,帳戶型 nonce 通常是從 0 開始,每發一筆交易就加一。所以在表面行為上,它看起來就像是「第幾次交易」的計數器,這樣說對非技術讀者來說比較容易理解。對初學者來說,若一開始就講「抗重播攻擊的單調遞增數字」反而會造成阻礙,所以「交易次數」是一種簡化入口用的類比。但它又不是真的記錄交易次數,而是「每筆交易的唯一序號」。若帳戶有交易被撤銷或失敗,交易次數不會變,但 nonce 還是會被遞增。所以「交易次數 ≠ nonce 值」,只是在某些條件下暫時重合。 在以太坊等 PoS 區塊鏈中,帳戶型 nonce 通常是從 0 開始,每發一筆交易就加一。所以在表面行為上,它看起來就像是「第幾次交易」的計數器,這樣說對非技術讀者來說比較容易理解。對初學者來說,若一開始就講「抗重播攻擊的單調遞增數字」反而會造成阻礙,所以「交易次數」是一種簡化入口用的類比。但它又不是真的記錄交易次數,而是「每筆交易的唯一序號」。若帳戶有交易被撤銷或失敗,交易次數不會變,但 nonce 還是會被遞增。所以「交易次數 ≠ nonce 值」,只是在某些條件下暫時重合。我應該類比為「帳戶送出交易的順序編號」這樣或許會比較好? ---(~大家給的建議~)--- 1.要寫得更白話,用大量比喻、類比以及圖片去讓觀眾讀者理解,要讓沒有背景知識的人都懂。我要寫的讓白痴都看的懂! 2.若其他文章有使用同樣的翻譯詞,像是nonce就好像都翻譯交易次數(?),那或許就可以用這個詞 3.不要使用方程式,推特上不好發文 4.表格要有意義,而且要簡單易懂 5.hash可以直接用,有些英文詞可以不用硬翻
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up