EOSJS项目实战:如何提交交易到EOSIO区块链
前言
在EOSIO区块链开发中,交易(Transaction)是与智能合约交互的基本单位。本文将详细介绍如何使用EOSJS库构建和提交交易,涵盖从基础到进阶的各种用法。
基础交易提交
交易的基本结构
在EOSJS中,提交交易的核心方法是api.transact(),它接收两个主要参数:
- 交易动作对象:定义要执行的操作
- 配置选项对象(可选):控制交易行为的高级设置
const transaction = await api.transact({
// 交易动作定义
}, {
// 配置选项
});
交易动作详解
交易动作对象包含以下关键字段:
account:智能合约所在的账户名name:要调用的动作名称authorization:执行该动作所需的权限data:传递给动作的参数数据
示例:购买RAM的交易动作
{
actions: [{
account: 'eosio',
name: 'buyrambytes',
authorization: [{
actor: 'useraaaaaaaa',
permission: 'active',
}],
data: {
payer: 'useraaaaaaaa',
receiver: 'useraaaaaaaa',
bytes: 8192,
},
}]
}
交易配置选项
配置选项可以控制交易的行为和TAPOS(Transaction as Proof of Stake)相关参数:
{
blocksBehind: 3, // 引用当前块前3个块的区块信息
expireSeconds: 30, // 交易30秒后过期
broadcast: true, // 是否广播交易(默认true)
sign: true // 是否签名交易(默认true)
}
进阶用法
简洁动作构造
EOSJS提供了更简洁的动作构造方式:
await api.transact({
actions: [
api.with('eosio').as('useraaaaaaaa').buyrambytes('useraaaaaaaa', 'useraaaaaaaa', 8192)
]
}, {
blocksBehind: 3,
expireSeconds: 30,
});
使用前需要缓存ABI:
await api.getAbi('eosio');
状态化交易对象
可以创建交易对象并在应用中传递,稍后发送:
const tx = api.buildTransaction();
tx.with('eosio').as('useraaaaaaaa').buyrambytes('useraaaaaaaa', 'useraaaaaaaa', 8192);
await tx.send({ blocksBehind: 3, expireSeconds: 30 });
或者使用回调方式:
api.buildTransaction(async (tx) => {
tx.with('eosio').as('useraaaaaaaa').buyrambytes('useraaaaaaaa', 'useraaaaaaaa', 8192);
await tx.send({ blocksBehind: 3, expireSeconds: 30 });
});
上下文无关动作处理
对于需要处理上下文无关动作的复杂场景:
const tx = api.buildTransaction();
tx.associateContextFree((index) => ({
contextFreeData: cfdata,
contextFreeAction: tx.with('account').as().cfaName(index.cfd, 'context free example'),
action: tx.with('account').as('actor').actionName('example', index.cfa)
}));
await tx.send({ blocksBehind: 3, expireSeconds: 30 });
高级特性
返回值处理
从nodeos 2.1开始,可以接收智能合约的返回值:
const transaction = await api.transact(...);
// 交易ID
console.log(transaction.transaction_id);
// 处理结果
console.log(transaction.processed);
// 动作追踪(包含返回值)
console.log(transaction.processed.action_traces);
返回值可以在action_traces数组中找到,顺序与交易中的动作顺序一致。
只读交易
从nodeos 2.2开始支持只读查询:
await api.transact({
actions: [...]
}, {
readOnlyTrx: true, // 启用只读模式
returnFailureTraces: true // 返回失败追踪信息
});
只读交易不会修改链上状态,即使调用了修改数据的动作也会被回滚。
最佳实践
- 合理设置过期时间:根据网络状况设置适当的
expireSeconds - 错误处理:始终处理交易可能失败的情况
- 资源管理:注意CPU、NET和RAM的使用情况
- 交易批处理:将相关操作合并到一个交易中提高效率
- 只读查询优化:对不需要修改数据的操作使用只读模式
通过掌握这些技术,开发者可以高效地在EOSIO区块链上构建复杂的去中心化应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



