在由 OCAP 驱动的区块链上,账户本质上是与一个地址关联的状态,由一对加密密钥(公钥和私钥)控制。一个需要理解的关键概念是,账户是隐式创建的。一旦账户收到第一笔入账交易(例如代币或资产转移),它就正式在链上存在了。没有显式的 createAccount 交易。
本指南介绍把旧账户迁移到由新密钥控制的另一个地址。链上记录新旧账户的迁移关系。费用、资产规则和应用自己的记录需要分别检查;迁移不保证余额数字不变,也不自动搬迁所有关联对象。
将账户迁移到新密钥
migrateAccount 提交目标钱包的地址和公钥,由原钱包签名。在下述实现中,目标地址必须与发送方不同,而且不能已经存在账户状态。这在多种场景下都很有用,例如:
- 密钥泄露:如果您怀疑自己的私钥已被泄露,可以将账户迁移到一个新的、安全的密钥对,在迁移生效后替换泄露密钥的控制权。生效前,持有旧密钥的攻击者也可能发起操作。
- 升级安全性:您可能希望从旧的密钥类型迁移到更新、更安全的密钥类型。
此操作可以有效地转移账户的控制权,同时保留其在区块链上的历史和状态。
参数
- from
WalletObject(required) — 代表正在被迁移的当前账户的钱包对象。该钱包必须签署交易以证明所有权。 - to
WalletObject(required) — 控制权将被转移到的新钱包对象。其地址与匹配的公钥指定新的目标账户,并非在不变的旧地址上替换公钥。
返回值
migrateAccount 方法返回一个 Promise,该 Promise 会解析为交易哈希字符串。
源码纠正(2026 年 9 月 29 日):上述地址行为已对照 @ocap/client 与 @ocap/tx-protocols 1.20.2 的公开发布的实现核实。此前“地址不变”的说明不准确。该操作需要原私钥,不是私钥彻底丢失后的恢复。旧地址解析与历史签名的区别见迁移机制说明。
以下保留历史 SDK 示例。使用前请确认包版本兼容性,并提供所用测试网络可用的端点和浏览器;这里没有确认旧示例服务目前仍然可用。
示例
以下是如何将账户从旧钱包迁移到新钱包的示例。
迁移账户
import Client from '@ocap/client';
import { fromRandom } from '@ocap/wallet';
const client = new Client('https://beta.abtnetwork.io/api');
// 假设 oldWallet 是当前账户的授权钱包
const oldWallet = fromRandom();
// 创建一个具有新密钥对的新钱包
const newWallet = fromRandom();
async function migrate() {
try {
// 在迁移之前,您通常需要为 oldWallet 的地址充值。
// 在本示例中,我们假设它有足够的资金来支付交易费用。
// 您可以从 https://faucet.abtnetwork.io/ 获取测试代币
console.log(`Migrating account from ${oldWallet.address} to target address ${newWallet.address}`);
const hash = await client.migrateAccount({
from: oldWallet,
to: newWallet,
});
console.log('Account migration transaction sent successfully!');
console.log('Transaction Hash:', hash);
console.log(`View transaction at: https://beta.abtnetwork.io/explorer/txs/${hash}`);
} catch (err) {
console.error('Error migrating account:', err);
}
}
migrate();现在您已经了解了如何通过迁移密钥来保护您的账户,您可能想学习如何在不共享主密钥的情况下向其他账户授予有限的权限。更多详情请参阅委托权限指南。