严格来说,tx-signer并不属于SDK,它是bytomd中构建交易、对交易签名两大模块的java实现版。因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥。
如果你的目的是完全脱离于bytomd全节点,可能需要自己做更多额外的工作。比如,在构建交易时,需要花费若干个utxo(Unspent Transaction Output)作为交易的输入,如果没有全节点则需要自身来维护utxo。当使用tx-signer构建完成一笔交易并签名后,若没有全节点的帮助,也需要自己实现P2P网络协议将交易广播到其他节点。
本文不会对以上技术细节进行讨论,而是利用bytomd全节点查询可用的utxo构建交易,对交易进行签名并序列化后,同样使用bytomd提交交易。
准备工作
将Maven依赖引入到你的项目中
获取SDK源码
git clone https://github.com/Bytom/bytom-java-sdk.git
打包成JAR包并安装到本地的Maven仓库
$ mvn clean install -DskipTests
在项目的POM文件中添加依赖。其中,第一个依赖是bytomd api的封装,可用于查询可用的utxo以及提交交易;第二个依赖用于构建交易以及对交易进行离线签名。
io.bytom
java-sdk
1.0.0
io.bytom
tx-signer
1.0.0
构建交易
普通交易
查询可用的utxo
在本文中,以下将全部使用全节点来查询可用的utxo,你也可以构建一套自己的utxo维护方案。
Client client = Client.generateClient();
UnspentOutput.QueryBuilder builder = new UnspentOutput.QueryBuilder();
builder.accountAlias = "bytom";
List outputs = builder.list(client);
利用SDK只需要四行代码就能查询可用的utxo(SDK具体文档详见java-sdk documentation)。在QueryBuilder中可以指定是否为未确认的utxo(默认false),也可以通过from和count来进行分页查询(默认查询所有)。
假设在当前账户下查询得到这样一个utxo:
{
"account_alias": "bytom",
"id": "ffdc59d0478277298de4afa458dfa7623c051a46b7a84939fb8227083411b156",
"asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"asset_alias": "BTM",
"amount": 41250000000,
"account_id": "0G1R52O1G0A02",
"address": "sm1qxls6ajp6fejc0j5kp8jwt2nj3kmsqazfumrkrr",
"control_program_index": 1,