首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过bitcoinj付款的正确途径

通过bitcoinj付款的正确途径
EN

Stack Overflow用户
提问于 2016-09-18 09:58:19
回答 1查看 1.7K关注 0票数 2

我正试图通过bitcoinj (0.14.3版)进行交易,我希望在付款后得到补偿。我在使用testnet,这不是真正的比特币。我有下一个代码:

代码语言:javascript
复制
Transaction tx = new Transaction(this.networkParameters);
Coin coinToSent = Coin.valueOf(Config.APP_COST);
Coin coinToChange = Coin.valueOf(walletBalance.getValue() - coinToSent.getValue());
tx.addOutput(coinToSent, appAddress);
tx.addOutput(coinToChange, changeAddress);

SendRequest request = SendRequest.forTx(tx);
try {
    this.walletAppKit.wallet().completeTx(request);
} catch (InsufficientMoneyException e) {
    e.printStackTrace();
    return false;
}
this.walletAppKit.wallet().commitTx(request.tx);
this.walletAppKit.peerGroup().broadcastTransaction(request.tx); 

因此,我要将两个输出放入事务中:

  1. 寄钱地址
  2. 取回零钱的钱包地址

到第一个地址我寄了一些钱。到第二个地址,我发送下一个值:我钱包上所有可用的钱减去收到的第一个地址的钱。

但是在广播之后,我得到了一个意想不到的结果。在用这个方案做了几次交易之后,我注意到从钱包里提取了错误的值。令人惊讶的是,有时钱是取款,有时是钱到钱包里来。

下面是到的链接

有人能解释我做错了什么,以及如何修复它吗?

EN

回答 1

Stack Overflow用户

发布于 2017-01-11 00:02:13

事务不能按预期工作的原因是Bitcoinj Wallet类在后台为您做了很多事情--在本例中,它自动生成一个更改地址,其中is将存储事务的更改。另一个因素是bitcoinj计算出一笔费用,它将给矿商处理这笔交易的费用,这就是为什么你看到你所要求的换币地址越来越少(在生产网络上,如果你没有足够的资金支付这笔费用,它就会抛出一个例外)。

我认为,对于相对简单的情况,最好的解决方案是使用Wallet并让它自动生成更改地址(它使用确定性的密钥链,以便在丢失钱包时重新生成所有地址和密钥)。例如:

代码语言:javascript
复制
public static Transaction send(Wallet wallet, 
                               String destinationAddress, 
                               long satoshis) throws Exception {
  Address dest = Address.fromBase58(params, destinationAddress);
  SendRequest request = SendRequest.to(dest, Coin.valueOf(satoshis));
  SendResult result = wallet.sendCoins(request);
  Transaction endTransaction = result.broadcastComplete.get();
  return endTransaction;
}

在完成sendCoins并广播事务后,钱包将维护其余部分(如果您确实希望确保您有更改地址的密钥,则可以在transactin完成后将其保存到文件中),下面是查看10个更改地址及其公共/私钥列表的方法:

代码语言:javascript
复制
NetworkParameters params = new MainNetParams();
List<DeterministicKey> keys = wallet.freshKeys(KeyChain.KeyPurpose.CHANGE, 10);
keys.forEach(key -> {
  Address address = new Address(params, key.getPubKeyHash());
  System.out.println(address +" : " + key.toStringWithPrivate(params));
});
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39556376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档