构建
区块链当中要发起一笔交易,需要考虑更多的是这笔交易的安全性。
在分布式、去中心化的环境当中,如何保证交易的安全性?
需要考虑几个问题:
- 如何保证交易正确性
- 交易不可篡改
- 非中心化场景下,交易的验证
构建TRX转账交易
构建交易需要最重要的东西就是私钥。
需要了解TRON的ECKey的使用,tron ECC使用及项目中的应用
这里假设,你已经有了一套TRON的账户,包括:私钥、base58Check地址、公钥等。
如果在图形界面操作的话,完全不需要理解它的原理,这里说的是它在代码中是如何构建出一笔交易的。
构建交易需要跟FullNode产生交互。
需要准备好:
- 测试用的私钥
- owner的地址
- to的地址
实现
构建一笔交易,需要以下步骤:
- 构建交易
protobuf
- 生成签名
- 发送交易
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;
@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
交易构建到这里就实现,如果需要构建交易,可以通过这种方式构建、签名,生成后的交易可以通过gRPC
或HTTP
的方试广播到链上,也可以把交易持久化到磁盘进行测试。