EOSJS项目实战:如何提交交易到EOSIO区块链

EOSJS项目实战:如何提交交易到EOSIO区块链

【免费下载链接】eosjs General purpose library for the EOSIO blockchain. 【免费下载链接】eosjs 项目地址: https://gitcode.com/gh_mirrors/eo/eosjs

前言

在EOSIO区块链开发中,交易(Transaction)是与智能合约交互的基本单位。本文将详细介绍如何使用EOSJS库构建和提交交易,涵盖从基础到进阶的各种用法。

基础交易提交

交易的基本结构

在EOSJS中,提交交易的核心方法是api.transact(),它接收两个主要参数:

  1. 交易动作对象:定义要执行的操作
  2. 配置选项对象(可选):控制交易行为的高级设置
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 // 返回失败追踪信息
});

只读交易不会修改链上状态,即使调用了修改数据的动作也会被回滚。

最佳实践

  1. 合理设置过期时间:根据网络状况设置适当的expireSeconds
  2. 错误处理:始终处理交易可能失败的情况
  3. 资源管理:注意CPU、NET和RAM的使用情况
  4. 交易批处理:将相关操作合并到一个交易中提高效率
  5. 只读查询优化:对不需要修改数据的操作使用只读模式

通过掌握这些技术,开发者可以高效地在EOSIO区块链上构建复杂的去中心化应用。

【免费下载链接】eosjs General purpose library for the EOSIO blockchain. 【免费下载链接】eosjs 项目地址: https://gitcode.com/gh_mirrors/eo/eosjs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值