第 7 週:專案發想與智慧合約設計思維
在前幾堂的課程裡,我們探討了 Web 3.0 的典範轉移、商業模式的興衰退潮,並在上一週了解數位錢包的底層物理學與簽名釣魚的資安前線。同學們的腦海中或許已經塞滿了密碼學、公私鑰、EOA、Gas Fee、智慧合約等繁雜名詞。但是,如果只是隔著投影片聽講, 同學們與真實的 Web3 之間,永遠像隔著一層毛玻璃。這一週,我們不講抽象的大道理,而是要把我親手為本課建置的專屬 Web3 體驗與 MLC 課程代幣的專案歷程,攤開來與大家分享。大家將看見如何落實需求構想,透過架構思維落地為智慧合約,提供整合前、後端的完整體驗。今天,同學們還要親手安裝錢包,發起真實交易,把屬於你的第一筆鏈上資產帶回家。
📋 本週學習目標
- 理解老師發起「MLC 課程代幣」專案的初衷,並掌握「需求分析」在 Web3 專案發想的核心框架(The Who 與 The What)。
- 比較鏈上身分驗證機制的權衡:說明「白名單(Whitelist)」與「課堂共享密碼(Shared Secret)」各自的優缺點與防禦邊界。
- 運用「自動販賣機」模型解構智慧合約。
- 分析以太坊的擴容演進:說明 Layer 2(Base Sepolia)如何以 Rollup 分攤 L1 的壅塞與水龍頭門檻,以及老師為何把本課的實作放到 L2。
- 完成MetaMask 擴充錢包之安全安裝,落實助記詞(BIP-39)離線保管之「黃金三律」,並取得屬於自己的公開地址。
- 實作登入老師為本堂課建置的專屬 Web3 領幣介面,連線錢包、輸入通關密碼,成功領取 100 枚 MLC 課程代幣,並於 BaseScan 區塊鏈瀏覽器驗證交易鐵證。
- 構想借用本週「自動販賣機」的記憶/按鈕/保鑣三件套,為你在期中或期末想建置的鏈上應用,紙上草擬至少兩個狀態變數、一個核心函式與兩條 require() 安全防線。
⏱ 預估閱讀時間:約 80~100 分鐘 | 關鍵詞:需求分析、專案發想、白名單、共享密碼、自動販賣機比喻、狀態變數、require()、Revert、Gas、Layer 2、Rollup、Base Sepolia、MetaMask、助記詞三律、MLC 代幣、BaseScan
7.1 開場:專案的起源 — 隔著毛玻璃的 Web3
在正式進入技術細節之前,我想先問大家一個問題:當我們在課堂上討論「鏈上資產所有人擁有不可剝奪的控制權」時,那到底是一種什麼樣的感覺?當我們說到「智慧合約一旦部署就不可竄改,且持續自動執行」,那又是怎麼運作的?
在教學現場,我常常看著台下同學的眼神。大家抄下了私鑰、公鑰、Hash、Gas、ERC-20 這些詞彙,或許也能在考卷上寫出標準答案。但在下課走出教室的那一刻,區塊鏈對多數人來說,依然只是一串躺在投影片上的八股理論。它既不像悠遊卡嗶一聲就能進站,也不像 LINE Pay 掃個條碼就能買瓶自動販賣機裡的運動飲料。這就是所謂的「隔著毛玻璃」——如果沒有真正把一把私鑰握在自己手裡,沒有親眼看著一筆交易被打包上鏈,很難對「去中心化」產生任何真實的體感。
正是因為這個念頭,在學期初規劃課程進度時,我就在自己的筆記本上寫下了一個明確的挑戰:
這就是 MLC(drMarcoLab Coin / 課程學習代幣)專案發起的起源。
今天這一堂課,老師的角色更是這套系統的產品經理(Product Manager)與架構工程師。我會將我從「零」開始發想這個專案時所面臨的需求痛點、技術決策的權衡(Trade-offs)、系統架構的邊界劃分,乃至於智慧合約狀態機的防護思維,一五一十地拆解給大家看。
課堂兩大里程碑:分組定案與真實領幣
為了讓大家能夠扎實吸收,本週課堂設計了兩個緊密扣合的里程碑:
- 里程碑一:16 組動物代號小組之調動確認與正式定案
上一週(W05)我們透過隨機演算法將全班 94 位同學初步分派至 16 個動物代號小組(從 🦊 狐狸、🐨 無尾熊、🐼 貓熊到 🦜 鸚鵡)。今天我們將給予大家最後的組員調動與人員補齊時間。隨機分組創造大家面對面溝通的機會,現場計有無尾熊、紅鶴和狐狸三組人員到齊,若同學們心中另有所屬,可協調換組。例如第 15 組同學因當天有四位同學沒到,現場與另一個有二位同學未到的小組協商成為一組。有同學向我表達事先已找找好組員,隨機分組把他們打散了。因此,W05 的分組活動只是個熱身,各位同學可以「人工」進行線下協調分組。分組完成後將被正式鎖定,作為後續課程實戰、期中個人驗收與期末團隊專案的固定作戰團隊!
(組員調動與確認以課堂現場公布的畫面為準,它將一路陪伴你完成整個學期的實作。) - 里程碑二:親手安裝錢包,連線至專屬 Web3 介面領取學習代幣 100 MLC
在理解老師的設計思維後,全班同學將依照指引,在電腦瀏覽器中安裝主流的 Web3 錢包——MetaMask。接著,大家將連線進入老師親自為本堂課建置的專屬 Web3 領幣介面,輸入課堂通關密碼,直接與鏈上智慧合約真實互動,領取 100 枚學習代幣 MLC,並親自到區塊鏈瀏覽器 BaseScan 上檢驗不可竄改的鐵證!
7.2 需求分析:專案的架構決策與邊界
大家可能在「系統分析與設計」課程中學過需求分析。但在真實的 Web3 世界中,需求分析之所以極端困難,是因為區塊鏈具有一項殘酷的特質:程式碼一旦部署上鏈,就無法輕易還原,任何邏輯漏洞都會直接暴露在公網之上。
當我著手設計 MLC 領幣系統時,我首先回答了軟體工程中最經典的兩個根本問題:
- The Who(我們在為誰服務?)
- The What(系統到底要完成什麼核心功能?)
一、使用者對象分析(The Who)
這個系統的使用者非常具體,就是淡江資管系選修「Web3 的應用與實務」的 94 位同學。但在工程設計上,這群使用者具備以下關鍵特質:
- 背景差異極大:雖然大家都是資管系同學,但有人過去可能玩過鏈上 DeFi、有人甚至連 Chrome 擴充功能都很少安裝;有人使用 Windows,有人使用 macOS,甚至有人用 iPad 瀏覽。
- 學習熱情易受挫:在使用者體驗(UX)設計中,有一個黃金法則——「每增加一個繁瑣的操作步驟,使用者流失率就會翻倍」。如果領取一枚代幣需要先填寫五份 Google 表單,並審核三天,然後再手動設定複雜的 RPC 參數,那麼超過一半的同學在真正摸到代幣之前,熱情就已經被消耗殆盡。
- 核心原則:體驗優先(Experience-First):因此,老師確立了第一條不可妥協的架構原則——在安全的前提下,追求極致的流暢度與零摩擦力。
二、核心功能定義(The What)
目標看似單純:發放代幣。但拆解成系統規格,必須滿足以下三項剛性約束:
- 身分合規驗證:只有本堂課的同學可以領取,不能被校外陌生人隨意撈取。
- 防重複領取(One-Time Claim):每位同學只能領取一次,不能反覆點擊重複提領。
- 定量精確發放:每次驗證成功,合約精確發放 100 枚 MLC,既不能多給也不能少給。
三、架構大抉擇:白名單機制 vs. 課堂共享密碼
為了解決「身分驗證」與「防止濫領」,我在架構設計初期提出了兩個截然不同的技術方案。這正是在系統規劃時最常遇到的經典架構權衡(Trade-off Analysis):
| 決策維度 | 方案 A:白名單機制(Whitelist) | 方案 B:課堂共享密碼(Shared Secret) |
|---|---|---|
| 運作機制 | 課前由老師收集全班 94 位同學的錢包地址,透過管理員權限預先將地址寫入合約狀態或構建 Merkle Tree。 | 老師在課堂現場口頭公布一組具時效性的「通關密語」,合約只儲存該密語的 Keccak-256 雜湊值;因此同學可以輸入通關密語呼叫合約領取代幣。 |
| 安全性與精準度 | 極高:只有名單內的地址可以領取,外人即使知道也無法偽造。 | 中等:密語若洩漏可能被他人領走;但可藉由合約防重領與時效控制風險。 |
| 前置作業成本 | 極重且脆弱:同學若在課前尚未安裝錢包,或貼錯地址(打錯一個字元),當天就完全無法參與活動,行政成本巨大。 | 零前置負擔:同學今天在課堂現場當場安裝好錢包,當場連線輸入通關密語即可領取,完全不需要課前收集地址! |
| 合約儲存成本 (Gas) | 若採陣列直存,94 個地址連續寫入 storage ,會消耗大量 Gas,成本極高。若採用 Merkle Tree,鏈上只存一個 32 位元組 Root;只存一個根節點(省錢),但必須預先收齊名單建樹,只要有入加退選便無法動態修改。 |
合約只需儲存一個 32 位元組的 bytes32 secretHash,初始化成本幾近為零,且完全不依賴課前名單收集。 |
評估完上述兩條路線後,老師毅然選擇了方案 B:課堂共享密碼機制。因為這是一堂「教學引導課」,如果為了追求極致的封閉安全性而強制同學在課前交出錢包地址,將會大幅增加前置門檻。然而,選擇方案 B 就意味著:我們必須在智慧合約內部,設計一個無懈可擊的狀態追蹤器,確保同一個錢包地址絕對不可能拿著密語重複領幣!
四、上鏈邊界判定:什麼該上鏈、什麼絕不上鏈?
資管系同學最常見的盲點,就是「為了區塊鏈而區塊鏈」,恨不得把整個資料庫的所有欄位通通搬上鏈。這在架構設計中的災難性錯誤。
在以太坊生態中,鏈上儲存(storage)是全世界最昂貴的儲存空間,因為存入 1 MB 的資料在主網將產生高達數萬美元的手續費,而且區塊鏈上的所有內容都是永久透明公開的。因此,在 MLC 專案中,老師劃定了嚴格的架構邊界:
- ✅ 必須上鏈的資料(On-Chain):
- 代幣核心狀態:代幣名稱(drMarcoLab Coin)、符號(MLC)、小數點(18 位元)、總量上限(
maxSupply= 20,000 MLC)[3]。 - 資產所有權帳本:標準 ERC-20 帳本
mapping(address => uint256) balances(誰擁有多少代幣)。 - 領取狀態登記簿:
mapping(address => bool) hasClaimed(標記該地址是否已經領取過)。 - 通關密語雜湊值:
bytes32 secretHash(絕對不儲存明文密碼,只儲存雜湊!)。
- 代幣核心狀態:代幣名稱(drMarcoLab Coin)、符號(MLC)、小數點(18 位元)、總量上限(
- ❌ 絕對不上鏈的資料(Off-Chain):
- 學生個人隱私:真實姓名、學號、座號、系級——這些資料如果寫上鏈,就永遠無法刪除,嚴重違反隱私原則與個資保護。
- 前端介面視覺效果與邏輯:按鈕顏色、頁面版型、教學引導文字——這些通通放在前端網頁伺服器,由瀏覽器渲染。
🔍 深入思考:為什麼合約裡不能儲存「明文密碼」,而必須儲存「密碼的雜湊值(Hash)」?
很多初學者誤以為智慧合約裡的
private 變數就是私密資料。這是錯的!在區塊鏈的世界裡,所有狀態變數在節點的記憶體與區塊儲存中都是完全透明可查。如果在合約寫 string private password = "<現場公布之機密密語>";,任何稍微懂技術的人只要透過 eth_getStorageAt RPC 呼叫,就能直接把變數內容從區塊鏈儲存槽中讀出來。因此,老師在設計合約時,在合約中只存放
keccak256(abi.encodePacked("<現場公布之機密密語>")) 的計算結果。由於單向雜湊函數具有「不可逆性」,外人看到這串 32 位元組的亂碼,在數學上絕不可能反推回原始密語。唯有當同學在前端輸入正確通關密語送進合約,合約現場做一次雜湊比對吻合時,才予以放行!
7.3 dApp 三層解構與設計思維:前端、自動販賣機與公開總帳
當我們談論「去中心化應用程式」(dApp, Decentralized Application)時,很多同學可能會以為它是一個「完全運行在區塊鏈裡的神秘網站」。其實不然。在軟體架構上,dApp 依然遵循分層架構(Layered Architecture)的設計思維。
為了讓大家徹底搞懂它與傳統 Web2 系統的根本差異,我們將這個專案拆解為三個核心要素,並給予貼切的生活隱喻:
① 前端介面(Frontend)
比喻:ATM 提款機的觸控螢幕
這就是今天老師為大家架設的 Web3 網頁。它由 HTML、CSS 與 JavaScript 組成,在使用者瀏覽器中運作。它的核心使命是「隱藏底層複雜性」——使用者不需要手動打包十六進位位元組碼,只需點擊按鈕,前端就會呼叫錢包 API 完成授權與互動。
② 智慧合約(Smart Contract)
比喻:街角的「自動販賣機」
這是部署在區塊鏈世界裡的自動化程式。它擁有自己的「記憶體(狀態變數)」與「功能按鈕(函式)」。它不依賴任何管理員在場,只要符合預設的規則與條件,就會不偏不倚,強制執行預定的商務邏輯——這個經典比喻出自計算機科學家 Nick Szabo——他在 1994 年首度提出「智慧合約」一詞,並在 1997 年論文中用自動販賣機生動地闡述:機器本身就是契約的自動執行者[2]。
③ 區塊鏈網路(Blockchain)
比喻:全世界共享的「公開帳本」
智慧合約就寄宿在由全球成千上萬個節點共同維護的虛擬機環境中。無論是合約程式碼的執行過程,還是誰擁有了多少代幣,所有紀錄都會被永久、不可抹滅,而且透明地刻印在區塊鏈總帳上[1]。
一、智慧合約的記憶:狀態變數(State Variables)
我們要如何讓這台「自動販賣機」正常運作?第一步是賦予它記憶能力。在物件導向程式設計(OOP)中,類別有屬性(Attributes);在智慧合約(Solidity)中,這被稱為「狀態變數」(State Variables)。
為了滿足 MLC 領幣的需求,老師設計的合約需要記住以下幾項關鍵資料:
(提示:下方程式碼中的 constant、immutable 等關鍵字是第 10 週語法課的主角,初次閱讀請沿著繁體中文註解,聚焦於每個零件『扮演什麼角色』即可。)
// 0. 名稱、符號、小數點與餘額帳本,都由 OpenZeppelin 的 ERC-20 基底合約提供
// 本合約以 is ERC20 繼承它;名稱與符號在部署時由建構子寫入,之後不可修改
contract MarcoLabCoin is ERC20 {
// 1. 通關密語的雜湊值(32 位元組)
// 不存明文密碼,只存密語經由 Keccak-256 運算後的數學指紋
bytes32 public immutable secretHash;
// 2. 領取登記簿:記錄哪一個地址「已經領過」
// 就像自動販賣機的已購買紀錄,防止同一個地址領兩次
mapping(address => bool) public hasClaimed;
// 3. 每次領取的數量:100 MLC(含 18 位小數)
uint256 public constant claimAmount = 100 * (10**18);
// 4. 總量上限:20,000 MLC = 200 人次,留兩屆彈性
uint256 public constant maxSupply = 20000 * (10**18);
// 5. 建構子:只在部署那一刻執行一次,之後 secretHash 永遠不變
constructor(bytes32 _secretHash) ERC20("drMarcoLab Coin", "MLC") {
secretHash = _secretHash;
}
}
初學者語法速查小卡(選讀:這些關鍵字在做什麼?)
constant / immutable:代表這個變數在部署後「永遠不能被修改」,節省 Gas 且極度安全。•
calldata:用在函式參數(如 string calldata _secret),代表這段字串是外部傳進來的「唯讀暫存資料」,不佔用昂貴的儲存槽。•
10**18:以太坊上代幣預設有 18 位小數點(就像 1 元=100 分),因此 100 枚代幣在鏈上記錄為 100 * 10^18 個最小單位。•
abi.encodePacked():將字串打包成緊湊的二進位位元組,以便傳入 Keccak-256 運算雜湊。
請特別注意 mapping(address => bool) public hasClaimed 這個資料結構。它在以太坊底層是一個鍵值對(Key-Value)對照表。當地址 0x123... 領取成功後,合約會將 hasClaimed[0x123...] 設為 true。未來該地址只要再次嘗試呼叫,合約一查登記簿便能以 O(1) 的極速識破![4]
二、智慧合約的行動:函式(Functions)
自動販賣機有了記憶,接著需要提供讓外界使用者可以按下的「操作按鈕」——這就是函式(Function)。在 MLC 合約中,最核心的操作就是 claim():
function claim(string calldata _secret) public {
// 步驟 1:隨身保鑣先進行三道嚴格資格審查 (require)
require(!hasClaimed[msg.sender], "Error: Address has already claimed tokens.");
require(keccak256(abi.encodePacked(_secret)) == secretHash, "Error: Invalid secret code.");
require(totalSupply() + claimAmount <= maxSupply, "Error: Exceeds maximum supply.");
// 步驟 2:通過審查,先記下「這個地址領過了」(先寫狀態,再發幣)
hasClaimed[msg.sender] = true;
// 步驟 3:呼叫 ERC-20 的 _mint() 鑄幣給呼叫者
// 這一行同時更新 totalSupply() 與餘額帳本,並在鏈上廣播 Transfer 事件,供所有人公開查驗
_mint(msg.sender, claimAmount);
}
📄 以上兩段為課程合約 MarcoLabCoin.sol 的節錄(實際檔案另有 SPDX 授權標頭、OpenZeppelin 匯入與完整註解)。完整原始碼已公開於區塊鏈上,同學可對照閱讀。
三、智慧合約的隨身保鑣:require() 機制
在傳統 Web2 開發中,如果後端檢查失敗,我們通常回傳 HTTP 400 或拋出 Exception,代價頂多是使用者看到一個錯誤頁面。但在以狀態機模式設計的智慧合約中,防禦檢查更為嚴苛:一次失敗的呼叫不是單純的「回傳錯誤」,而是整筆交易 (連同已消耗的運算資源) 寫進區塊,手續費照扣;因此在 Web3 系統架構中,狀態守護與錯誤處理具有經濟與安全的意義[8]。
在 Solidity 語言中,這名保鑣的名字就叫做 require()。當一個呼叫者發起交易並呼叫 claim() 時,保鑣會不假思索地盤問三個問題:
- 「這個地址,是不是已經領過了?」
require(!hasClaimed[msg.sender], "Error: Address has already claimed tokens.");
如果hasClaimed[msg.sender]已經是true,保鑣立刻亮紅燈。 - 「輸入的通關密語,雜湊後是否與 secretHash 一致?」
require(keccak256(abi.encodePacked(_secret)) == secretHash, "Error: Invalid secret code.");
合約把傳入的字串現場進行一次 Keccak-256 運算,若比對不符,立刻擋下。 - 「發放這 100 枚代幣後,總發行量會不會超過本課程預設的上限(
maxSupply= 20,000 MLC)?」
require(totalSupply() + claimAmount <= maxSupply, "Error: Exceeds maximum supply.");
嚴格控制總量,防止無限增發導致代幣通膨。
這就是智慧合約強悍的地方:要嘛全部成功,要嘛徹底回滾,絕不存在「密碼錯誤卻被扣除代幣」或「代幣發了但狀態沒改」的中間灰階狀態!
四、深入底層:EVM 儲存槽(Storage Slots)與狀態機成本
在傳統關聯式資料庫(如 MySQL)中,新增一張資料表或寫入一行記錄,成本幾乎是微秒級的硬碟讀寫;但在以太坊虛擬機(EVM)中,每一次寫入 storage,背後都需要全球成千上萬台節點永久同步並維護該狀態。
以太坊將智慧合約的永久儲存空間劃分為以 32 位元組(256 位元)為單位的「儲存槽」(Storage Slots)。在 EVM 的操作碼(Opcode)定價中:
- SSTORE(將值從 0 改為非 0):消耗高達 20,000 Gas!這也是為什麼在
claim()中,第一次將hasClaimed[msg.sender]設為true時,會消耗該交易絕大部分的 Gas。 - SSTORE(修改已有值):消耗 5,000 Gas。
- SLOAD(從儲存槽讀取值):熱讀取(Warm Read)約 100 Gas,冷讀取(Cold Read)約 2,100 Gas。
因此老師在設計合約時,嚴格遵循「最小鏈上狀態原則」——我們只使用一個 mapping(address => bool) 來記錄已領取標記,而不去建立一個動態增長的 address[] 陣列去遍歷比對。遍歷陣列一個個慢慢找,領的人越多手續費暴增,甚至可能突破單一區塊的 Gas 限制(Block Gas Limit)導致交易永遠失敗;而採用 mapping 則是常數級雜湊定址,省錢又省錢,這才是優秀的智慧合約架構思維!
7.4 為什麼 2026 年老師帶大家航向 Layer 2(Base Sepolia)?
去年(2025 年),本課程的領幣體驗建立在以太坊的原生 Sepolia 測試網(Layer 1)。今年我有不同的考量:
一、擴容演進:以太坊的「不可能三角」與接駁巴士隱喻
以太坊創辦人 Vitalik Buterin 提出的「區塊鏈不可能三角」(Blockchain Trilemma)指出:任何分散式帳本網路,都很難同時兼顧去中心化(Decentralization)、安全性(Security)與可擴展性/效能(Scalability)。
以太坊主網(Layer 1)選擇了極致的「去中心化」與「安全性」,其代價就是主幹道頻寬極度有限(犧牲了可擴展性及效態)。當全世界的交易都想擠上這條單線道時,過路費(Gas)自然水漲船高。
那麼,全球區塊鏈社群是如何解決這個問題的?答案就是 Layer 2(第二層擴容技術),特別是 Rollup 技術!
請注意:現代 Rollup 主要分為兩大流派——ZK Rollup(零知識有效性證明,每次提交時主網會立刻用數學公式驗證結果)與 Optimistic Rollup(樂觀 Rollup,主網預設交易皆合法,保留 7 天挑戰期讓任何人提出「詐欺證明 Fault Proof」糾錯)。我們今天使用的 Base 網路正是基於 OP Stack 的 Optimistic Rollup 架構,它兼具超高效能與以太坊主網的頂級安全防護!
二、為什麼選擇 Base Sepolia?
在評估了 Arbitrum、Optimism、Polygon Amoy 等眾多二層網路後,老師決定在今年(2026)全面導入由全球最大合規交易所 Coinbase 所建置的 Base 測試網(Base Sepolia)[5]。這項決策背後有著清晰的工程考量:
- 秒級出塊,體驗極速:Base Sepolia 的出塊時間僅需 2 秒!同學在網頁按下「領取」後,錢包確認簽署,立即可收到交易成功的提示。
- 極致便宜的微 Gas(Micro-Gas):得益於以太坊 Dencun 升級引進的 EIP-4844(Blob 攜帶交易技術),Layer 2 向主網提交資料的成本暴降了 90% 以上。在 Base Sepolia 上,執行一筆
claim()的 Gas 消耗大約只需 0.000005 ETH(此為測試幣,不具現金價值;若在以太坊主網以 10 gwei 估算約需 1~2 美元)。老師只需支付 0.1 測試 ETH,就足以支應全班 94 位同學進行上萬次鏈上互動,徹底告別過去被水龍頭刁難的痛苦! - 產業實務趨勢接軌:目前全球主流的消費級 Web3 應用(如社交協議 Farcaster、各類鏈上遊戲與微支付),絕大多數都選擇建構在 Base 生態上。我們在課堂上直接練習 Base 網路,了解產業當前最熱門的實戰規格!
• 網路名稱:Base Sepolia 測試網[6]
• 鏈 ID (Chain ID):
84532• 貨幣符號:
ETH• 區塊鏈瀏覽器:https://sepolia.basescan.org
• 老師部署之 MLC 合約標準:ERC-20(相容 EIP-20 規範)
• 課程代幣規格:名稱
drMarcoLab Coin/符號 MLC/每人領取 100 枚/總量上限 20,000 枚
三、解構 Layer 2 的收費結構:為什麼能便宜千百倍?
很多同學會好奇:Base 明明是以太坊的 Layer 2,為什麼在 Base 上發起一筆交易只需要不到一分錢台幣,同樣的運算搬到主網卻可能要數十倍甚至上百倍的成本(以 10 gwei 估算,主網一筆合約互動約需 1~2 美元)?這背後涉及 L2 交易費用的兩大組成:
- L2 執行費用(L2 Execution Fee):Base 網路內部由排序器(Sequencer)執行這筆交易並更新狀態的成本。由於 Base 節點硬體負載低、頻寬充裕,這部分的 Gas 費極端低廉。
- L1 資料可用性費用(L1 Data Fee / Rollup Data Fee):排序器必須將成千上萬筆 L2 交易打包壓縮,以「批次」的形式送回以太坊 L1 主網永久存證。在 2024 年以太坊進行 Dencun 升級(引入 EIP-4844)之前,L2 只能把資料塞在昂貴的
calldata中;Dencun 升級後,以太坊開闢了專門存放短暫歷史資料的「Blob 空間」,使得資料提交成本降低 90% 以上!
這項基礎設施的突破,才讓我們今天得以在課堂上毫無負擔地為每位同學提供流暢的鏈上操作體驗。
7.5 課堂實戰:從安裝數位錢包到領取學習代幣 100 MLC
請所有同學一步一步完成接下來的操作。如果在任何一個步驟遇到疑問,隨時舉手或向同組夥伴求助。
• 最佳環境:強烈建議使用個人筆記型電腦+桌面版 Chrome / Brave / Edge 瀏覽器。
• 平板/手機/未帶筆電同學:請與同組夥伴「併機共學」,一人操作一人查核;課後再於個人電腦上依照本教學補齊個人錢包與領幣流程。
第一步:安裝 MetaMask 錢包(含防釣魚指引)
在安裝錢包之前,老師必須再三強調 Web3 世界的第一條生存法則:永遠、永遠只從官方網站下載軟體!在搜尋引擎上直接搜尋「MetaMask」,常會出現購買關鍵字廣告的假冒釣魚網站,一旦下載了帶有後門的偽造擴充套件,未來的資產將被瞬間洗劫[9];這與 2025 年 2 月 Bybit 事件的慘痛教訓如出一轍——當時遭到攻擊的並非交易所自身,而是交易所使用的第三方多簽介面 Safe{Wallet} 遭植入惡意 JavaScript,導致簽署視窗顯示的內容與真實交易被調包[10]。
- 請直接在 Chrome 或 Brave / Edge 瀏覽器網址列輸入官方網址:
https://metamask.io。 - 點擊首頁的「Download」按鈕,網站會自動偵測你的瀏覽器類型。
- 點擊「Install MetaMask for Chrome」,系統將引導你進入官方的 Chrome 線上應用程式商店。
- 點擊「加到 Chrome」(Add to Chrome)。安裝完成後,請點擊瀏覽器右上角的拼圖圖示(擴充功能管理員),找到橘色小狐狸圖示,將它「釘選(Pin)」在工具列上,方便後續隨時叫出。
第二步:建立新錢包與守護助記詞的「黃金三律」
安裝完成後,MetaMask 會自動彈出歡迎頁面:
- 勾選同意服務條款,並點擊「建立新錢包」(Create a new wallet)。
- 設定一組「應用程式解鎖密碼」(至少 8 碼)。請注意:這個密碼只用來保護當前這台電腦上的瀏覽器擴充功能,它並不是你的鏈上私鑰!
- 接著進入最重要的畫面:系統將顯示由 12 個英文單字組成的「秘密復原詞」(助記詞,Seed Phrase)。
① 永不線上分享:絕對不要向任何人透露你的 12 個助記詞。任何自稱老師、助教、客服或官方人員向你索取助記詞,100% 是詐騙!
② 離線實體保存:立刻拿出一張紙與原子筆,將這 12 個英文單字按順序親手抄寫下來,妥善收納於錢夾或筆記本中。切勿截圖存入雲端相簿或傳送到 LINE 記事本!
③ 理解絕對主權:誰掌握了這 12 個單字,誰就擁有這個錢包內的一切資產。即使你的電腦損壞或遺失,只要有助記詞,就能在世界上任何一台電腦上完整還原資產。
第三步:認識你的 Web3 身分與公開地址
完成助記詞備份確認後,你就正式擁有了專屬的 Web3 身分儀表板:
- 在 MetaMask 介面正上方,顯示著你的帳戶名稱(Account 1)。
- 在名稱下方,有一串
0x開頭、加上 40 個十六進位字元(全長 42 個字元)的字串(例如0x71C...4982),這就是你的公開錢包地址(Public Address)。 - 它就像你的銀行帳號或電子郵件地址,可以安全地公開給任何人或網站,用來接收代幣或 NFT。點擊該字串即可一鍵複製。
第四步:登入老師建置領幣介面:測試幣(Web 2.0)和課程代幣(Web 3.0)
領取學習代幣 MLC 之前,你的錢包裡必須先有少量的 Base Sepolia 測試幣(ETH)——因為付給區塊鏈的手續費(Gas)是用 ETH 計算,不是用 MLC 付。這段順序不能顛倒:先確定分組 → 申領測試幣 → 再用測試幣去領 MLC。
在以太坊的交易模型裡,任何一筆交易(包含呼叫
claim() 領幣)都必須由發起人支付 Gas,而 Gas 只能用該鏈的原生幣(Base Sepolia 上就是測試 ETH)支付。所以「錢包餘額 0 ETH」不是錢包壞了,而是還沒有燃料。4-1 先確認你的組別(分組定案)
測試幣是「一人一份」的課堂資源,老師必須先確認同學們是否完成分組,才會發放。所以第一件事不是開表單,而是確認你的組別:
- W05 已用隨機演算法把全班分到 16 個動物代號小組(🦊 狐狸、🐨 無尾熊、🐼 貓熊 … 🦜 鸚鵡),經本週的最後調動後隨即定案。
- 在表單輸入時,以你實際所在的組別為準——填表單時要自己改過來,不要沿用系統自動帶出的舊組別。
- 後續的分組實作、期中個人驗收與期末團隊專案,都會用這套組別運作。
4-2 打開「申領測試幣」表單,填四個欄位
請在瀏覽器開啟新分頁,進入老師為本課架設的申領頁面:
- 學號:9 位數字。注意是學號,不是座號——填錯會出現「名單裡找不到這個學號」。
- 姓名。
- 組別:輸入學號後系統會自動帶出(例如「第 2 組 · 無尾熊組」)。若你已協調換組,直接改成實際組別。
- 錢包地址:MetaMask → 點最上方帳號名稱 → 「複製地址」,貼上
0x開頭、共 42 個字元的字串。
(兩個常見錯誤:① 貼成交易所的入金地址——那不是你的錢包,收不到;② 只複製到一部分,長度不足會被表單擋下。)
按下「送出申請」後,畫面會顯示綠色「已送出」與申請時間。每人只需填一次;重複送出不會重複發放,系統會提示你原本的申請時間。
🛡️ 這份表單會收集什麼?會不會被騙走資產?
4-3 等老師核對組別,統一發送 0.0001 ETH
送出申領測試幣表單後不會立刻收到錢,這是刻意設計的。老師會在後台逐筆檢查「學號 ↔ 組別 ↔ 錢包地址」,確認組別已完成後,才統一將 0.0001 Base Sepolia ETH 發送到你的地址。等待期間請先往下讀第五步的錢包連線流程。
4-4 在 MetaMask 確認測試幣已入帳
- 打開 MetaMask,確認網路在 Base Sepolia(若選單裡還沒有,第五步進入領幣平台時會自動引導你加入)。
- 主畫面餘額應顯示約 0.0001 ETH——這就是你的鏈上燃料。
- 若仍顯示 0:先確認網路是否正確、地址是否與表單填的一致;還有問題請課堂舉手,不要自己跑去外部水龍頭(原因見下)。
🔍 為什麼不叫同學自己去公開水龍頭(Faucet)領?
4-5 燃料到手,前往 MLC 領幣平台(Web 3.0)
錢包裡有測試幣之後,才進入真正與智慧合約互動的介面:
現在,請在瀏覽器中開啟新分頁,進入老師親自為本堂課建置的專屬 Web3 領幣平台:
第五步:連接錢包與一鍵切換至 Base Sepolia
- 點擊網頁右上角的「連接錢包」(Connect Wallet)按鈕。
- 你的 MetaMask 會彈出連線請求視窗。請注意視窗上的說明:網站請求的是「檢視你的地址與帳戶活動」——這是唯讀權限,網站無法擅自轉走你的任何資產,點擊「連線」是安全的。
- 若你的錢包目前處於以太坊主網或其他網路,老師建置的領幣介面會自動偵測,並彈出提示引導你「一鍵切換至 Base Sepolia 測試網」。在 MetaMask 彈出的確認視窗中點擊「確認授權(Approve)」並「切換網路(Switch Network)」,介面將自動完成 RPC 配置,無須手動輸入參數![7]
第六步:輸入通關密碼,領取 100 MLC!
連線成功後,介面會顯示你已連線的錢包地址與你的動物代號。
- 現在,老師正式公布本日課堂通關密語:
【課堂現場口頭公布】 - 請將這組密語完整輸入至網頁的「通關密碼」輸入框中。
- 點擊那顆醒目的「領取 100 MLC」按鈕!
- 這時,你的 MetaMask 會第二次彈出——這一次是「交易簽名授權(Confirm Transaction)」。你會看到即將執行的合約互動,以及一筆微乎其微的測試 Gas 費用預估(約 0.000005 Base Sepolia ETH,測試幣無真實現金價值)。請毫不猶豫地按下「確認(Confirm)」!
- 靜候 2 秒鐘(感受 Layer 2 的秒級出塊速度),網頁將彈出璀璨的慶祝畫面:「🎉 恭喜!100 枚 MLC 已成功入帳!」
第七步:手動匯入自訂代幣至 MetaMask
有些同學領取成功後打開錢包,卻驚呼:「老師,為什麼資產清單還是只有 0 ETH,看不到 MLC?」
別慌張!這是因為 MetaMask 預設只顯示原生代幣(ETH)。世界上有數以百萬計的 ERC-20 代幣,錢包不可能預載所有代幣,我們必須主動告訴錢包這個新資產的合約地址:
- 打開 MetaMask,切換到「代幣(Tokens)」分頁,往下滑動點擊「匯入代幣(Import tokens)」。
- 在「代幣合約地址」欄位中,貼上老師部署的 MLC 智慧合約地址:
【課堂現場公布,亦同步展示於領幣 dApp 介面中】
(請務必直接從老師的領幣平台上點擊複製合約地址,絕不從未經驗證的外部訊息取址,這正是 Web3 防釣魚的最高原則!) - 系統會自動帶出代幣名稱
drMarcoLab Coin、代幣符號MLC與小數位數18。點擊「新增自訂代幣」並確認「匯入代幣」。 - 回到錢包主畫面,你將親眼看見 100 MLC 昂然列在你的資產儀表板中!
第八步:前往 BaseScan 檢驗鏈上鐵證
Web 3.0 最迷人的特質,是所有紀錄都在全世界共享的公開總帳上可查、可驗、不可竄改!
- 在 MetaMask 點擊剛才那筆「合約互動」交易,或點擊選單中的「在區塊鏈瀏覽器中檢視(View on explorer)」。
- 瀏覽器將開啟 BaseScan (Base Sepolia Explorer)。
- 請找到以下三個鐵證標記:
- Transaction Hash(交易雜湊):這串
0x加上 64 個十六進位字元(全長 66 個字元)的唯一識別碼,是這筆交易在區塊鏈上永恆存在的身分證。 - Status: Success:代表保鑣
require()全數放行,狀態已安全寫入區塊。 - ERC-20 Tokens Transferred:你會看見一條清楚的紀錄——從零地址
0x000...000(鑄造)轉移了100 MLC至你的個人地址!
- Transaction Hash(交易雜湊):這串
第九步:課堂常見現場 Q&A 與架構師除錯心法
在課堂現場操作鏈上交易時,遇到異常不要慌張,這正是最棒的學習機會:
Q1:為什麼領取失敗被 Revert 了,錢包依然被扣了一點點 Gas 費用?
require() 發現條件不符之前,全球驗證節點已為你分配了運算資源來執行該筆程式碼。這筆微量的工本費正是用來補償節點的算力付出;更重要的是,它是區塊鏈對抗 DoS 攻擊的核心防線——如果失敗交易完全免費,攻擊者便能零成本發送海量垃圾交易來癱瘓整個網路。
Q2:我的交易狀態一直停在「處理中(Pending)」沒有反應怎麼辦?
1. 靜候 30~60 秒:Layer 2 排序器偶爾有短暫排隊,多數情況稍等即可打包。
2. 直接至 BaseScan 查驗:點擊該筆交易的「在區塊瀏覽器中檢視」,若網頁已顯示 Success,代表鏈上早已完成,只是前端尚未即時更新,重新整理領幣網頁即可。
3. 舉手求助:若超過 2 分鐘 BaseScan 仍無記錄,請直接舉手向老師或助教反映。切勿自行在錢包點擊「加速」或「取消」——在 Layer 2 排序器架構下,自行加速往往只是徒增無效簽署與重複扣費。
Q3:我在錢包中看到 100 MLC,但在 BaseScan 上要怎麼證明這不是我自己隨便改的?
Transfer(address from, address to, uint256 value) 的原始事件日誌。這個由密碼學雜湊簽名擔保的事件,是全球任何人都無法偽造或刪除的鏈上鐵證!
7.6 本週總結、開發環境預告與日誌引導
恭喜大家!在今天這短短兩堂課的時間裡,我們完成了一趟不可思議的跨越:
- 我們完成全班 16 組的確認與最終定案,確立了未來團隊協作的戰鬥梯隊。
- 我們從需求分析的角度,解構了老師在規劃 MLC 專案時面臨真實的權衡思考。
- 我們透過「自動販賣機」模型,理解了智慧合約的記憶庫、功能按鈕與隨身保鑣
require()。 - 我們跨越了 2025 年以太坊 L1 的塞車痛點,直接擁抱 2026 年最新的 Layer 2(Base Sepolia)擴容標準。
- 最重要的是——每一位同學都安全建立了個人錢包,親自發起交易,並在公有鏈上留下了自己不可磨滅的數位足跡!
🎯 章末五分鐘自我檢核(提取練習)
在關閉本週教科書前,請完成三道檢核,試著先不要看答案,回答以下三個核心問題:
檢核 1(需求分析):老師為 MLC 專案定義的三條剛性約束是什麼?
檢核 2(架構決策):為什麼老師不選「白名單」,而選「課堂共享密碼」?
檢核 3(L2 演進):用一句話向朋友解釋:為什麼小額交易要搭「接駁巴士」?
下週預告(第 8 週):開發環境建置入門(IDE & AI Agent)
今天,大家站在使用者的角度,體驗了老師設計並部署的智慧合約。那麼,從下一週開始,角色將徹底反轉——換你們親手來寫合約了!
📝 本週每週學習/開發日誌任務
教學計畫明定每週開發日誌為重要平時評量依據。請同學於截止日前,依據第一題的說明完成作業並繳交至 iClass 平台:
一、Web3 鏈上體驗真實日誌(使用者視角)
記錄你今天從安裝 MetaMask、抄寫助記詞、連線老師的專屬 dApp,到成功領取 100 MLC 的完整過程。在親眼看到 BaseScan 上的交易記錄之前,你對區塊鏈的理解是什麼?完成領取後,你的觀感發生了什麼質變?附上你的錢包公開地址、Transaction Hash 與兩張里程碑截圖。
二、發揮設計思維 — 構想你的一台鏈上自動販賣機(架構師視角)
借鏡老師為 MLC 代幣設計的「自動販賣機」思維,思考一個你想在期中或期末專案實現的應用(例如:社團保證金退費機、校園二手書授權合約、組隊專案投票箱)。試著以架構師的角度回答以下三題:
1. 合約需要「記住」什麼?(定義至少兩個關鍵的狀態變數)
2. 合約需要提供什麼「操作」?(定義至少一個讓使用者呼叫的函式)
3. 保鑣 require() 需要檢查什麼?(列出至少兩條防止他人作惡的安全防線)