iT邦幫忙

0

Day 27:輕量實作準備 — Remix 與 MetaMask 基本操作(教學)

  • 分享至 

  • xImage
  •  

接下來幾天我們會做實作(漏洞示範與修補)。在開始前請先準備好兩個工具:Remix IDE(線上 Solidity playground)與 MetaMask(瀏覽器錢包)。
今天重點是:如何在 Remix 啟用 JavaScript VM(內建模擬鏈)、建立假帳戶、部署合約、並觀察交易 log(包含 Events)。

🔧 準備環境(所需軟體)
• 瀏覽器:Chrome / Edge / Firefox(建議 Chrome)
• Remix IDE(網頁) → 打開 https://remix.ethereum.org
• MetaMask 擴充(若還沒安裝,請先到官方商店安裝並建立錢包)

提示:若只是用 Remix 的 JavaScript VM 做本地測試,實際並不需要把 MetaMask 連到 JS VM。

一、在 Remix 開啟專案與啟用 JS VM(步驟)
1. 打開 https://remix.ethereum.org
2. 左側欄選擇 File Explorers(檔案) → 點選 + 新增檔案,命名為 Vault.sol。
3. 在右側的 Solidity Compiler 面板,確認 Compiler 版本(我們用 ^0.8.20 系列)。
4. 切到 Deploy & Run Transactions 面板(小火箭圖示)。
• Environment 選單選 JavaScript VM (London)(或最新可用 JS VM)
• 你會看到 Remix 自動生成 10 個測試帳戶(右邊顯示帳戶地址與測試 ETH 餘額)

為何用 JS VM?
• JS VM 是完全本地的模擬鏈,不需連網、無實際花費,適合做攻防實驗與截圖。
• 每次刷新頁面會重置狀態(乾淨環境)。

二、貼上範例合約(可直接部署測試)

把下面合約貼到 Vault.sol:

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

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract SimpleVault is ReentrancyGuard, Ownable {
mapping(address => uint256) public balances;

// ✅ 傳入 msg.sender 給 Ownable 建構子
constructor() Ownable(msg.sender) {}

function deposit() external payable {
    require(msg.value > 0, "No ETH sent");
    balances[msg.sender] += msg.value;
}

function withdraw(uint256 amount) external nonReentrant {
    require(balances[msg.sender] >= amount, "Not enough balance");
    balances[msg.sender] -= amount;
    payable(msg.sender).transfer(amount);
}

}

備註:Remix 支援從 OpenZeppelin 直接 import(會自動解析)。若有 import 問題,可把 OpenZeppelin 相關代碼先複製到同一專案(不過通常 Remix 能自動處理)。

三、編譯與部署(使用 JS VM)
1. 切到 Solidity Compiler → 選擇合適的版本(0.8.20),按 Compile Vault.sol。
• 成功時會看到 Compilation successful。
• 若有錯誤,確認 pragma 與 import 路徑是否正確。
2. 切到 Deploy & Run Transactions(小火箭):
• Environment:Remix VM (Cancun)
• 從 Accounts 選一個預設帳戶(例如第一個)作為部署者(Owner)。
• Contract 下拉選 SimpleVault → 點 Deploy。
3. 部署成功後,Remix 左側下方會顯示剛部署的合約實例(帶有介面:deposit、withdraw、contractBalance、balance)。

https://ithelp.ithome.com.tw/upload/images/20251020/201789566DCnPS7LIA.png

四、在 JS VM 中做簡單互動(測試 deposit / withdraw)
1. 在 Deploy 區塊下方,找到 SimpleVault 已部署的合約實例。
2. Deposit(存款):
• 在 Remix 中找到 deposit 函式旁的 value 輸入框(默認 0)。
• 將 value 設為 1 並選單位 ether(Remix 支援單位選項),按 transact(按下 deposit)。
• 觀察右下方的 Transactions 紀錄(會出現一筆交易),並可點進去查看 Events(Deposited)及 tx 詳情。
3. 檢查 balance:
• 呼叫 balance(輸入部署者地址或使用預設帳戶)或 contractBalance() 來確認合約餘額。
4. Withdraw(提款):
• 在 withdraw 函式輸入 1000000000000000000(wei)或輸入 1 並選 ether(取決於 Remix 介面),點執行。
• 觀察交易回執與 Withdrawn event。
https://ithelp.ithome.com.tw/upload/images/20251020/20178956a0C6ECDFyJ.png
https://ithelp.ithome.com.tw/upload/images/20251020/20178956JrbONiN8qY.png

五、如何觀察 Transaction Log / Events(在 Remix 內)
• 每一次 transact 都會在 Remix 的 Deploy & Run 面板底部顯示一筆交易(hash、狀態、gasUsed)。
• 點選那筆交易可以看到細節:From / To / Value / Gas / Input data。
• 若合約 emit 了 event,會在交易詳情下方看到 Decoded Logs(事件名稱與參數)。

六、常見問題與排錯小技巧
• 無法 import OpenZeppelin?
Remix 有時會因網路或版本問題失敗,解法:把需要的 OpenZeppelin 合約直接複製到 Remix 專案(或使用 Remix 的 GitHub import 功能)。
• 部署失敗,顯示 Gas 或 revert?
點交易詳情看 revert 原因(Decoded Input / Error message),通常是 require 條件不滿足或 value 沒給對。
• 事件沒出現?
確認合約是否 emit event,並在交易詳情的 Decoded Logs 查看。有時 event 參數索引化(indexed)會影響可讀性。
• JS VM 每次刷新會被清掉:這是正常行為,用於每次從乾淨狀態重做實驗。

做實驗前的環境準備往往能決定學習的順利度。Remix 的 JS VM 提供了最簡單的循環式實驗平台:你可以快速驗證合約行為、觀察 event、模擬攻擊與修補,而不必擔心真實資金或延遲。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言