# 账户管理

账户模块提供了完整的账户管理功能，包括账户创建、查询、权限设置和元数据管理等功能。

## 创建账户

### 基础账户创建
```javascript
// 创建新账户
const newAccount = sdk.account.create();
console.log('地址:', newAccount.address);
console.log('公钥:', newAccount.publicKey);
console.log('私钥:', newAccount.privateKey);

// 创建带密码的账户
const encryptedAccount = sdk.account.create({
  password: 'your-password'  // 可选，用于加密私钥
});
```

### 激活账户
```javascript
// 激活新账户
const activateOperation = {
  sourceAddress: sourceAddress,    // 支付激活费用的账户地址
  destAddress: newAccount.address, // 要激活的新账户地址
  initBalance: '1000000',         // 初始化余额
  metadata: 'activate account'     // 可选，激活说明
};

const response = yield sdk.operation.account.activate(activateOperation);
```

## 查询账户信息

### 基本信息查询
```javascript
// 查询账户基本信息
const accountInfo = yield sdk.account.getInfo(address);
// 返回结果示例
{
  errorCode: 0,
  result: {
    address: "did:bid:efqkw1dKHHuWtupG6k1tCu4PNfoRs7us",
    balance: "1000000",
    nonce: "1",
    priv: {
      masterWeight: "1",
      thresholds: {
        txThreshold: "1"
      }
    }
  }
}

// 查询账户余额
const accountBalance = yield sdk.account.getBalance(address);
```

### 元数据查询
```javascript
// 查询账户元数据
const accountMetadata = yield sdk.account.getMetadata({
  address: address,
  key: 'metadata-key'
});

// 查询账户所有元数据
const allMetadata = yield sdk.account.getMetadatas(address);
```

## 设置账户权限

### 权限结构说明
账户权限包括以下几个主要部分：
- masterWeight: 账户自身权重
- signers: 其他签名者列表及其权重
- txThreshold: 交易门限
- typeThresholds: 不同操作类型的门限

### 设置权限示例
```javascript
// 设置账户权限
const setPrivilegeOperation = {
  sourceAddress: address,
  masterWeight: '1',         // 账户自身权重
  signers: [{                // 其他签名者
    address: 'signer-address',
    weight: 1
  }],
  txThreshold: '1',          // 交易门限
  typeThresholds: [{         // 不同操作类型的门限
    type: 1,
    threshold: '1'
  }]
};

const response = yield sdk.operation.account.setPrivilege(setPrivilegeOperation);
```

## 管理账户元数据

### 设置元数据
```javascript
// 设置账户元数据
const setMetadataOperation = {
  sourceAddress: address,
  key: 'myKey',             // 元数据键名
  value: 'myValue',         // 元数据值
  version: '1',             // 可选，元数据版本号
  deleteFlag: false,        // 可选，是否删除该元数据
  metadata: 'set metadata'  // 可选，操作说明
};

const response = yield sdk.operation.account.setMetadata(setMetadataOperation);
```

### 删除元数据
```javascript
// 删除账户元数据
const deleteMetadataOperation = {
  sourceAddress: address,
  key: 'myKey',
  version: '1',             // 当前版本号
  deleteFlag: true          // 设置为true表示删除
};

const response = yield sdk.operation.account.setMetadata(deleteMetadataOperation);
```

## 最佳实践

1. 私钥安全
   - 使用加密方式存储私钥
   - 避免在代码中硬编码私钥
   - 定期更换私钥

2. 权限管理
   - 合理设置权限阈值
   - 使用多重签名增加安全性
   - 定期检查和更新权限设置

3. 元数据使用
   - 使用规范的键名命名方式
   - 及时清理无用的元数据
   - 保持元数据内容简洁

4. 账户激活
   - 确保有足够的初始化余额
   - 记录激活操作的交易哈希
   - 验证账户激活状态