特殊
MetaMask Snap
通过 MetaMask 扩展访问 Æternity 账户
什么是 MetaMask Snap?
MetaMask Snap 是 MetaMask 的扩展功能,允许在 MetaMask 中支持非 EVM 链。Æternity Snap 让你可以使用 MetaMask 来管理 Æternity 账户,无需安装额外的钱包扩展。
前提条件
- Chrome 或 Firefox 浏览器安装 MetaMask 扩展 12.2.4 或更高版本
- 在 MetaMask 中设置账户(创建新账户或通过助记词恢复)
基本用法
步骤 1创建账户工厂
import { AccountMetamaskFactory } from '@aeternity/aepp-sdk';
// 创建 MetaMask 账户工厂
const accountFactory = new AccountMetamaskFactory();
步骤 2初始化账户
// 通过索引创建账户实例
// 首次使用时会提示用户安装/连接 Æternity Snap
const account = await accountFactory.initialize(0);
console.log(account.address); // 'ak_2dA...'
// 签名交易(在 MetaMask 中确认)
const signedTx = await account.signTransaction('tx_...');
console.log(signedTx); // 'tx_...' (带签名)
安全特性:私钥在 MetaMask 扩展中派生,永远不会离开扩展。
账户持久化
保存账户的 index 和 address 属性,可在应用重启后恢复:
import { AccountMetamask, AccountMetamaskFactory } from '@aeternity/aepp-sdk';
// 保存
const accountIndex = accountToPersist.index;
const accountAddress = accountToPersist.address;
localStorage.setItem('metamaskAccount', JSON.stringify({ index: accountIndex, address: accountAddress }));
// 恢复
const saved = JSON.parse(localStorage.getItem('metamaskAccount'));
const accountFactory = new AccountMetamaskFactory();
const restoredAccount = new AccountMetamask(
accountFactory.provider,
saved.index,
saved.address
);
账户发现
自动发现链上已使用过的账户:
import { Node } from '@aeternity/aepp-sdk';
const node = new Node('https://testnet.aeternity.io');
// 发现所有链上活跃的账户
const accounts = await accountFactory.discover(node);
console.log('发现账户:');
accounts.forEach(acc => console.log(acc.address));
错误处理
用户拒绝操作时会抛出异常:
try {
const account = await accountFactory.initialize(0);
} catch (err) {
// err 是一个普通对象
if (err.code === 4001) {
console.log('用户拒绝了请求');
// err.message === 'User rejected the request.'
} else if (err.code === -32602) {
console.log('Snap 降级被请求');
}
}
| 错误码 | 含义 |
|---|---|
4001 |
用户拒绝了请求(安装、连接、签名等) |
-32602 |
请求 Snap 降级 |
完整示例
Ledger vs MetaMask 对比
| 特性 | Ledger | MetaMask Snap |
|---|---|---|
| 私钥存储 | 硬件设备 | 浏览器扩展 |
| 需要额外硬件 | ||
| 安全级别 | 最高 | 高 |
| 用户基础 | 较小 | 庞大 |
| 适用场景 | 大额资产 | 日常使用 |
学习完成!
恭喜!你已完成 JavaScript SDK 的全部教程。