tron-交易-交易构建

2023-10-23 14:23:52 浏览数 (1)

构建

区块链当中要发起一笔交易,需要考虑更多的是这笔交易的安全性。

在分布式、去中心化的环境当中,如何保证交易的安全性?

需要考虑几个问题:

  1. 如何保证交易正确性
  2. 交易不可篡改
  3. 非中心化场景下,交易的验证

构建TRX转账交易

构建交易需要最重要的东西就是私钥

需要了解TRON的ECKey的使用,tron ECC使用及项目中的应用

这里假设,你已经有了一套TRON的账户,包括:私钥、base58Check地址、公钥等。

如果在图形界面操作的话,完全不需要理解它的原理,这里说的是它在代码中是如何构建出一笔交易的。

构建交易需要跟FullNode产生交互。

需要准备好:

  1. 测试用的私钥
  2. owner的地址
  3. to的地址

实现

构建一笔交易,需要以下步骤:

  1. 构建交易protobuf
  2. 生成签名
  3. 发送交易

tron 链使用的是protobuf进行序列化和反序列人。

如果是在测试阶段完全可以自己搭一个FullNode进行测试。

构建交易protobuf

交易在本地构建后,最终是需要广播到链上,需要经过网络传输。所以需要序列化。

代码语言:javascript复制
public Transaction createTransaction(com.google.protobuf.Message message,
                                     ContractType contractType) {
  Transaction.raw.Builder transactionBuilder = Transaction.raw.newBuilder().addContract(
          Transaction.Contract.newBuilder()
                  .setType(contractType)
                  .setParameter(Any.pack(message))
                  .build()
  );

  Transaction transaction = Transaction.newBuilder().setRawData(transactionBuilder.build())
          .build();
  long gTime = count.incrementAndGet()   time;
  String ref = ""   gTime;
  transaction = setReference(transaction, gTime, ByteArray.fromString(ref));
  transaction = setExpiration(transaction, gTime);
  return transaction;
}
代码语言:javascript复制
import com.google.protobuf.ByteString;
import org.tron.common.crypto.ECKey;
import org.tron.common.utils.ByteArray;
import org.tron.common.utils.Commons;
import org.tron.protos.Protocol;
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
import org.tron.protos.contract.BalanceContract.TransferContract;
import org.tron.stress.design.factory.Creator;


/**
 * @author liukai
 */
@Creator(type = "transfer")
public class TransferCreator extends AbstractTransactionCreator implements TransactionCreator {

  private static String ownerAddress = "TXtrbmfwZ2LxtoCveEhZT86fTss1w8rwJE";
  private static String privateKey = "0528dc17428585fc4dece68b79fa7912270a1fe8e85f244372f59eb7e8925e04";
  private long amount = 1L;

  @Override
  public Protocol.Transaction create() {
    TransferContract contract = TransferContract.newBuilder()
            .setOwnerAddress(ByteString.copyFrom(Commons.decodeFromBase58Check(ownerAddress)))
            .setToAddress(ByteString.copyFrom(Commons.decodeFromBase58Check(GenerateTransaction.accountQueue.poll())))
            .setAmount(amount)
            .build();
    Protocol.Transaction transaction = createTransaction(contract, ContractType.TransferContract);
    return sign(transaction, ECKey.fromPrivate(ByteArray.fromHexString(privateKey)));
  }

}

测试一下

测试账号可以自行申请两个测试账号,自己给自己转账。

base58Check转byte

交易构建到这里就实现,如果需要构建交易,可以通过这种方式构建、签名,生成后的交易可以通过gRPCHTTP的方试广播到链上,也可以把交易持久化到磁盘进行测试。

0 人点赞