入门
高级 vs 低级 API
了解 SDK 的两种交互方式,选择最适合你的开发模式
概述
AeSdk 是一个通用的高级接口,它封装了多个低级接口。对于大多数开发场景,推荐使用高级接口,因为它更简单,并且对底层变更更具弹性。
但 SDK 也提供了低级接口。它非常适合需要额外控制的场景,同时也是理解底层操作的绝佳学习工具。
节点 API(Node API)
Æternity 节点暴露了一个 REST API。这个 API 在 OpenAPI 文档中有详细描述。
SDK 使用这个文档生成 TypeScript 客户端。生成的客户端(在 Node 类中实现)基本上是所有节点端点到函数的映射。
示例:通过哈希查询交易
// 通过交易哈希获取交易详情
const tx = await node.getTransactionByHash(
'th_fWEsg152BNYcrqA9jDh9VVpacYojCUb1yu45zUnqhmQ3dAAC6'
);
console.log(tx);
这种方式下,SDK 只是原始 API 调用到 JavaScript 的简单映射。
交易构建器(Transaction Builder)
任何区块链状态变更都需要签名一个交易。交易必须按照协议规范构建。
SDK 在以下函数中实现了这些规范:
| 函数 | 说明 |
|---|---|
buildTx |
构建交易,需要提供更多参数 |
buildTxAsync |
异步构建交易,参数更少,但需要 node 实例 |
unpackTx |
解析已编码的交易 |
高级 SDK 用法(推荐)
使用 Æternity SDK 抽象的 spend 调用示例:
import { AeSdk, Node, AccountMemory } from '@aeternity/aepp-sdk';
// 初始化
const node = new Node('https://testnet.aeternity.io');
const account = new AccountMemory(SECRET_KEY);
const aeSdk = new AeSdk({
nodes: [{ name: 'testnet', instance: node }],
accounts: [account],
});
// 一行代码完成转账!
const result = await aeSdk.spend(
100, // 金额(aettos)
'ak_recipient_address...' // 接收方地址
);
console.log('交易哈希:', result.hash);
优势:高级接口自动处理 nonce 管理、手续费计算、交易编码、签名和广播。
低级 SDK 用法
使用低级 SDK 函数执行相同的 spend 操作:
import {
Node, AccountMemory, Tag,
buildTxAsync, signedTx, sendTransaction
} from '@aeternity/aepp-sdk';
// 初始化
const node = new Node('https://testnet.aeternity.io');
const account = new AccountMemory(SECRET_KEY);
// 步骤 1: 构建交易
const spendTx = await buildTxAsync({
tag: Tag.SpendTx,
senderId: account.address,
recipientId: 'ak_recipient_address...',
amount: 100,
onNode: node,
});
// 步骤 2: 签名交易
const signed = signedTx(spendTx, {
signatures: [await account.signTransaction(spendTx, { networkId: 'ae_uat' })],
});
// 步骤 3: 广播交易
const result = await sendTransaction(signed, { onNode: node });
console.log('交易哈希:', result.hash);
注意:低级接口需要手动处理每个步骤,但提供了更精细的控制。
对比总结
| 特性 | 高级 API | 低级 API |
|---|---|---|
| 代码量 | 少 | 多 |
| 学习曲线 | 平缓 | 陡峭 |
| 自动化程度 | 高 | 低 |
| 精细控制 | 有限 | 完全 |
| 适合场景 | 大多数应用开发 | 定制化需求、学习底层 |
继续学习