# 管理帳號

在由 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，其解析值為交易雜湊值的字串。

### 範例

以下是如何將帳號從舊錢包遷移到新錢包的範例。

```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) 指南以獲取更多詳細資訊。
