发送交易

任何与波场网络的交互行为都被称作为一笔交易。

一笔交易可以是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