常见问题 (FAQ)
账户和钱包
Q: 如何生成 Cosmos 助记词?
A: 可以使用 BIP39 标准生成助记词:
import { generateMnemonic } from 'bip39';
// 生成 12 个单词的助记词
const mnemonic = generateMnemonic(128); // 128 bits = 12 words
// 生成 24 个单词的助记词
const mnemonic24 = generateMnemonic(256); // 256 bits = 24 words
Q: 如何从助记词恢复钱包?
A: 使用 DirectSecp256k1HdWallet:
import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing';
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic);
const [firstAccount] = await wallet.getAccounts();
console.log('Account address:', firstAccount.address);
Q: 派生路径是什么?
A: Cosmos Hub 使用标准的 BIP44 派生路径:
m/44'/118'/0'/0/0 // 第一个账户
m/44'/118'/0'/0/1 // 第二个账户
m/44'/118'/0'/0/2 // 第三个账户
其中 118
是 ATOM 的币种类型。
交易
Q: Amino 和 Direct 格式有什么区别?
A:
- Amino: 传统的 JSON 格式,向后兼容,但消耗更多 Gas
- Direct: 新的 Protocol Buffers 格式,更高效,消耗更少 Gas
Q: 如何设置正确的 Gas 限制?
A: 根据交易类型设置:
const GAS_LIMITS = {
SEND: 200000, // 转账交易
DELEGATE: 180000, // 委托交易
UNDELEGATE: 180000, // 取消委托
REDELEGATE: 180000, // 重新委托
};
Q: 如何处理交易失败?
A: 检查常见原因:
- 余额不足: 确保有足够的 ATOM 支付费用
- 序列号错误: 检查账户序列号
- Gas 不足: 增加 Gas 限制
- 网络问题: 检查 RPC 端点连接
质押和委托
Q: 如何选择验证者?
A: 考虑以下因素:
- 佣金率: 验证者收取的佣金比例
- 投票权重: 验证者的总质押量
- 正常运行时间: 验证者的可用性
- 声誉: 验证者的历史表现
Q: 委托后多久能获得奖励?
A: 奖励通常在每个区块后累积,可以随时提取。建议定期提取奖励以最大化收益。
Q: 取消委托需要多长时间?
A: 取消委托后需要等待解绑期(通常为 21 天)才能取回资金。
多重签名
Q: 如何创建多重签名账户?
A: 使用 createMultisigThresholdPubkey:
const { createMultisigThresholdPubkey } = require('@cosmjs/amino');
const multisig = createMultisigThresholdPubkey(pubkeys, threshold, true);
const multisigAddress = pubkeyToAddress(multisig, 'cosmos');
Q: 阈值如何设置?
A: 阈值应该根据安全需求设置:
- 2-of-3: 需要 2 个签名,适合大多数场景
- 3-of-5: 需要 3 个签名,安全性更高
- 1-of-2: 需要 1 个签名,类似"或"逻辑
网络和连接
Q: 如何连接到不同的网络?
A: 使用不同的 RPC 端点:
// 主网
const MAINNET_RPC = 'https://rpc.cosmos.network:26657';
// 测试网
const TESTNET_RPC = 'https://rpc.testnet.cosmos.network:443';
Q: 如何处理网络连接问题?
A:
- 检查网络连接
- 验证 RPC 端点
- 检查防火墙设置
- 尝试备用端点
开发工具
Q: 推荐使用哪些库?
A:
- @cosmjs/stargate: 主要的客户端库
- @cosmjs/amino: Amino 编码支持
- @cosmjs/proto-signing: Protocol Buffers 签名
- @cosmjs/encoding: 编码工具函数
Q: 如何调试交易问题?
A:
- 启用详细日志
- 验证交易参数
- 检查签名过程
- 使用测试网进行测试
- 查看交易哈希和状态
安全
Q: 如何安全存储私钥?
A:
- 使用硬件钱包
- 加密存储助记词
- 避免在代码中硬编码
- 使用环境变量
- 定期备份
Q: 如何验证交易签名?
A: 使用公钥验证签名:
const publicKey = privateKey.toPublicKey();
const isValid = publicKey.verify(message, signature);
性能
Q: 如何优化交易构建?
A:
- 使用 Direct 格式而不是 Amino
- 批量处理多个消息
- 合理设置 Gas 限制
- 使用高效的 RPC 端点
Q: 如何处理大量交易?
A:
- 使用队列系统
- 实现重试机制
- 监控网络状态
- 分批提交交易
错误处理
Q: 常见的错误类型有哪些?
A:
- insufficient funds: 余额不足
- sequence number: 序列号错误
- gas: Gas 不足
- invalid signature: 签名无效
- network error: 网络连接错误
Q: 如何实现错误重试?
A: 实现指数退避重试机制:
async function retryWithBackoff(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
if (i === maxRetries - 1) throw error;
const delay = Math.pow(2, i) * 1000; // 指数退避
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}