构建

区块链当中要发起一笔交易,需要考虑更多的是这笔交易的安全性。
在分布式、去中心化的环境当中,如何保证交易的安全性?
需要考虑几个问题:

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

构建TRX转账交易

构建交易需要最重要的东西就是私钥
需要了解TRON的ECKey的使用,tron ECC使用及项目中的应用

这里假设,你已经有了一套TRON的账户,包括:私钥、base58Check地址、公钥等。
如果在图形界面操作的话,完全不需要理解它的原理,这里说的是它在代码中是如何构建出一笔交易的。
构建交易需要跟FullNode产生交互。

需要准备好:

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

实现

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

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

tron 链使用的是protobuf进行序列化和反序列人。
如果是在测试阶段完全可以自己搭一个FullNode进行测试。

构建交易protobuf

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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的方试广播到链上,也可以把交易持久化到磁盘进行测试。