第 7 週:專案發想與智慧合約設計思維

115/10/30(五) | 授課教師:馬可博士 / 李正冬 | 淡江大學 資訊管理學系

在前幾堂的課程裡,我們探討了 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 掃個條碼就能買瓶自動販賣機裡的運動飲料。這就是所謂的「隔著毛玻璃」——如果沒有真正把一把私鑰握在自己手裡,沒有親眼看著一筆交易被打包上鏈,很難對「去中心化」產生任何真實的體感。

「光靠理論與公式,永遠無法教會一個孩子游泳;唯有當他親自躍入水中,感受到浮力與水流的阻力時,水性才真正建立。」
軟體工程與教學設計的永恆實務準則

正是因為這個念頭,在學期初規劃課程進度時,我就在自己的筆記本上寫下了一個明確的挑戰:

「我要為『Web3 的應用與實務』這門課的每一位同學,親手建置一套簡單且有趣且極度安全的專屬活動。大家在課堂上可以親自完成真實的鏈上交易,親眼見證專屬於這門課的數位資產,真正且永久地進入自己的錢包。」

這就是 MLC(drMarcoLab Coin / 課程學習代幣)專案發起的起源。

今天這一堂課,老師的角色更是這套系統的產品經理(Product Manager)與架構工程師。我會將我從「零」開始發想這個專案時所面臨的需求痛點、技術決策的權衡(Trade-offs)、系統架構的邊界劃分,乃至於智慧合約狀態機的防護思維,一五一十地拆解給大家看。

課堂兩大里程碑:分組定案與真實領幣

為了讓大家能夠扎實吸收,本週課堂設計了兩個緊密扣合的里程碑:

💡 課堂暖身思考:如果你是這門課的助教或系統架構師,老師要求你設計一個「讓全班 94 人領取代幣」的系統,你最擔心的第一個工程問題會是什麼?是同學們沒有安裝錢包?密碼外洩?還是有人寫程式把代幣一次領光?請帶著你的直覺,我們進入 7.2 節的需求分析。
建立最佳專案的起點,從來不是急著打開編輯器敲程式碼,而是從最嚴謹的「需求分析」開始。老師在設計這套系統時,面臨了哪些兩難?

7.2 需求分析:專案的架構決策與邊界

大家可能在「系統分析與設計」課程中學過需求分析。但在真實的 Web3 世界中,需求分析之所以極端困難,是因為區塊鏈具有一項殘酷的特質:程式碼一旦部署上鏈,就無法輕易還原,任何邏輯漏洞都會直接暴露在公網之上。

當我著手設計 MLC 領幣系統時,我首先回答了軟體工程中最經典的兩個根本問題:

  1. The Who(我們在為誰服務?)
  2. The What(系統到底要完成什麼核心功能?)

一、使用者對象分析(The Who)

這個系統的使用者非常具體,就是淡江資管系選修「Web3 的應用與實務」的 94 位同學。但在工程設計上,這群使用者具備以下關鍵特質:

二、核心功能定義(The What)

目標看似單純:發放代幣。但拆解成系統規格,必須滿足以下三項剛性約束:

  1. 身分合規驗證:只有本堂課的同學可以領取,不能被校外陌生人隨意撈取。
  2. 防重複領取(One-Time Claim):每位同學只能領取一次,不能反覆點擊重複提領。
  3. 定量精確發放:每次驗證成功,合約精確發放 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 專案中,老師劃定了嚴格的架構邊界:

🔍 深入思考:為什麼合約裡不能儲存「明文密碼」,而必須儲存「密碼的雜湊值(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() 時,保鑣會不假思索地盤問三個問題:

  1. 「這個地址,是不是已經領過了?」
    require(!hasClaimed[msg.sender], "Error: Address has already claimed tokens.");
    如果 hasClaimed[msg.sender] 已經是 true,保鑣立刻亮紅燈。
  2. 「輸入的通關密語,雜湊後是否與 secretHash 一致?」
    require(keccak256(abi.encodePacked(_secret)) == secretHash, "Error: Invalid secret code.");
    合約把傳入的字串現場進行一次 Keccak-256 運算,若比對不符,立刻擋下。
  3. 「發放這 100 枚代幣後,總發行量會不會超過本課程預設的上限(maxSupply = 20,000 MLC)?」
    require(totalSupply() + claimAmount <= maxSupply, "Error: Exceeds maximum supply.");
    嚴格控制總量,防止無限增發導致代幣通膨。
「只要 require() 中的任何一項條件為 false,以太坊虛擬機會立刻觸發『狀態回滾(Revert)』——合約的所有變更全部撤銷,宛如什麼都沒發生過;同時將剩餘未消耗的 Gas 立即退還給使用者。」
以太坊虛擬機(EVM)原子性執行原則(Atomicity)

這就是智慧合約強悍的地方:要嘛全部成功,要嘛徹底回滾,絕不存在「密碼錯誤卻被扣除代幣」或「代幣發了但狀態沒改」的中間灰階狀態!

四、深入底層:EVM 儲存槽(Storage Slots)與狀態機成本

在傳統關聯式資料庫(如 MySQL)中,新增一張資料表或寫入一行記錄,成本幾乎是微秒級的硬碟讀寫;但在以太坊虛擬機(EVM)中,每一次寫入 storage,背後都需要全球成千上萬台節點永久同步並維護該狀態。

以太坊將智慧合約的永久儲存空間劃分為以 32 位元組(256 位元)為單位的「儲存槽」(Storage Slots)。在 EVM 的操作碼(Opcode)定價中:

因此老師在設計合約時,嚴格遵循「最小鏈上狀態原則」——我們只使用一個 mapping(address => bool) 來記錄已領取標記,而不去建立一個動態增長的 address[] 陣列去遍歷比對。遍歷陣列一個個慢慢找,領的人越多手續費暴增,甚至可能突破單一區塊的 Gas 限制(Block Gas Limit)導致交易永遠失敗;而採用 mapping 則是常數級雜湊定址,省錢又省錢,這才是優秀的智慧合約架構思維!

有了合約邏輯,我們該把它部署在哪裡?過去我們都在以太坊主網或 L1 測試網玩,但為什麼在 2026 年,老師決定帶大家全面轉向 Layer 2?

7.4 為什麼 2026 年老師帶大家航向 Layer 2(Base Sepolia)?

去年(2025 年),本課程的領幣體驗建立在以太坊的原生 Sepolia 測試網(Layer 1)。今年我有不同的考量:

一、擴容演進:以太坊的「不可能三角」與接駁巴士隱喻

以太坊創辦人 Vitalik Buterin 提出的「區塊鏈不可能三角」(Blockchain Trilemma)指出:任何分散式帳本網路,都很難同時兼顧去中心化(Decentralization)、安全性(Security)與可擴展性/效能(Scalability)。

以太坊主網(Layer 1)選擇了極致的「去中心化」與「安全性」,其代價就是主幹道頻寬極度有限(犧牲了可擴展性及效態)。當全世界的交易都想擠上這條單線道時,過路費(Gas)自然水漲船高。

那麼,全球區塊鏈社群是如何解決這個問題的?答案就是 Layer 2(第二層擴容技術),特別是 Rollup 技術!

「不要所有的車都上國道高速公路(會塞車)。我們在交流道旁建置「接駁巴士站」:數百名乘客(交易)先登上接駁巴士(Sequencer 打包執行),接著巴士只派一位司機載所有乘客開上國道(提交一份壓縮過的交易批次與狀態根)。」
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]。這項決策背後有著清晰的工程考量:

  1. 秒級出塊,體驗極速:Base Sepolia 的出塊時間僅需 2 秒!同學在網頁按下「領取」後,錢包確認簽署,立即可收到交易成功的提示。
  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 位同學進行上萬次鏈上互動,徹底告別過去被水龍頭刁難的痛苦!
  3. 產業實務趨勢接軌:目前全球主流的消費級 Web3 應用(如社交協議 Farcaster、各類鏈上遊戲與微支付),絕大多數都選擇建構在 Base 生態上。我們在課堂上直接練習 Base 網路,了解產業當前最熱門的實戰規格!
📌 2026 技術環境規格卡
• 網路名稱: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 交易費用的兩大組成:

  1. L2 執行費用(L2 Execution Fee):Base 網路內部由排序器(Sequencer)執行這筆交易並更新狀態的成本。由於 Base 節點硬體負載低、頻寬充裕,這部分的 Gas 費極端低廉。
  2. L1 資料可用性費用(L1 Data Fee / Rollup Data Fee):排序器必須將成千上萬筆 L2 交易打包壓縮,以「批次」的形式送回以太坊 L1 主網永久存證。在 2024 年以太坊進行 Dencun 升級(引入 EIP-4844)之前,L2 只能把資料塞在昂貴的 calldata 中;Dencun 升級後,以太坊開闢了專門存放短暫歷史資料的「Blob 空間」,使得資料提交成本降低 90% 以上!

這項基礎設施的突破,才讓我們今天得以在課堂上毫無負擔地為每位同學提供流暢的鏈上操作體驗。

理論與架構全部就緒!現在,請打開筆電與 Chrome 瀏覽器,我們要進入今天的實戰——從安裝錢包,到領取屬於你的第一筆鏈上代幣!

7.5 課堂實戰:從安裝數位錢包到領取學習代幣 100 MLC

請所有同學一步一步完成接下來的操作。如果在任何一個步驟遇到疑問,隨時舉手或向同組夥伴求助。

💻 開始前的 30 秒設備與安全確認:
• 最佳環境:強烈建議使用個人筆記型電腦+桌面版 Chrome / Brave / Edge 瀏覽器。
• 平板/手機/未帶筆電同學:請與同組夥伴「併機共學」,一人操作一人查核;課後再於個人電腦上依照本教學補齊個人錢包與領幣流程。

第一步:安裝 MetaMask 錢包(含防釣魚指引)

在安裝錢包之前,老師必須再三強調 Web3 世界的第一條生存法則:永遠、永遠只從官方網站下載軟體!在搜尋引擎上直接搜尋「MetaMask」,常會出現購買關鍵字廣告的假冒釣魚網站,一旦下載了帶有後門的偽造擴充套件,未來的資產將被瞬間洗劫[9];這與 2025 年 2 月 Bybit 事件的慘痛教訓如出一轍——當時遭到攻擊的並非交易所自身,而是交易所使用的第三方多簽介面 Safe{Wallet} 遭植入惡意 JavaScript,導致簽署視窗顯示的內容與真實交易被調包[10]。

  1. 請直接在 Chrome 或 Brave / Edge 瀏覽器網址列輸入官方網址:https://metamask.io。
  2. 點擊首頁的「Download」按鈕,網站會自動偵測你的瀏覽器類型。
  3. 點擊「Install MetaMask for Chrome」,系統將引導你進入官方的 Chrome 線上應用程式商店。
  4. 點擊「加到 Chrome」(Add to Chrome)。安裝完成後,請點擊瀏覽器右上角的拼圖圖示(擴充功能管理員),找到橘色小狐狸圖示,將它「釘選(Pin)」在工具列上,方便後續隨時叫出。

第二步:建立新錢包與守護助記詞的「黃金三律」

安裝完成後,MetaMask 會自動彈出歡迎頁面:

  1. 勾選同意服務條款,並點擊「建立新錢包」(Create a new wallet)。
  2. 設定一組「應用程式解鎖密碼」(至少 8 碼)。請注意:這個密碼只用來保護當前這台電腦上的瀏覽器擴充功能,它並不是你的鏈上私鑰!
  3. 接著進入最重要的畫面:系統將顯示由 12 個英文單字組成的「秘密復原詞」(助記詞,Seed Phrase)。
助記詞黃金三律(嚴格遵守):
① 永不線上分享:絕對不要向任何人透露你的 12 個助記詞。任何自稱老師、助教、客服或官方人員向你索取助記詞,100% 是詐騙!
② 離線實體保存:立刻拿出一張紙與原子筆,將這 12 個英文單字按順序親手抄寫下來,妥善收納於錢夾或筆記本中。切勿截圖存入雲端相簿或傳送到 LINE 記事本!
③ 理解絕對主權:誰掌握了這 12 個單字,誰就擁有這個錢包內的一切資產。即使你的電腦損壞或遺失,只要有助記詞,就能在世界上任何一台電腦上完整還原資產。
 Web3 資安鐵律

第三步:認識你的 Web3 身分與公開地址

完成助記詞備份確認後,你就正式擁有了專屬的 Web3 身分儀表板:

第四步:登入老師建置領幣介面:測試幣(Web 2.0)和課程代幣(Web 3.0)

領取學習代幣 MLC 之前,你的錢包裡必須先有少量的 Base Sepolia 測試幣(ETH)——因為付給區塊鏈的手續費(Gas)是用 ETH 計算,不是用 MLC 付。這段順序不能顛倒:先確定分組 → 申領測試幣 → 再用測試幣去領 MLC。

⛽ 為什麼一定要先有測試幣?
在以太坊的交易模型裡,任何一筆交易(包含呼叫 claim() 領幣)都必須由發起人支付 Gas,而 Gas 只能用該鏈的原生幣(Base Sepolia 上就是測試 ETH)支付。所以「錢包餘額 0 ETH」不是錢包壞了,而是還沒有燃料。

4-1 先確認你的組別(分組定案)

測試幣是「一人一份」的課堂資源,老師必須先確認同學們是否完成分組,才會發放。所以第一件事不是開表單,而是確認你的組別:

4-2 打開「申領測試幣」表單,填四個欄位

請在瀏覽器開啟新分頁,進入老師為本課架設的申領頁面:

🪙 2026 MLC 課程測試幣申領表單
https://m2772.drmarcolab.cloud/w07-testcoin.html
  1. 學號:9 位數字。注意是學號,不是座號——填錯會出現「名單裡找不到這個學號」。
  2. 姓名。
  3. 組別:輸入學號後系統會自動帶出(例如「第 2 組 · 無尾熊組」)。若你已協調換組,直接改成實際組別。
  4. 錢包地址:MetaMask → 點最上方帳號名稱 → 「複製地址」,貼上 0x 開頭、共 42 個字元的字串。
    (兩個常見錯誤:① 貼成交易所的入金地址——那不是你的錢包,收不到;② 只複製到一部分,長度不足會被表單擋下。)

按下「送出申請」後,畫面會顯示綠色「已送出」與申請時間。每人只需填一次;重複送出不會重複發放,系統會提示你原本的申請時間。

🛡️ 這份表單會收集什麼?會不會被騙走資產?
只收集四項:學號、姓名、組別、錢包地址,僅用於發放測試幣與核對名單。不會、也不需要你的助記詞或私鑰——任何人(包含自稱老師或助教的人)跟你要這兩個,都是詐騙。想更換錢包地址請直接在課堂上找老師,表單一人只能填一次。

4-3 等老師核對組別,統一發送 0.0001 ETH

送出申領測試幣表單後不會立刻收到錢,這是刻意設計的。老師會在後台逐筆檢查「學號 ↔ 組別 ↔ 錢包地址」,確認組別已完成後,才統一將 0.0001 Base Sepolia ETH 發送到你的地址。等待期間請先往下讀第五步的錢包連線流程。

4-4 在 MetaMask 確認測試幣已入帳

  1. 打開 MetaMask,確認網路在 Base Sepolia(若選單裡還沒有,第五步進入領幣平台時會自動引導你加入)。
  2. 主畫面餘額應顯示約 0.0001 ETH——這就是你的鏈上燃料。
  3. 若仍顯示 0:先確認網路是否正確、地址是否與表單填的一致;還有問題請課堂舉手,不要自己跑去外部水龍頭(原因見下)。
🔍 為什麼不叫同學自己去公開水龍頭(Faucet)領?
公開水龍頭為了擋機器人,常要求錢包裡已有主網資產、或必須通過鏈上信用評分——對剛辦好、餘額為 0 的錢包等於走不通;就算找到「挖礦型」水龍頭,全班同時連線也會被學校對外 IP 限流。由老師統一發送,等於把「取得燃料」從不可控的外部服務,改成課堂內可預期的流程。

4-5 燃料到手,前往 MLC 領幣平台(Web 3.0)

錢包裡有測試幣之後,才進入真正與智慧合約互動的介面:

現在,請在瀏覽器中開啟新分頁,進入老師親自為本堂課建置的專屬 Web3 領幣平台:

🌐 2026 MLC 課程代幣領取專屬平台入口
https://mlc2026.tohot.xyz/

(教室內請直接點擊上方連結或輸入網址,支援自動偵測錢包與自動切網)

第五步:連接錢包與一鍵切換至 Base Sepolia

  1. 點擊網頁右上角的「連接錢包」(Connect Wallet)按鈕。
  2. 你的 MetaMask 會彈出連線請求視窗。請注意視窗上的說明:網站請求的是「檢視你的地址與帳戶活動」——這是唯讀權限,網站無法擅自轉走你的任何資產,點擊「連線」是安全的。
  3. 若你的錢包目前處於以太坊主網或其他網路,老師建置的領幣介面會自動偵測,並彈出提示引導你「一鍵切換至 Base Sepolia 測試網」。在 MetaMask 彈出的確認視窗中點擊「確認授權(Approve)」並「切換網路(Switch Network)」,介面將自動完成 RPC 配置,無須手動輸入參數![7]

第六步:輸入通關密碼,領取 100 MLC!

連線成功後,介面會顯示你已連線的錢包地址與你的動物代號。

  1. 現在,老師正式公布本日課堂通關密語:
    【課堂現場口頭公布】
  2. 請將這組密語完整輸入至網頁的「通關密碼」輸入框中。
  3. 點擊那顆醒目的「領取 100 MLC」按鈕!
  4. 這時,你的 MetaMask 會第二次彈出——這一次是「交易簽名授權(Confirm Transaction)」。你會看到即將執行的合約互動,以及一筆微乎其微的測試 Gas 費用預估(約 0.000005 Base Sepolia ETH,測試幣無真實現金價值)。請毫不猶豫地按下「確認(Confirm)」!
  5. 靜候 2 秒鐘(感受 Layer 2 的秒級出塊速度),網頁將彈出璀璨的慶祝畫面:「🎉 恭喜!100 枚 MLC 已成功入帳!」

第七步:手動匯入自訂代幣至 MetaMask

有些同學領取成功後打開錢包,卻驚呼:「老師,為什麼資產清單還是只有 0 ETH,看不到 MLC?」

別慌張!這是因為 MetaMask 預設只顯示原生代幣(ETH)。世界上有數以百萬計的 ERC-20 代幣,錢包不可能預載所有代幣,我們必須主動告訴錢包這個新資產的合約地址:

  1. 打開 MetaMask,切換到「代幣(Tokens)」分頁,往下滑動點擊「匯入代幣(Import tokens)」。
  2. 在「代幣合約地址」欄位中,貼上老師部署的 MLC 智慧合約地址:
    【課堂現場公布,亦同步展示於領幣 dApp 介面中】

    (請務必直接從老師的領幣平台上點擊複製合約地址,絕不從未經驗證的外部訊息取址,這正是 Web3 防釣魚的最高原則!)
  3. 系統會自動帶出代幣名稱 drMarcoLab Coin、代幣符號 MLC 與小數位數 18。點擊「新增自訂代幣」並確認「匯入代幣」。
  4. 回到錢包主畫面,你將親眼看見 100 MLC 昂然列在你的資產儀表板中!

第八步:前往 BaseScan 檢驗鏈上鐵證

Web 3.0 最迷人的特質,是所有紀錄都在全世界共享的公開總帳上可查、可驗、不可竄改!

  1. 在 MetaMask 點擊剛才那筆「合約互動」交易,或點擊選單中的「在區塊鏈瀏覽器中檢視(View on explorer)」。
  2. 瀏覽器將開啟 BaseScan (Base Sepolia Explorer)。
  3. 請找到以下三個鐵證標記:
    • Transaction Hash(交易雜湊):這串 0x 加上 64 個十六進位字元(全長 66 個字元)的唯一識別碼,是這筆交易在區塊鏈上永恆存在的身分證。
    • Status: Success:代表保鑣 require() 全數放行,狀態已安全寫入區塊。
    • ERC-20 Tokens Transferred:你會看見一條清楚的紀錄——從零地址 0x000...000(鑄造)轉移了 100 MLC 至你的個人地址!

第九步:課堂常見現場 Q&A 與架構師除錯心法

在課堂現場操作鏈上交易時,遇到異常不要慌張,這正是最棒的學習機會:

Q1:為什麼領取失敗被 Revert 了,錢包依然被扣了一點點 Gas 費用?
解答:正如 7.3 節所述,當交易 Revert 恢復時,「尚未消耗的剩餘 Gas」會如數退還給發起者。但是,在程式執行到 require() 發現條件不符之前,全球驗證節點已為你分配了運算資源來執行該筆程式碼。這筆微量的工本費正是用來補償節點的算力付出;更重要的是,它是區塊鏈對抗 DoS 攻擊的核心防線——如果失敗交易完全免費,攻擊者便能零成本發送海量垃圾交易來癱瘓整個網路。
Q2:我的交易狀態一直停在「處理中(Pending)」沒有反應怎麼辦?
解答:在 Base Sepolia 上,正常出塊僅需 2 秒。若遇到卡住,請遵循新手除錯三步驟:
1. 靜候 30~60 秒:Layer 2 排序器偶爾有短暫排隊,多數情況稍等即可打包。
2. 直接至 BaseScan 查驗:點擊該筆交易的「在區塊瀏覽器中檢視」,若網頁已顯示 Success,代表鏈上早已完成,只是前端尚未即時更新,重新整理領幣網頁即可。
3. 舉手求助:若超過 2 分鐘 BaseScan 仍無記錄,請直接舉手向老師或助教反映。切勿自行在錢包點擊「加速」或「取消」——在 Layer 2 排序器架構下,自行加速往往只是徒增無效簽署與重複扣費。
Q3:我在錢包中看到 100 MLC,但在 BaseScan 上要怎麼證明這不是我自己隨便改的?
解答:這就是公開總帳的威力!在 BaseScan 搜尋你的地址,點開「Token Transfers (ERC-20)」分頁,你會看見一筆由 MLC 合約地址發出的轉帳事件(Event)。點進交易雜湊(Tx Hash),查看「Event Logs」,會看到 Transfer(address from, address to, uint256 value) 的原始事件日誌。這個由密碼學雜湊簽名擔保的事件,是全球任何人都無法偽造或刪除的鏈上鐵證!
📸 實作里程碑檢核:請截圖兩張畫面,保存在你的電腦中——一張是 MetaMask 顯示擁有 100 MLC 的畫面,另一張是 BaseScan 上顯示你那筆交易 Success 的網頁畫面。這兩張截圖將是本週開發日誌的核心證據!

7.6 本週總結、開發環境預告與日誌引導

恭喜大家!在今天這短短兩堂課的時間裡,我們完成了一趟不可思議的跨越:

🎯 章末五分鐘自我檢核(提取練習)

在關閉本週教科書前,請完成三道檢核,試著先不要看答案,回答以下三個核心問題:

檢核 1(需求分析):老師為 MLC 專案定義的三條剛性約束是什麼?
自我核對:① 身分合規驗證(僅限本堂修課同學)② 防重複領取(每地址限領一次,透過 hasClaimed 狀態變數防守)③ 定量發放(每次精確給予 100 MLC,受 maxSupply 上限保護)。
檢核 2(架構決策):為什麼老師不選「白名單」,而選「課堂共享密碼」?
自我核對:追求「體驗優先與零前置負擔」!若採白名單,課前只要有一位同學貼錯地址或未安裝錢包,現場就無法上鏈;共享密碼讓大家今天當場裝好錢包就能領取,把防守責任交給合約的 hasClaimed 狀態機。但是為了讓同學完成分組,以及申領測試幣,還是用收集名單的模式來發送測試幣。
檢核 3(L2 演進):用一句話向朋友解釋:為什麼小額交易要搭「接駁巴士」?
自我核對:以太坊主網是一條安全但狹窄的國道,每輛車(交易)都上去會造成大塞車與天價過路費;Rollup 接駁巴士在輔道將數百筆交易集中打包處理,只派一位司機上國道提交壓縮證明,大家平攤過路費,享受 2 秒極速與微量 Gas!

下週預告(第 8 週):開發環境建置入門(IDE & AI Agent)

今天,大家站在使用者的角度,體驗了老師設計並部署的智慧合約。那麼,從下一週開始,角色將徹底反轉——換你們親手來寫合約了!

📝 本週每週學習/開發日誌任務

教學計畫明定每週開發日誌為重要平時評量依據。請同學於截止日前,依據第一題的說明完成作業並繳交至 iClass 平台:

一、Web3 鏈上體驗真實日誌(使用者視角)

記錄你今天從安裝 MetaMask、抄寫助記詞、連線老師的專屬 dApp,到成功領取 100 MLC 的完整過程。在親眼看到 BaseScan 上的交易記錄之前,你對區塊鏈的理解是什麼?完成領取後,你的觀感發生了什麼質變?附上你的錢包公開地址、Transaction Hash 與兩張里程碑截圖。

二、發揮設計思維 — 構想你的一台鏈上自動販賣機(架構師視角)

借鏡老師為 MLC 代幣設計的「自動販賣機」思維,思考一個你想在期中或期末專案實現的應用(例如:社團保證金退費機、校園二手書授權合約、組隊專案投票箱)。試著以架構師的角度回答以下三題:
1. 合約需要「記住」什麼?(定義至少兩個關鍵的狀態變數)
2. 合約需要提供什麼「操作」?(定義至少一個讓使用者呼叫的函式)
3. 保鑣 require() 需要檢查什麼?(列出至少兩條防止他人作惡的安全防線)