Home指南API 参考手册
指南API 参考手册社区Discord博客FAQ漏洞赏金公告中心English(英文版)Log In
指南

交易

生成签名交易

安装NPM库 于此处 或下载utils and the lib 文件夹至你的项目并于本地使用。

或者,您可以使用 API签名和广播流 来生成一个已签署的交易。

创建交易

transactionBuilder加密 导入到您的Javascript文件中。

const CryptoUtils = require("@tronscan/client/src/utils/crypto");
const TransactionUtils = require("@tronscan/client/src/utils/transactionBuilder");

导入的transactionBuilder文件中的此函数将创建交易对象。

function buildTransferTransaction(token, from, to, amount) {

  if (token.toUpperCase() === 'TRX') {

    let transferContract = new TransferContract();
    transferContract.setToAddress(Uint8Array.from(decode58Check(to)));
    transferContract.setOwnerAddress(Uint8Array.from(decode58Check(from)));
    transferContract.setAmount(amount);

    return buildTransferContract(
      transferContract,
      Transaction.Contract.ContractType.TRANSFERCONTRACT,
      "TransferContract");
  } else {

    let transferContract = new TransferAssetContract();
    transferContract.setToAddress(Uint8Array.from(decode58Check(to)));
    transferContract.setOwnerAddress(Uint8Array.from(decode58Check(from)));
    transferContract.setAmount(amount);
    transferContract.setAssetName(encodeString(token));

    return buildTransferContract(
      transferContract,
      Transaction.Contract.ContractType.TRANSFERASSETCONTRACT,
      "TransferAssetContract");
  }
}

签署交易

导入的加密文件中的此函数将签署交易对象。

Value

数据类型

描述

token

String

您要在交易中发送的资产。
示例:“TRX”

from

String

您要在交易中发送的地址。
示例:“TDCMWoSbAfcegQqNUaRNjGhY4tAbdCmdwi”

to

String

您要在交易中发送的地址。
例:
“TQ6pM81JDC2GhrUoNYtZGvPc7SvyqcemEu”

amount

Integer

您要花费指定令牌的金额。如果要发送“TRX”,请确保将此值乘以1000000。
例:
2000000

上面指定的buildTransferTransaction将返回buildTransferContract的值,该值是创建事务对象的函数。

function buildTransferContract(message, contractType, typeName) {
  let anyValue = new google_protobuf_any_pb.Any();
  anyValue.pack(message.serializeBinary(), "protocol." + typeName);

  let contract = new Transaction.Contract();
  contract.setType(contractType);
  contract.setParameter(anyValue);

  let raw = new Transaction.raw();
  raw.addContract(contract);
  // raw.setTimestamp(new Date().getTime() * 1000000);

  let transaction = new Transaction();
  transaction.setRawData(raw);

  return transaction;
}

签署交易

导入的加密文件中的此函数将对事务对象进行签名。

function signTransaction(priKeyBytes, transaction) {

  if (typeof priKeyBytes === 'string') {
    priKeyBytes = hexStr2byteArray(priKeyBytes);
  }

  let raw = transaction.getRawData();
  let rawBytes = raw.serializeBinary();
  let hashBytes = SHA256(rawBytes);
  let signBytes = ECKeySign(hashBytes, priKeyBytes);
  let uint8Array = new Uint8Array(signBytes);
  let count = raw.getContractList().length;
  for (let i = 0; i < count; i++) {
    transaction.addSignature(uint8Array);
  }

  return {
    transaction,
    hex: byteArray2hexStr(transaction.serializeBinary()),
  };
}

该功能的参数是:

Value

数据类型

描述

priKeyBytes

Byte Array. 您也可以使用String,因为如果需要,该函数将值转换为字节数组。

帐户的私钥。

Transaction

Transaction Object

要发送的捆绑事务。

成功运行这些功能后,您将拥有一个已签名的事务,可以将其广播到TRON区块链。

完整代码示例

const CryptoUtils = require("@tronscan/client/src/utils/crypto");
const TransactionUtils = require("@tronscan/client/src/utils/transactionBuilder");

function transferContractTx() {
    const privateKey = "b815adfd6ef133d5a878869cb3a2b31f32d4c1481132a71300c3e125be0ab1a1";
    const token = "TRX";
    const fromAddress = CryptoUtils.pkToAddress(privateKey);
    const toAddress = "TQ6pM81JDC2GhrUoNYtZGvPc7SvyqcemEu";
    const amount = 1;

    let transaction = TransactionUtils.buildTransferTransaction(token, fromAddress, toAddress, amount);
  
    let signedTransaction = CryptoUtils.signTransaction(privateKey, transaction);
}

交易状态

下表详细说明了如何检查事务是否成功。

交易类型 判断交易是否成功的标准
transferContract 和 transferAssetContract 可以通过/walletsolidity/gettransactioninfobyid或者/walletsolidity/gettransactionbyid查询到交易。
TriggerSmartContract

有两种判断方式:

1. 通过/walletsolidity/gettransactioninfobyid 接口查到transactionInfo.receipt.result=success (建议不要用transactionInfo.result去判断,因为对于http 接口,成功的交易默认不返回该字段)。

2. 通过/walletsolidity/gettransactionbyid 接口查到transaction.ret.contractRet =success

InternalTransaction

通过/walletsolidity/gettransactioninfobyid查询,

HTTP 接口: 对于成功的交易,默认不返回 rejected 字段, 对于失败的交易,rejected=true。

GRPC 接口: 对于成功的交易,rejected=false(表示当前 internalTransaction 没有被舍弃), 对于失败的交易,rejected=true。

可参考以下文档.