我正试图通过bitcoinj (0.14.3版)进行交易,我希望在付款后得到补偿。我在使用testnet,这不是真正的比特币。我有下一个代码:
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); 因此,我要将两个输出放入事务中:
到第一个地址我寄了一些钱。到第二个地址,我发送下一个值:我钱包上所有可用的钱减去收到的第一个地址的钱。
但是在广播之后,我得到了一个意想不到的结果。在用这个方案做了几次交易之后,我注意到从钱包里提取了错误的值。令人惊讶的是,有时钱是取款,有时是钱到钱包里来。
有人能解释我做错了什么,以及如何修复它吗?
发布于 2017-01-11 00:02:13
事务不能按预期工作的原因是Bitcoinj Wallet类在后台为您做了很多事情--在本例中,它自动生成一个更改地址,其中is将存储事务的更改。另一个因素是bitcoinj计算出一笔费用,它将给矿商处理这笔交易的费用,这就是为什么你看到你所要求的换币地址越来越少(在生产网络上,如果你没有足够的资金支付这笔费用,它就会抛出一个例外)。
我认为,对于相对简单的情况,最好的解决方案是使用Wallet并让它自动生成更改地址(它使用确定性的密钥链,以便在丢失钱包时重新生成所有地址和密钥)。例如:
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个更改地址及其公共/私钥列表的方法:
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));
});https://stackoverflow.com/questions/39556376
复制相似问题