MyEtherWallet 恢復腳本編寫教學:安全找回以太坊錢包地址

本文僅供使用者在自己已備份助記詞、私鑰或 Keystore 的情況下,本地驗證錢包恢復結果。切勿從他人助記詞恢復或操作未經授權的資產。
一、先釐清:MEW 恢復腳本不是魔法鑰匙
MyEtherWallet 是常見以太坊錢包介面,它本身並不會替你保管助記詞或私鑰。所謂「恢復腳本」,本質上是利用以太坊通用的 HD 錢包標準,從你自己持有的資料派生出對應地址與私鑰。
真正能恢復錢包的關鍵資料通常包括:
- 助記詞:12 或 24 個英文單字,對應 BIP39 標準。
- 私鑰:64 位十六進字串,可直接控制錢包。
- JSON Keystore:以密碼加密後的私鑰檔案。
因此,腳本的目標不是「破解錢包」,而是完成以下三件事:
- 本地派生地址,避免把助記詞貼到陌生網站。
- 驗證備份是否可用,確認助記詞與派生路徑正確。
- 建立可重複使用的安全流程,方便日後檢查錢包狀態。
二、準備工作與安全原則
必須準備的資料
- 自己的 12 或 24 位助記詞。
- 或自己的 私鑰。
- 或自己的 JSON Keystore 檔案與解密密碼。
- 電腦上已安裝 Node.js 或 Python。
安全原則
- 只在可信來源安裝套件,例如官方 npm 或 PyPI。
- 不要將助記詞寫入日誌,例如不要執行
console.log(mnemonic)。 - 盡量使用環境變數,避免直接硬編碼到程式碼中。
- 先在隔離環境測試,可先安裝在乾淨目錄或容器內。
- 不要上傳私鑰、助記詞或 Keystore。
- 只操作自己擁有權限的資產。
三、方案 A:用 Node.js 從助記詞派生錢包地址
這個方案使用 ethers 套件,從助記詞和本機派生路徑取得以太坊地址。它適合驗證「助記詞 + 路徑」是否能得到你在 MEW、MetaMask 或其他 HD 錢包中看到的地址。
安裝
mkdir mew-recovery && cd mew-recovery
npm init -y
npm install ethers
建立腳本
建立檔案 recover.mjs:
import { ethers } from 'ethers';
async function main() {
const mnemonic = process.env.MEW_MNEMONIC;
if (!mnemonic) {
throw new Error('請先設定環境變數 MEW_MNEMONIC');
}
if (!ethers.Mnemonic.isValidMnemonic(mnemonic)) {
throw new Error('助記詞格式無效,請檢查是否有多餘空格或錯誤單字');
}
const path = process.env.MEW_PATH || `m/44'/60'/0'/0/0`;
const wallet = ethers.Wallet.fromPhrase(mnemonic, path);
console.log('派生路徑:', path);
console.log('錢包地址:', wallet.address);
}
main().catch((err) => {
console.error('恢復失敗:', err.message);
});
執行方式
macOS、Linux 或 WSL 示例:
MEW_MNEMONIC='your mnemonic words here' MEW_PATH="m/44'/60'/0'/0/0" node recover.mjs
Windows PowerShell 示例:

$env:MEW_MNEMONIC='your mnemonic words here'
$env:MEW_PATH="m/44'/60'/0'/0/0"
node recover.mjs
建議:不要直接把助記詞寫在歷史指令中。可以改用互動式輸入或短生命週期的環境變數。
四、方案 B:用 Python 從助記詞、私鑰與 Keystore 驗證地址
Python 方案適合需要批次驗證、離線分析或與其他工具整合的讀者。這裡使用 bip-utils 處理 HD 派生,使用 eth-account 處理私鑰與 Keystore。
安裝
python -m venv .venv
source .venv/bin/activate
pip install bip-utils eth-account
建立腳本
建立檔案 recover.py:
import os
import json
from eth_account import Account
from bip_utils import Bip39SeedGenerator, Bip44, Bip44Coins
def recover_from_mnemonic():
mnemonic = os.environ.get('MEW_MNEMONIC')
if not mnemonic:
raise ValueError('請設定環境變數 MEW_MNEMONIC')
seed = Bip39SeedGenerator(mnemonic).Generate()
path = os.environ.get('MEW_PATH', `m/44'/60'/0'/0/0`)
address = (
Bip44.FromSeed(seed, Bip44Coins.ETH)
.DerivePath(path)
.PublicKey()
.ToAddress()
)
print('派生路徑:', path)
print('助記詞地址:', address)
def recover_from_private_key():
private_key = os.environ.get('MEW_PRIVATE_KEY')
if not private_key:
return
address = Account.from_key(private_key).address
print('私鑰地址:', address)
def recover_from_keystore():
keystore_path = os.environ.get('MEW_KEYSTORE_PATH')
keystore_password = os.environ.get('MEW_KEYSTORE_PASSWORD')
if not keystore_path or not keystore_password:
return
with open(keystore_path, 'r', encoding='utf-8') as f:
keystore_data = json.load(f)
private_key = Account.decrypt(keystore_data, keystore_password)
address = Account.from_key(private_key).address
print('Keystore 地址:', address)
if __name__ == '__main__':
if os.environ.get('MEW_MNEMONIC'):
recover_from_mnemonic()
recover_from_private_key()
recover_from_keystore()
執行方式
export MEW_MNEMONIC='your mnemonic words here'
export MEW_PATH="m/44'/60'/0'/0/0"
python recover.py

五、方案 C:只從私鑰取得地址
如果你不依賴助記詞,而是直接擁有以太坊私鑰,可以透過私鑰還原錢包物件並取得地址。
import { ethers } from 'ethers';
async function main() {
const privateKey = process.env.MEW_PRIVATE_KEY;
if (!privateKey) {
throw new Error('請先設定環境變數 MEW_PRIVATE_KEY');
}
const wallet = new ethers.Wallet(privateKey);
console.log('私鑰對應地址:', wallet.address);
}
main().catch((err) => {
console.error('失敗:', err.message);
});
執行:
MEW_PRIVATE_KEY='your private key' node recover.mjs
注意:私鑰的敏感度遠高於地址。任何能取得私鑰的人都能完全控制錢包。不要將私鑰複製到聊天工具、雲端筆記或未知瀏覽器外掛中。
六、派生路徑是什麼?為什麼同一組助記詞會產生不同地址
HD 錢包使用派生路徑來決定「從同一組種子中取哪一把鑰匙」。以太坊錢包常見路徑如下:
| 場景 | 常見路徑 | 說明 |
| --- | --- | --- |
| MetaMask、多數以太坊錢包預設 | m/44'/60'/0'/0/0 | 第一个账户 |
| 第二個账户 | m/44'/60'/0'/0/1 | 最後一段索引遞增 |
| Ledger 舊版路徑 | m/44'/60'/0' | 需搭配索引或工具處理 |
| 某些錢包或自訂 HD 錢包 | m/44'/60'/0'/0 | 可能表示账户層級 |
若你的地址與腳本輸出不同,常見原因包括:
- 助記詞來源不同,例如 12 位與 24 位混用。
- 派生路徑不同。
- 錢包不是標準 BIP39 派生。
- 使用了自定義地址或智慧合約錢包,而非外部擁有者錢包。
- 助記詞包含隱藏密碼,例如 BIP39 passphrase。
七、驗證腳本是否真的有效
完成腳本後,建議用以下流程做交叉驗證:
- 取得腳本輸出的地址。
- 將地址貼到区块瀏覽器,例如 Etherscan,確認餘額與交易歷史是否符合記憶。
- 在離線或受控環境中比對地址,例如用你自己信任的錢包介面只讀查看。
- 記錄路徑,把成功地址對應的派生路徑寫到加密備份中,但不要記錄私鑰。
- 用小額測試,如果你要重新導入到新錢包,先轉入少量資產測試收款與操作。
八、常見錯誤與排查
1. 助記詞驗證失敗
可能原因:
- 拼寫錯誤。
- 單字順序錯誤。
- 使用了中文或其他非英文助記詞格式。
- 多餘空格、換行或標點符號。
- 使用了不同語言版本助記詞,但沒有啟用對應處理方式。
排查方式:
- 逐字檢查助記詞是否全部小寫。
- 確認字數為 12、18、21 或 24 位。
- 確認來自同一份原始備份。
2. 地址與原本 MEW 地址不同
可能原因:
- 派生路徑不同。
- 原始錢包使用了自定義路徑。
- 原始錢包不是助記詞型 HD 錢包。
- 原始錢包使用了額外 passphrase。
排查方式:

- 嘗試
m/44'/60'/0'/0/0、m/44'/60'/0'/0/1等相鄰索引。 - 若你曾有 MEW 備份提示,檢查是否使用了自定義派生路徑。
- 若你使用 Ledger 或 Trezor,需參考該硬體錢包的文件或官方工具。
3. Keystore 解密失敗
可能原因:
- 密碼錯誤。
- Keystore 檔案遺失或版本不符。
- 檔案在複製過程中損毀。
排查方式:
- 確認密碼是否含前後空格。
- 確認檔案是 JSON Keystore,而非其他匯出格式。
- 使用原本產生 Keystore 的裝置或工具輔助驗證。
4. 私鑰格式錯誤
可能原因:
- 不是 64 位十六進字串。
- 缺少或多餘
0x。 - 混入了位址而非私鑰。
正確格式通常是:
64 位十六進字串,或帶 0x 前綴的 66 字元字串
九、進階做法:建立一個只讀恢復工具
如果你只是想檢查備份,不必每次重新寫程式碼。可以建立一個小型 CLI 工具,讓使用者輸入助記詞或路徑後輸出地址。為降低風險,可以加入以下機制:
- 不將助記詞寫入檔案。
- 不將輸出寫入日誌。
- 只輸出地址,不輸出私鑰。
- 增加 checksum 或路徑列表驗證。
- 使用離線電腦執行。
範例流程:
- 使用者設定環境變數。
- 腳本驗證助記詞格式。
- 腳本輸出多個派生路徑的地址。
- 使用者手動比對曾經持有的地址。
- 使用者確認備份有效後,清除環境變數並關閉終端機。
十、MEW 相關注意事項
MyEtherWallet 作為錢包介面,可能涉及以下情境:
- 使用瀏覽器建立 HD 錢包並匯出 Keystore。
- 使用助記詞從 MEW 介面產生地址。
- 使用硬體錢包或 WalletConnect 方式操作。
- 匯入先前備份的 keystore JSON。
如果你只是要驗證地址,建議使用本地腳本,而不是將敏感資料上傳到任何網頁。即使你信任某個網站,也應優先在離線或隔離環境完成助記詞恢復與地址派生。
十一、最佳實踐清單
建立備份時
- 同時保存助記詞、派生路徑與地址。
- 不要只保存地址而忽略助記詞。
- 將備份放在防水、防塵、防篡改的位置。
- 避免把助記詞拍照上傳雲端。
使用腳本時
- 從官方套件庫安裝依賴。
- 使用環境變數或記憶體中的輸入。
- 避免把敏感資料寫入 shell history。
- 執行後清除變數,例如
unset MEW_MNEMONIC。
驗證恢復時
- 先確認地址是否正確。
- 再確認餘額與交易歷史。
- 最後才在小額環境測試簽名或轉帳。
十二、結語
MyEtherWallet 恢復腳本的核心,不是「找回 MEW」,而是找回你真正拥有的錢包控制權:助記詞、私鑰或 Keystore。只要備份完整,并使用標準的 BIP39、BIP44 與以太坊派生路徑,就可以在本機安全地派生地址並驗證備份。
最重要的一條原則是:任何腳本都不應為了方便而上傳或長期儲存你的助記詞、私鑰或 Keystore 密碼。真正可靠的恢復流程,應該在可信環境中完成派生、輸出地址、驗證狀態,然後清除敏感資料。