UNPKG

openchain-sdk-yxl

Version:

openchain sdk

356 lines (282 loc) 8.06 kB
# OpenChain SDK for Node.js 使用手册 ## 目录 - [安装和配置](#安装和配置) - [账户管理](#账户管理) - [区块链交互](#区块链交互) - [智能合约](#智能合约) - [资产管理](#资产管理) - [CTP10代币](#ctp10代币) - [WebSocket连接](#websocket连接) - [错误处理](#错误处理) - [最佳实践](#最佳实践) ## 安装和配置 ### 安装SDK ```bash npm install openchain-sdk-yxl ``` 或使用yarn: ```bash yarn add openchain-sdk-yxl ``` ### 初始化SDK ```javascript const OpenChainSDK = require('openchain-sdk-yxl'); const sdk = new OpenChainSDK({ // 必需配置 nodeUrl: 'http://your-node-url', // 节点URL chainId: 'your-chain-id', // 链ID // 可选配置 timeout: 30000, // 请求超时时间(毫秒) retryTimes: 3, // 重试次数 wsUrl: 'ws://your-ws-url' // WebSocket URL(如需要) }); ``` ## 账户管理 ### 创建账户 ```javascript // 创建新账户 const account = sdk.account.create(); console.log('账户地址:', account.address); console.log('私钥:', account.privateKey); // 从私钥导入账户 const importedAccount = sdk.account.fromPrivateKey('your-private-key'); // 获取账户余额 const balance = await sdk.account.getBalance(account.address); ``` ### 账户操作 ```javascript // 转账 const transferResult = await sdk.account.transfer({ from: account.address, to: 'recipient-address', amount: '1000000', // 金额(基本单位) privateKey: account.privateKey }); // 查询账户信息 const accountInfo = await sdk.account.getAccountInfo(account.address); ``` ## 区块链交互 ### 区块操作 ```javascript // 获取最新区块 const latestBlock = await sdk.blockchain.getLatestBlock(); // 根据高度获取区块 const block = await sdk.blockchain.getBlockByHeight(100); // 根据哈希获取区块 const blockByHash = await sdk.blockchain.getBlockByHash('block-hash'); ``` ### 交易操作 ```javascript // 发送交易 const txResult = await sdk.transaction.send({ from: account.address, to: 'recipient-address', value: '1000000', data: '0x', // 可选,合约调用数据 privateKey: account.privateKey }); // 获取交易收据 const receipt = await sdk.transaction.getTransactionReceipt('tx-hash'); // 查询交易状态 const txStatus = await sdk.transaction.getTransactionStatus('tx-hash'); ``` ## 智能合约 ### 合约部署 ```javascript // 部署合约 const contract = await sdk.contract.deploy({ from: account.address, privateKey: account.privateKey, abi: contractABI, bytecode: contractBytecode, args: [] // 构造函数参数 }); console.log('合约地址:', contract.address); ``` ### 合约调用 ```javascript // 初始化合约实例 const contract = sdk.contract.at(contractAddress, contractABI); // 调用合约方法(写入方法) const result = await contract.methods.transfer('recipient', '1000').send({ from: account.address, privateKey: account.privateKey }); // 调用合约方法(只读方法) const balance = await contract.methods.balanceOf(account.address).call(); // 监听合约事件 contract.events.Transfer({ fromBlock: 0 }, (error, event) => { if (error) { console.error('事件监听错误:', error); return; } console.log('转账事件:', event); }); ``` ## 资产管理 ### 资产操作 ```javascript // 发行资产 const assetResult = await sdk.asset.issue({ from: account.address, privateKey: account.privateKey, name: 'MyAsset', symbol: 'MA', totalSupply: '1000000000', decimals: 18 }); // 转移资产 const transferResult = await sdk.asset.transfer({ from: account.address, to: 'recipient-address', assetId: 'asset-id', amount: '1000', privateKey: account.privateKey }); // 查询资产余额 const assetBalance = await sdk.asset.getBalance(account.address, 'asset-id'); ``` ## CTP10代币 ### 代币操作 ```javascript // 发行CTP10代币 const tokenResult = await sdk.ctp10Token.deploy({ from: account.address, privateKey: account.privateKey, name: 'MyToken', symbol: 'MT', totalSupply: '1000000000', decimals: 18 }); // 转账代币 const token = sdk.ctp10Token.at(tokenAddress); const transferResult = await token.transfer({ from: account.address, to: 'recipient-address', amount: '1000', privateKey: account.privateKey }); // 授权代币 const approveResult = await token.approve({ from: account.address, spender: 'spender-address', amount: '1000', privateKey: account.privateKey }); ``` ## WebSocket连接 ### 实时数据订阅 ```javascript // 创建WebSocket客户端 const wsClient = sdk.websocket.createClient(); // 订阅新区块 wsClient.subscribeNewBlock((error, block) => { if (error) { console.error('订阅错误:', error); return; } console.log('新区块:', block); }); // 订阅交易 wsClient.subscribeTransaction({ address: account.address // 可选,指定地址 }, (error, transaction) => { if (error) { console.error('订阅错误:', error); return; } console.log('新交易:', transaction); }); ``` ## 错误处理 ```javascript try { const result = await sdk.transaction.send({ // 交易参数 }); } catch (error) { if (error.code === 'INVALID_PARAMS') { console.error('参数无效:', error.message); } else if (error.code === 'INSUFFICIENT_BALANCE') { console.error('余额不足:', error.message); } else { console.error('未知错误:', error); } } ``` ## 最佳实践 ### 交易确认 ```javascript // 等待交易确认 async function waitForConfirmation(txHash, maxAttempts = 20) { for (let i = 0; i < maxAttempts; i++) { const receipt = await sdk.transaction.getTransactionReceipt(txHash); if (receipt) { return receipt; } await new Promise(resolve => setTimeout(resolve, 1000)); } throw new Error('交易确认超时'); } // 使用示例 const txResult = await sdk.transaction.send({ // 交易参数 }); const receipt = await waitForConfirmation(txResult.hash); ``` ### 批量操作 ```javascript // 批量转账示例 async function batchTransfer(recipients, amounts, privateKey) { const results = []; for (let i = 0; i < recipients.length; i++) { try { const result = await sdk.transaction.send({ to: recipients[i], value: amounts[i], privateKey: privateKey }); results.push({ success: true, hash: result.hash }); } catch (error) { results.push({ success: false, error: error.message }); } } return results; } ``` ### 安全建议 1. 私钥管理 - 永远不要在代码中硬编码私钥 - 使用环境变量或安全的密钥管理系统 - 定期更换私钥 2. 错误处理 - 始终使用try-catch处理异步操作 - 实现适当的重试机制 - 记录详细的错误日志 3. 资源管理 - 及时关闭WebSocket连接 - 实现请求限流 - 合理设置超时时间 ### 性能优化 1. 连接池 - 重用SDK实例 - 维护WebSocket连接池 2. 缓存策略 - 缓存频繁查询的数据 - 实现智能的缓存失效机制 3. 批处理 - 合并多个查询请求 - 使用批量交易接口 ## 常见问题解答 1. Q: 如何处理交易失败? A: 实现重试机制,检查错误类型,确保参数正确。 2. Q: 如何优化性能? A: 使用连接池、实现缓存、批量处理请求。 3. Q: 如何确保交易安全? A: 使用安全的私钥管理、实现签名验证、添加适当的错误处理。 4. Q: WebSocket连接断开如何处理? A: 实现自动重连机制,监控连接状态。 5. Q: 如何处理大量并发请求? A: 实现请求队列、使用限流机制、优化资源利用。