how to get the sender's address in bitcoinj

0

I'm trying to modify the simple wallettemplate to get the sender's address in the transaction list. However since TransactionInput.getFromAddress() doesn't exist now and getConnectedOutput().getAddressFromP2PKHScript() is deprecated, I don't know which is the right way to do so.

Johnny

Posted 2019-02-22T16:08:55.650

Reputation: 1

It's not entirely clear to me why TransactionOutput.getAddressFromP2PKHScript() has been deprecated. It seems to me that perhaps Andreas Schildbach (who deprecated the method) is trying to discourage people trying to determine a "sender" of a transaction in such a way because of the ambiguity involved (for instance if a transaction has multiple "senders". (See, e.g., here|sort:date/bitcoinj/02mDeOiHeuk/BDmr-KulBgAJ))

Vecna 2019-02-23T22:35:21.413

Answers

1

Bitcoin transactions don't have a sender's address.

What you're doing is inferring what address previously controlled some or all of the funds involved in the transaction. But:

  • Previously controlling the funds doesn't mean you found the sender. In case the coins were held by a custodial exchange, the address will be the exchange, and not the sender of the funds. In particular, sending coins back there won't make them reach the right person.
  • Transactions can be jointly constructed using multiple participants. You can only guess which is which.
  • The script that previously controlled the funds may not have an associates address at all.

If you want to know what the sender's address of a transaction is, ask the person who sent it (for example if you need a refund address, ask it before showing an address to pay to). If it's not a transaction you're involved in, it's probably none of your business.

Pieter Wuille

Posted 2019-02-22T16:08:55.650

Reputation: 54 032

-1

public Address getFromAddress(TransactionInput txIn) {
    // get script from connected output
    TransactionOutput txOut = txIn.getConnectedOutput();
    Script txOutScript = txOut.getScriptPubKey();

    // get address from script
    Address fromAddress = txOutScript.getToAddress(MainNetParams.get());

    return fromAddress;
}

Vecna

Posted 2019-02-22T16:08:55.650

Reputation: 304

thank you! which TransactionInput should I check? if I use tx.getInput(0) I get a NullPointerException. Should I iterate over all the inputs or is it something else I'm missing?Johnny 2019-02-23T22:45:45.503

1This is the problem with trying to find the sender. A "sender" isn't a clear idea for a Bitcoin transaction. A transaction's inputs could come from multiple sources. Ultimately, determining which input(s) to consider the "sender" is up to you. As for the NullPointerException, coinbase transactions have no inputs, and I'm guessing that's probably where you're getting the exception. You'll want to skip over the transaction if tx.isCoinBase().Vecna 2019-02-25T23:09:50.780