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.
2 Answers
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.
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;
}
-
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?– JohnnyFeb 23, 2019 at 22:45
-
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()
.– VecnaFeb 25, 2019 at 23:09
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)