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