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.

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)
    – Vecna
    Feb 23, 2019 at 22:35

2 Answers 2

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.

-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;
}
2
  • 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
    Feb 23, 2019 at 22:45
  • 1
    This 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
    Feb 25, 2019 at 23:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.