# 管理账户

在由 OCAP 驱动的区块链上，账户本质上是与一个地址关联的状态，由一对加密密钥（公钥和私钥）控制。一个需要理解的关键概念是，账户是隐式创建的。一旦账户收到第一笔入账交易（例如代币或资产转移），它就正式在链上存在了。没有显式的 `createAccount` 交易。

本指南重点介绍一个关键的账户管理操作：将账户迁移到一组新的密钥。这是一项重要的安全功能，允许您在不改变账户地址、余额或资产的情况下更改账户的所有权。


## 将账户迁移到新密钥

`migrateAccount` 函数允许您将一个现有的账户地址与一个新的公钥关联起来。这在多种场景下都很有用，例如：

* **密钥泄露**：如果您怀疑自己的私钥已被泄露，可以将账户迁移到一个新的、安全的密钥对，以防止未经授权的访问。
* **升级安全性**：您可能希望从旧的密钥类型迁移到更新、更安全的密钥类型。

此操作可以有效地转移账户的控制权，同时保留其在区块链上的历史和状态。

### 参数

<x-field-group>
  <x-field data-name="from" data-type="WalletObject" data-required="true">
    <x-field-desc markdown>代表正在被迁移的当前账户的钱包对象。该钱包必须签署交易以证明所有权。</x-field-desc>
  </x-field>
  <x-field data-name="to" data-type="WalletObject" data-required="true">
    <x-field-desc markdown>控制权将被转移到的新钱包对象。该钱包的公钥将成为该账户地址的新权限所有者。</x-field-desc>
  </x-field>
</x-field-group>

### 返回值

`migrateAccount` 方法返回一个 Promise，该 Promise 会解析为交易哈希字符串。

### 示例

以下是如何将账户从旧钱包迁移到新钱包的示例。

```javascript 迁移账户 icon=logos:javascript
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 new keys associated with ${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();
```

---

现在您已经了解了如何通过迁移密钥来保护您的账户，您可能想学习如何在不共享主密钥的情况下向其他账户授予有限的权限。更多详情请参阅[委托权限](./how-to-guides-delegate-permissions.md)指南。
