# 最佳实践

本文档总结了使用 OpenChain SDK 时的最佳实践和建议，帮助开发者构建安全、高效的区块链应用。

## 安全性最佳实践

### 1. 私钥管理
```javascript
// 使用环境变量存储私钥
const privateKey = process.env.PRIVATE_KEY;

// 使用加密存储私钥
const encryptedAccount = sdk.account.create({
  password: process.env.ACCOUNT_PASSWORD
});

// 私钥加密工具
class KeyEncryption {
  static async encrypt(privateKey, password) {
    // 实现私钥加密逻辑
  }

  static async decrypt(encryptedKey, password) {
    // 实现私钥解密逻辑
  }
}
```

### 2. 权限控制
```javascript
// 实现权限检查
async function checkPermission(address, operation) {
  const accountInfo = await sdk.account.getInfo(address);
  const privileges = accountInfo.result.priv;
  
  // 检查操作权限
  if (!hasRequiredPrivilege(privileges, operation)) {
    throw new Error('无操作权限');
  }
}

// 多重签名实现
async function multiSignTransaction(blob, requiredSigners) {
  const signatures = [];
  
  for (const signer of requiredSigners) {
    const signResponse = await sdk.transaction.sign({
      privateKeys: [signer.privateKey],
      blob: blob
    });
    signatures.push(signResponse.result.signatures);
  }
  
  return signatures;
}
```

### 3. 数据验证
```javascript
// 输入参数验证
function validateTransactionParams(params) {
  if (!sdk.account.isValid(params.sourceAddress)) {
    throw new Error('无效的源地址');
  }
  
  if (params.amount && (isNaN(params.amount) || Number(params.amount) <= 0)) {
    throw new Error('无效的金额');
  }
  
  if (params.metadata && params.metadata.length > 256000) {
    throw new Error('元数据长度超出限制');
  }
}

// 交易结果验证
async function verifyTransaction(txHash) {
  const txInfo = await sdk.transaction.getInfo(txHash);
  if (!txInfo || txInfo.errorCode !== 0) {
    throw new Error('交易验证失败');
  }
  return txInfo.result;
}
```

## 性能优化

### 1. 批量处理
```javascript
// 批量交易处理
async function batchProcess(operations, batchSize = 10) {
  const results = [];
  
  for (let i = 0; i < operations.length; i += batchSize) {
    const batch = operations.slice(i, i + batchSize);
    const batchOperations = batch.map(op => ({
      type: op.type,
      data: op.data
    }));
    
    const response = await sdk.transaction.buildBlob({
      sourceAddress: sourceAddress,
      operations: batchOperations,
      gasPrice: '1000',
      feeLimit: String(1000000 * batch.length)
    });
    
    results.push(response);
  }
  
  return results;
}
```

### 2. 并发处理
```javascript
// 并发请求处理
async function concurrentProcess(tasks, maxConcurrent = 5) {
  const results = [];
  
  for (let i = 0; i < tasks.length; i += maxConcurrent) {
    const batch = tasks.slice(i, i + maxConcurrent);
    const promises = batch.map(task => task());
    const batchResults = await Promise.all(promises);
    results.push(...batchResults);
  }
  
  return results;
}

// 使用示例
const queries = addresses.map(address => 
  () => sdk.account.getInfo(address)
);
const results = await concurrentProcess(queries);
```

### 3. 缓存策略
```javascript
// 简单的内存缓存实现
class Cache {
  constructor(ttl = 60000) {
    this.cache = new Map();
    this.ttl = ttl;
  }

  set(key, value) {
    this.cache.set(key, {
      value,
      timestamp: Date.now()
    });
  }

  get(key) {
    const data = this.cache.get(key);
    if (!data) return null;
    
    if (Date.now() - data.timestamp > this.ttl) {
      this.cache.delete(key);
      return null;
    }
    
    return data.value;
  }
}

// 账户信息缓存示例
const accountCache = new Cache(30000); // 30秒缓存

async function getCachedAccountInfo(address) {
  const cached = accountCache.get(address);
  if (cached) return cached;
  
  const info = await sdk.account.getInfo(address);
  accountCache.set(address, info);
  return info;
}
```

## 错误处理和监控

### 1. 交易监控
```javascript
// 交易监控系统
class TransactionMonitor {
  constructor() {
    this.pendingTransactions = new Map();
  }

  // 添加交易监控
  addTransaction(txHash, callback) {
    this.pendingTransactions.set(txHash, {
      startTime: Date.now(),
      callback
    });
    this.monitor(txHash);
  }

  // 监控交易状态
  async monitor(txHash) {
    const MAX_ATTEMPTS = 10;
    const INTERVAL = 3000;
    let attempts = 0;

    const interval = setInterval(async () => {
      try {
        const status = await sdk.transaction.getStatus(txHash);
        
        if (status.confirmed || attempts >= MAX_ATTEMPTS) {
          clearInterval(interval);
          const callback = this.pendingTransactions.get(txHash).callback;
          callback(status.confirmed ? null : new Error('Transaction timeout'));
          this.pendingTransactions.delete(txHash);
        }
        
        attempts++;
      } catch (error) {
        console.error(`监控交易出错: ${txHash}`, error);
      }
    }, INTERVAL);
  }
}
```

### 2. 健康检查
```javascript
// SDK健康检查
class HealthCheck {
  static async check() {
    try {
      // 检查节点连接
      const nodeInfo = await sdk.blockchain.getInfo();
      
      // 检查最新区块
      const latestBlock = await sdk.blockchain.getLatestBlock();
      
      // 检查交易池状态
      const pendingCount = await sdk.transaction.getPendingCount();
      
      return {
        status: 'healthy',
        nodeInfo,
        latestBlock,
        pendingTransactions: pendingCount
      };
    } catch (error) {
      return {
        status: 'unhealthy',
        error: error.message
      };
    }
  }
}
```

## 开发流程最佳实践

### 1. 环境配置
```javascript
// 环境配置管理
const config = {
  development: {
    host: 'http://testnet.openchain.com',
    chainId: 0,
    gasPrice: '1000',
    feeLimit: '1000000'
  },
  production: {
    host: process.env.OPENCHAIN_HOST,
    chainId: process.env.CHAIN_ID,
    gasPrice: process.env.GAS_PRICE,
    feeLimit: process.env.FEE_LIMIT
  }
};

const env = process.env.NODE_ENV || 'development';
const sdk = new SDK(config[env]);
```

### 2. 测试策略
```javascript
// 单元测试示例
describe('Account Operations', () => {
  let testAccount;
  
  beforeEach(async () => {
    testAccount = sdk.account.create();
  });
  
  it('should create account successfully', () => {
    expect(testAccount).to.have.property('address');
    expect(testAccount).to.have.property('privateKey');
  });
  
  it('should get account info', async () => {
    const info = await sdk.account.getInfo(testAccount.address);
    expect(info.errorCode).to.equal(0);
  });
});

// 集成测试示例
describe('Token Transfer Integration', () => {
  it('should complete full transfer cycle', async () => {
    // 创建测试账户
    const sender = sdk.account.create();
    const receiver = sdk.account.create();
    
    // 激活账户
    await activateAccount(sender.address);
    await activateAccount(receiver.address);
    
    // 发行Token
    const tokenResponse = await issueToken(sender.address);
    
    // 转移Token
    const transferResponse = await transferToken(sender, receiver, '100');
    
    // 验证结果
    expect(transferResponse.errorCode).to.equal(0);
  });
});
```

### 3. 日志记录
```javascript
// 日志记录工具
class Logger {
  static log(level, message, data = {}) {
    const logEntry = {
      timestamp: new Date().toISOString(),
      level,
      message,
      data
    };
    
    console.log(JSON.stringify(logEntry));
    
    // 可以添加将日志发送到日志服务的逻辑
  }
  
  static info(message, data) {
    this.log('INFO', message, data);
  }
  
  static error(message, error) {
    this.log('ERROR', message, {
      error: error.message,
      stack: error.stack
    });
  }
  
  static debug(message, data) {
    if (process.env.DEBUG) {
      this.log('DEBUG', message, data);
    }
  }
}
```

### 4. 文档维护
```javascript
// API文档示例
/**
 * 转移Token到指定地址
 * @param {Object} params - 转移参数
 * @param {string} params.sourceAddress - 源地址
 * @param {string} params.destAddress - 目标地址
 * @param {string} params.amount - 转移数量
 * @param {string} [params.metadata] - 转移说明
 * @returns {Promise<Object>} 转移结果
 * @throws {Error} 当参数无效或转移失败时抛出错误
 */
async function transferToken(params) {
  // 实现逻辑
}
```

## 部署和维护

### 1. 自动化部署
```javascript
// 部署配置检查
async function checkDeploymentConfig() {
  const requiredEnvVars = [
    'OPENCHAIN_HOST',
    'CHAIN_ID',
    'PRIVATE_KEY',
    'GAS_PRICE',
    'FEE_LIMIT'
  ];
  
  const missing = requiredEnvVars.filter(
    env => !process.env[env]
  );
  
  if (missing.length > 0) {
    throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
  }
}
```

### 2. 监控告警
```javascript
// 监控告警系统
class AlertSystem {
  static async checkSystem() {
    const alerts = [];
    
    // 检查节点状态
    const nodeStatus = await HealthCheck.check();
    if (nodeStatus.status === 'unhealthy') {
      alerts.push({
        level: 'critical',
        message: '节点连接异常',
        details: nodeStatus.error
      });
    }
    
    // 检查交易池
    const pendingCount = await sdk.transaction.getPendingCount();
    if (pendingCount > 1000) {
      alerts.push({
        level: 'warning',
        message: '交易池拥堵',
        details: `待处理交易数: ${pendingCount}`
      });
    }
    
    return alerts;
  }
  
  static async sendAlerts(alerts) {
    // 实现告警发送逻辑
    // 例如发送邮件、短信或调用告警API
  }
}
```

### 3. 备份策略
```javascript
// 账户备份工具
class AccountBackup {
  static async backup(accounts) {
    const backup = {
      timestamp: new Date().toISOString(),
      accounts: accounts.map(account => ({
        address: account.address,
        encryptedPrivateKey: await KeyEncryption.encrypt(
          account.privateKey,
          process.env.BACKUP_PASSWORD
        )
      }))
    };
    
    // 保存备份数据
    // 可以保存到安全的存储系统
    return backup;
  }
  
  static async restore(backup, password) {
    const accounts = [];
    
    for (const account of backup.accounts) {
      const privateKey = await KeyEncryption.decrypt(
        account.encryptedPrivateKey,
        password
      );
      
      accounts.push({
        address: account.address,
        privateKey
      });
    }
    
    return accounts;
  }
}
```