任何与波场网络的交互行为都被称作为一笔交易。
一笔交易可以是TRX转账、质押/解锁TRX、触发智能合约等。
只有消耗资源的交易才会被记录在链上。
发送交易的流程
正常情况下,发送一笔交易的流程如下:
创建 -> 签名 -> 广播 -> (等待上链) -> 在链上查询到交易信息
创建交易
任一非查询类的方法都会返回一个未签名的交易,例如:
public TransactionExtention transfer(String fromAddress, String toAddress, long amount) throws IllegalException {
ByteString rawFrom = parseAddress(fromAddress);
ByteString rawTo = parseAddress(toAddress);
TransferContract req = TransferContract.newBuilder()
.setOwnerAddress(rawFrom)
.setToAddress(rawTo)
.setAmount(amount)
.build();
TransactionExtention txnExt = blockingStub.createTransaction2(req);
if(SUCCESS != txnExt.getResult().getCode()){
throw new IllegalException(txnExt.getResult().getMessage().toStringUtf8());
}
return txnExt;
}
添加参数
wrapper.TransactionBuilder
允许你在签名之前为交易添加参数,例如:
TransactionBuilder builder = new TransactionBuilder(transaction);
builder.setFeeLimit(100000000L);
builder.setMemo("memo");
//call TransactionBuilder.build() to get a new transaction
builder.build();
注意,只有触发智能合约的交易才需要设置feeLimit。
签名
有两种方式可以签名:
使用绑定的私钥签名
每一个ApiWrapper
实例在初始化时都绑定了一个私钥(或是一个64位的十六进制字符串)。直接调用签名方法即可。
Transction signedTransaction = wrapper.signTransaction(transaction);
使用指定的私钥签名
无论在初始化时使用了什么私钥,你都可以指定任何其他的私钥用作签名:
Transaction signedTransaction = wrapper.signTransaction(transaction, SECP256K1.KeyPair);
参考 org.tron.trident.crypto.SECP256K1
来构造自定义的 SECP256K1.KeyPair
。
广播
交易哈希会因为对交易的任何改动发生变化(除了添加签名)。
交易哈希会在广播之前重新计算。
wrapper.broadcastTransaction(signedTransaction);
//return transaction hash if successfully broadcasted, otherwise the error code