交易
生成签名交易
安装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 | 您要在交易中发送的资产。 |
from | String | 您要在交易中发送的地址。 |
to | String | 您要在交易中发送的地址。 |
amount | Integer | 您要花费指定令牌的金额。如果要发送“TRX”,请确保将此值乘以1000000。 |
上面指定的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。 可参考以下文档. |
Updated 9 months ago