2016-09-18 9 views
1

私はbitcoinj(バージョン0.14.3)経由で取引をしようとしています。支払い後に変更を返す予定です。私はtestnetを使って作業しています。実際のビットコインではありません。 私は次のコードを持っている:バック bitcoinj経由で支払いを行う正しい方法

を変更を取得するための私の財布のお金

  • アドレスを送信する

    1. 住所:私は、トランザクションに2つの出力を入れています、だから、

      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); 
      

      を最初の住所に私はお金を送る。そして2番目の住所に私は次の価値を送ります:私の財布のすべての利用可能なお金から最初の住所に受け取ったお金。

      しかし、放送後、私は予期せぬ結果を得ました。このスキームでいくつかの取引をした後、私は間違った価値が私の財布から撤退していることに気付きました。驚くべきことは、時にはお金が撤回しているが、時にはお金が財布に来ることもある。

      Here is the link to testnet explorer

      誰かが私が間違っているとどのようにそれを修正するのですか説明できますか?

  • 答えて

    0

    BitCinj Walletクラスは、バックグラウンドで多くのことを行っているということです。この場合、変更アドレスを自動的に生成しますトランザクション。もう1つの要因は、bitcoinjが鉱夫に取引を処理させる料金を計算することです。これは変更アドレスが要求したコインが少なくなっているのを見ている理由です(運用ネットワークでは、手数料をカバーするのに十分な資金があります)。

    ここでは、比較的単純なケースのために、ウォレットAPIを使用して、自動的に変更アドレスを生成する作業を行うようにしています(決定的なキーチェーンを使用しているためウォレットを失った場合に再生されます)。たとえば:あなたは本当にあなたが鍵を持っていることを確認したい場合transactinが完了した後に

    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が完了し、トランザクションが放送された後、財布は(残りの部分を維持する、あなたはそれをファイルに保存することができます変更アドレスは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)); 
    }); 
    
    関連する問題