在 MAGNE 測試網上開發 DApp
為開發者提供的指南,說明如何使用 Ethers.js 在 MAGNE L1 及 M Hash L2 測試網上開發去中心化應用程式。
僅限測試網 — 本指南僅適用於測試網 DApp 開發。MAGNE L1 測試網及 M Hash L2 測試網為 EVM 相容環境。測試網代幣不具貨幣價值。網路參數可能隨測試進展而變動。
- 支援標準以太坊開發工具及函式庫
- 支援 Ethers.js、Wagmi、Viem 及其他 Web3 函式庫
- 相容於 MetaMask、WalletConnect 及其他錢包
- 可使用 React、Vue 或原生 JavaScript 建置前端 UI
DApp 架構
前端 UI
使用 React、Vue 或原生 HTML/JS 建置使用者介面
錢包連接
MetaMask、WalletConnect 或其他 Web3 錢包
RPC 提供者
使用 Ethers.js 或 viem 與區塊鏈互動
智慧合約
您在測試網上部署的合約
交易追蹤
透過區塊瀏覽器追蹤確認狀態
網路常數
JavaScript 設定
export const MAGNE_L1_TESTNET = {
chainId: '0x' + (20250810).toString(16),
chainName: "MAGNE L1 Testnet",
nativeCurrency: {
name: "MHA",
symbol: "MHA",
decimals: 18
},
rpcUrls: ["https://rpc.testnet.magicalhash.com"],
blockExplorerUrls: ["https://explorer.testnet.magicalhash.com"]
};
export const M_HASH_L2_TESTNET = {
chainId: '0x' + (20250827).toString(16),
chainName: "M Hash L2 Testnet",
nativeCurrency: {
name: "MHA",
symbol: "MHA",
decimals: 18
},
rpcUrls: ["https://l2-rpc.testnet.magicalhash.com"],
blockExplorerUrls: ["https://l2-explorer.testnet.magicalhash.com"]
};
錢包連接範例
請求帳戶存取權
import { ethers } from 'ethers';
const provider = new ethers.BrowserProvider(window.ethereum);
async function connectWallet() {
try {
const accounts = await provider.send("eth_requestAccounts", []);
console.log("Connected:", accounts[0]);
return accounts[0];
} catch (error) {
console.error("Connection rejected:", error.message);
}
}
切換網路
async function switchToL1() {
try {
await window.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0x' + (20250810).toString(16) }],
});
} catch (switchError) {
console.error("Switch failed:", switchError.message);
}
}
async function addNetwork() {
try {
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [MAGNE_L1_TESTNET],
});
} catch (addError) {
console.error("Add network failed:", addError.message);
}
}
提示:請先呼叫 switchToL1。若因找不到網路而失敗,請呼叫 addNetwork 將網路新增至錢包。
讀取合約範例
import { ethers } from 'ethers';
const CONTRACT_ADDRESS = "your_deployed_contract_address";
const ABI = [
"function message() view returns (string)",
"function setMessage(string newMessage)"
];
async function readContract() {
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, signer);
try {
const message = await contract.message();
console.log("Current message:", message);
return message;
} catch (error) {
console.error("Read failed:", error.message);
}
}
寫入合約範例
async function writeContract(newMessage) {
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, signer);
try {
const tx = await contract.setMessage(newMessage);
console.log("Transaction sent:", tx.hash);
// 等待確認
const receipt = await tx.wait();
console.log("Confirmed:", receipt.hash);
return receipt;
} catch (error) {
if (error.message.includes("user rejected")) {
console.log("Transaction rejected by user");
} else {
console.error("Transaction failed:", error.message);
}
}
}
使用者流程:呼叫寫入函數時,錢包會提示使用者審查並核准交易。若使用者不認同該操作,可以拒絕。
交易追蹤
追蹤交易狀態
function getExplorerUrl(chainId, txHash) {
const explorers = {
20250810: "https://explorer.testnet.magicalhash.com",
20250827: "https://l2-explorer.testnet.magicalhash.com"
};
return `${explorers[chainId]}/tx/${txHash}`;
}
async function trackTransaction(tx) {
console.log(`View on explorer: ${getExplorerUrl(20250810, tx.hash)}`);
// 等待 1 次確認
const receipt = await tx.wait(1);
if (receipt.status === 1) {
console.log("Transaction successful!");
} else {
console.log("Transaction failed!");
}
}
UI / UX 注意事項
- 顯示網路名稱 — 在 UI 中顯示目前網路(MAGNE L1 或 M Hash L2),讓使用者知道所在位置
- 顯示測試網警告 — 清楚顯示橫幅提示目前為測試網環境
- 顯示交易狀態 — 呈現待處理、已確認或失敗等狀態
- 提供瀏覽器連結 — 提供區塊瀏覽器上交易及合約頁面的連結
- 優雅處理錢包拒絕 — 當使用者拒絕交易時,應妥善處理
- 處理網路不符 — 提示使用者切換至正確的網路
- 顯示 Gas 估算 — 在確認前顯示預估交易費用
安全注意事項
⚠️ 安全要求
請勿向使用者要求助記詞或私鑰。正規的 DApp 無需這些憑證。
請勿將私鑰儲存在前端程式碼、localStorage 或 cookies 中。
請使用專用測試錢包進行所有測試網開發。
測試網代幣不具貨幣價值。
智慧合約及 DApp 範例僅供測試及教育用途。在正式環境使用前,請務必審計程式碼。
疑難排解
錢包未偵測到
請確認使用者已安裝 Web3 錢包(如 MetaMask、Rabby 等)。請檢查 window.ethereum 是否可用。
選錯網路
請使用正確的 chainId 呼叫 wallet_switchEthereumChain。若網路錯誤,請向使用者顯示提示以切換網路。
使用者拒絕請求
請妥善處理拒絕情況。可透過 error.message.includes("user rejected") 來識別此情況。
RPC 逾時
請檢查您的網路連線。請嘗試重新整理頁面。若持續發生,RPC 可能正在維護中。
找不到合約地址
請確認合約已部署至正確的網路。請檢查錢包中連接的網路是否符合預期。
交易待處理
請在區塊瀏覽器中查看待處理狀態。L2 交易通常比 L1 更快確認。
Gas 估算失敗
這通常表示交易可能會失敗。請檢查合約狀態、參數及錢包餘額。