Class Transaction
- java.lang.Object
-
- org.bitcoinj.core.Message
-
- org.bitcoinj.core.ChildMessage
-
- org.bitcoinj.core.Transaction
-
public class Transaction extends ChildMessage
A transaction represents the movement of coins from some addresses to some other addresses. It can also represent the minting of new coins. A Transaction object corresponds to the equivalent in the Bitcoin C++ implementation.
Transactions are the fundamental atoms of Bitcoin and have many powerful features. Read "Working with transactions" in the documentation to learn more about how to use this class.
All Bitcoin transactions are at risk of being reversed, though the risk is much less than with traditional payment systems. Transactions have confidence levels, which help you decide whether to trust a transaction or not. Whether to trust a transaction is something that needs to be decided on a case by case basis - a rule that makes sense for selling MP3s might not make sense for selling cars, or accepting payments from a family member. If you are building a wallet, how to present confidence to your users is something to consider carefully.
Instances of this class are not safe for use by multiple threads.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
Transaction.Purpose
This enum describes the underlying reason the transaction was created.static class
Transaction.SigHash
These constants are a part of a scriptSig signature on the inputs.
-
Field Summary
Fields Modifier and Type Field Description static Coin
DEFAULT_TX_FEE
If using this feePerKb, transactions will get confirmed within the next couple of blocks.static int
LOCKTIME_THRESHOLD
Threshold for lockTime: below this value it is interpreted as block number, otherwise as timestamp.static java.math.BigInteger
LOCKTIME_THRESHOLD_BIG
Same but as a BigInteger for CHECKLOCKTIMEVERIFYstatic int
MAX_STANDARD_TX_SIZE
How many bytes a transaction can be before it won't be relayed anymore.static Coin
MIN_NONDUST_OUTPUT
Deprecated.static Coin
REFERENCE_DEFAULT_MIN_TX_FEE
If feePerKb is lower than this, Bitcoin Core will treat it as if there were no fee.static int
SERIALIZE_TRANSACTION_NO_WITNESS
When this bit is set in protocolVersion, do not include witness.static byte
SIGHASH_ANYONECANPAY_VALUE
Deprecated.Instead use SigHash.ANYONECANPAY.value or SigHash.ANYONECANPAY.byteValue() as appropriate.static java.util.Comparator<Transaction>
SORT_TX_BY_HEIGHT
A comparator that can be used to sort transactions by their chain height.static java.util.Comparator<Transaction>
SORT_TX_BY_UPDATE_TIME
A comparator that can be used to sort transactions by their updateTime field.-
Fields inherited from class org.bitcoinj.core.ChildMessage
parent
-
Fields inherited from class org.bitcoinj.core.Message
cursor, length, MAX_SIZE, offset, params, payload, recached, serializer, UNKNOWN_LENGTH
-
-
Constructor Summary
Constructors Constructor Description Transaction(NetworkParameters params)
Transaction(NetworkParameters params, byte[] payloadBytes)
Creates a transaction from the given serialized bytes, eg, from a block or a tx network message.Transaction(NetworkParameters params, byte[] payload, int offset)
Creates a transaction by reading payload starting from offset bytes in.Transaction(NetworkParameters params, byte[] payload, int offset, Message parent, MessageSerializer setSerializer, int length, byte[] hashFromHeader)
Creates a transaction by reading payload starting from offset bytes in.Transaction(NetworkParameters params, byte[] payload, Message parent, MessageSerializer setSerializer, int length)
Creates a transaction by reading payload.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
addBlockAppearance(Sha256Hash blockHash, int relativityOffset)
TransactionInput
addInput(Sha256Hash spendTxHash, long outputIndex, Script script)
Creates and adds an input to this transaction, with no checking that it's valid.TransactionInput
addInput(TransactionInput input)
Adds an input directly, with no checking that it's valid.TransactionInput
addInput(TransactionOutput from)
Adds an input to this transaction that imports value from the given output.TransactionOutput
addOutput(Coin value, Address address)
Creates an output based on the given address and value, adds it to this transaction, and returns the new output.TransactionOutput
addOutput(Coin value, ECKey pubkey)
Creates an output that pays to the given pubkey directly (no address) with the given value, adds it to this transaction, and returns the new output.TransactionOutput
addOutput(Coin value, Script script)
Creates an output that pays to the given script.TransactionOutput
addOutput(TransactionOutput to)
Adds the given output to this transaction.TransactionInput
addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, Coin amount, ECKey sigKey)
Adds a new and fully signed input for the given parameters.TransactionInput
addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, Coin amount, ECKey sigKey, Transaction.SigHash sigHash, boolean anyoneCanPay)
Adds a new and fully signed input for the given parameters.TransactionInput
addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, ECKey sigKey)
TransactionInput
addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, ECKey sigKey, Transaction.SigHash sigHash, boolean anyoneCanPay)
TransactionInput
addSignedInput(TransactionOutput output, ECKey sigKey)
Adds an input that points to the given output and contains a valid signature for it, calculated using the signing key.TransactionInput
addSignedInput(TransactionOutput output, ECKey sigKey, Transaction.SigHash sigHash, boolean anyoneCanPay)
Adds an input that points to the given output and contains a valid signature for it, calculated using the signing key.protected void
bitcoinSerializeToStream(java.io.OutputStream stream)
Serializes this message to the provided stream.protected void
bitcoinSerializeToStream(java.io.OutputStream stream, boolean useSegwit)
Serialize according to BIP144 or the classic format, depending on if segwit is desired.protected static int
calcLength(byte[] buf, int offset)
TransactionSignature
calculateSignature(int inputIndex, ECKey key, byte[] redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position.TransactionSignature
calculateSignature(int inputIndex, ECKey key, Script redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position.TransactionSignature
calculateSignature(int inputIndex, ECKey key, org.bouncycastle.crypto.params.KeyParameter aesKey, byte[] redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position.TransactionSignature
calculateSignature(int inputIndex, ECKey key, org.bouncycastle.crypto.params.KeyParameter aesKey, Script redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position.TransactionSignature
calculateWitnessSignature(int inputIndex, ECKey key, byte[] scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
TransactionSignature
calculateWitnessSignature(int inputIndex, ECKey key, Script scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
TransactionSignature
calculateWitnessSignature(int inputIndex, ECKey key, org.bouncycastle.crypto.params.KeyParameter aesKey, byte[] scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
TransactionSignature
calculateWitnessSignature(int inputIndex, ECKey key, org.bouncycastle.crypto.params.KeyParameter aesKey, Script scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
void
checkCoinBaseHeight(int height)
Check block height is in coinbase input script, for use after BIP 34 enforcement is enabled.void
clearInputs()
Removes all the inputs from this transaction.void
clearOutputs()
Removes all the outputs from this transaction.boolean
equals(java.lang.Object o)
java.util.Date
estimateLockTime(AbstractBlockChain chain)
Returns either the lock time as a date, if it was specified in seconds, or an estimate based on the time in the current head block if it was specified as a block time.Sha256Hash
findWitnessCommitment()
Loops the outputs of a coinbase transaction to locate the witness commitment.java.util.Map<Sha256Hash,java.lang.Integer>
getAppearsInHashes()
Returns a map of block [hashes] which contain the transaction mapped to relativity counters, or null if this transaction doesn't have that data because it's not stored in the wallet or because it has never appeared in a block.TransactionConfidence
getConfidence()
Returns the confidence object for this transaction from theTxConfidenceTable
referenced by the implicitContext
.TransactionConfidence
getConfidence(Context context)
Returns the confidence object for this transaction from theTxConfidenceTable
referenced by the givenContext
.TransactionConfidence
getConfidence(TxConfidenceTable table)
Returns the confidence object for this transaction from theTxConfidenceTable
ExchangeRate
getExchangeRate()
Getter forexchangeRate
.Coin
getFee()
The transaction fee is the difference of the value of all inputs and the value of all outputs.Sha256Hash
getHash()
Deprecated.usegetTxId()
java.lang.String
getHashAsString()
Deprecated.usegetTxId()
.toString()TransactionInput
getInput(long index)
Same as getInputs().get(index).java.util.List<TransactionInput>
getInputs()
Returns an unmodifiable view of all inputs.Coin
getInputSum()
Gets the sum of the inputs, regardless of who owns them.long
getLockTime()
Transactions can have an associated lock time, specified either as a block height or in seconds since the UNIX epoch.java.lang.String
getMemo()
Returns the transactionmemo
.int
getMessageSizeForPriorityCalc()
The priority (coin age) calculation doesn't use the regular message size, but rather one adjusted downwards for the number of inputs.int
getOptimalEncodingMessageSize()
TransactionOutput
getOutput(long index)
Same as getOutputs().get(index)java.util.List<TransactionOutput>
getOutputs()
Returns an unmodifiable view of all outputs.Coin
getOutputSum()
Gets the sum of the outputs of the transaction.Transaction.Purpose
getPurpose()
Returns the purpose for which this transaction was created.int
getSigOpCount()
Gets the count of regular SigOps in this transactionsSha256Hash
getTxId()
Returns the transaction id as you see them in block explorers.java.util.Date
getUpdateTime()
Returns the earliest time at which the transaction was seen (broadcast or included into the chain), or the epoch if that information isn't available.Coin
getValue(TransactionBag wallet)
Returns the difference ofgetValueSentToMe(TransactionBag)
andgetValueSentFromMe(TransactionBag)
.Coin
getValueSentFromMe(TransactionBag wallet)
Calculates the sum of the inputs that are spending coins with keys in the wallet.Coin
getValueSentToMe(TransactionBag transactionBag)
Calculates the sum of the outputs that are sending coins to a key in the wallet.long
getVersion()
int
getVsize()
Gets the virtual transaction size as defined in BIP141.java.util.List<TransactionOutput>
getWalletOutputs(TransactionBag transactionBag)
Returns the list of transacion outputs, whether spent or unspent, that match a wallet by address or that are watched by a wallet, i.e., transaction outputs whose script's address is controlled by the wallet and transaction outputs whose script is watched by the wallet.int
getWeight()
Gets the transaction weight as defined in BIP141.Sha256Hash
getWTxId()
Returns the witness transaction id (aka witness id) as per BIP144.boolean
hasConfidence()
Check if the transaction has a known confidenceint
hashCode()
Sha256Hash
hashForSignature(int inputIndex, byte[] connectedScript, byte sigHashType)
This is required for signatures which use a sigHashType which cannot be represented using SigHash and anyoneCanPay See transaction c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73, which has sigHashType 0Sha256Hash
hashForSignature(int inputIndex, byte[] redeemScript, Transaction.SigHash type, boolean anyoneCanPay)
Calculates a signature hash, that is, a hash of a simplified form of the transaction.Sha256Hash
hashForSignature(int inputIndex, Script redeemScript, Transaction.SigHash type, boolean anyoneCanPay)
Calculates a signature hash, that is, a hash of a simplified form of the transaction.Sha256Hash
hashForWitnessSignature(int inputIndex, byte[] scriptCode, Coin prevValue, byte sigHashType)
Sha256Hash
hashForWitnessSignature(int inputIndex, byte[] scriptCode, Coin prevValue, Transaction.SigHash type, boolean anyoneCanPay)
Sha256Hash
hashForWitnessSignature(int inputIndex, Script scriptCode, Coin prevValue, Transaction.SigHash type, boolean anyoneCanPay)
Calculates a signature hash, that is, a hash of a simplified form of the transaction.boolean
hasRelativeLockTime()
A transaction has a relative lock time (BIP 68) if it is version 2 or higher and at least one of its inputs has itsTransactionInput.SEQUENCE_LOCKTIME_DISABLE_FLAG
cleared.boolean
hasWitnesses()
boolean
isAnyOutputSpent()
Returns true if any of the outputs is marked as spent.boolean
isCoinBase()
A coinbase transaction is one that creates a new coin.boolean
isEveryOwnedOutputSpent(TransactionBag transactionBag)
Returns false if this transaction has at least one output that is owned by the given wallet and unspent, true otherwise.boolean
isFinal(int height, long blockTimeSeconds)
Returns true if this transaction is considered finalized and can be placed in a block.boolean
isMature()
A transaction is mature if it is either a building coinbase tx that is as deep or deeper than the required coinbase depth, or a non-coinbase tx.boolean
isOptInFullRBF()
Returns whether this transaction will opt into the full replace-by-fee semantics.boolean
isPending()
Convenience wrapper around getConfidence().getConfidenceType()boolean
isTimeLocked()
A transaction is time-locked if at least one of its inputs is non-final and it has a lock time.protected void
parse()
Deserialize according to BIP144 or the classic format, depending on if the transaction is segwit or not.void
setBlockAppearance(StoredBlock block, boolean bestChain, int relativityOffset)
Puts the given block in the internal set of blocks in which this transaction appears.void
setExchangeRate(ExchangeRate exchangeRate)
Setter forexchangeRate
.void
setLockTime(long lockTime)
Transactions can have an associated lock time, specified either as a block height or in seconds since the UNIX epoch.void
setMemo(java.lang.String memo)
Set the transactionmemo
.void
setPurpose(Transaction.Purpose purpose)
Marks the transaction as being created for the given purpose.void
setUpdateTime(java.util.Date updatedAt)
void
setVersion(int version)
void
shuffleOutputs()
Randomly re-orders the transaction outputs: good for privacyjava.lang.String
toHexString()
Serializes the transaction into the Bitcoin network format and encodes it as hex string.java.lang.String
toString()
java.lang.String
toString(AbstractBlockChain chain, java.lang.CharSequence indent)
A human readable version of the transaction useful for debugging.protected void
unCache()
To be called before any change of internal values including any setters.void
verify()
Checks the transaction contents for sanity, in ways that can be done in a standalone manner.-
Methods inherited from class org.bitcoinj.core.ChildMessage
adjustLength, adjustLength, setParent
-
Methods inherited from class org.bitcoinj.core.Message
bitcoinSerialize, bitcoinSerialize, getMessageSize, getParams, hasMoreBytes, isCached, isRecached, readByte, readByteArray, readBytes, readHash, readInt64, readStr, readUint32, readUint64, readVarInt, readVarInt, setSerializer, unsafeBitcoinSerialize
-
-
-
-
Field Detail
-
SORT_TX_BY_UPDATE_TIME
public static final java.util.Comparator<Transaction> SORT_TX_BY_UPDATE_TIME
A comparator that can be used to sort transactions by their updateTime field. The ordering goes from most recent into the past.
-
SORT_TX_BY_HEIGHT
public static final java.util.Comparator<Transaction> SORT_TX_BY_HEIGHT
A comparator that can be used to sort transactions by their chain height.
-
SERIALIZE_TRANSACTION_NO_WITNESS
public static final int SERIALIZE_TRANSACTION_NO_WITNESS
When this bit is set in protocolVersion, do not include witness. The actual value is the same as in Bitcoin Core for consistency.- See Also:
- Constant Field Values
-
LOCKTIME_THRESHOLD
public static final int LOCKTIME_THRESHOLD
Threshold for lockTime: below this value it is interpreted as block number, otherwise as timestamp.- See Also:
- Constant Field Values
-
LOCKTIME_THRESHOLD_BIG
public static final java.math.BigInteger LOCKTIME_THRESHOLD_BIG
Same but as a BigInteger for CHECKLOCKTIMEVERIFY
-
MAX_STANDARD_TX_SIZE
public static final int MAX_STANDARD_TX_SIZE
How many bytes a transaction can be before it won't be relayed anymore. Currently 100kb.- See Also:
- Constant Field Values
-
REFERENCE_DEFAULT_MIN_TX_FEE
public static final Coin REFERENCE_DEFAULT_MIN_TX_FEE
If feePerKb is lower than this, Bitcoin Core will treat it as if there were no fee.
-
DEFAULT_TX_FEE
public static final Coin DEFAULT_TX_FEE
If using this feePerKb, transactions will get confirmed within the next couple of blocks. This should be adjusted from time to time. Last adjustment: February 2017.
-
MIN_NONDUST_OUTPUT
@Deprecated public static final Coin MIN_NONDUST_OUTPUT
Deprecated.
-
SIGHASH_ANYONECANPAY_VALUE
public static final byte SIGHASH_ANYONECANPAY_VALUE
Deprecated.Instead use SigHash.ANYONECANPAY.value or SigHash.ANYONECANPAY.byteValue() as appropriate.- See Also:
- Constant Field Values
-
-
Constructor Detail
-
Transaction
public Transaction(NetworkParameters params)
-
Transaction
public Transaction(NetworkParameters params, byte[] payloadBytes) throws ProtocolException
Creates a transaction from the given serialized bytes, eg, from a block or a tx network message.- Throws:
ProtocolException
-
Transaction
public Transaction(NetworkParameters params, byte[] payload, int offset) throws ProtocolException
Creates a transaction by reading payload starting from offset bytes in. Length of a transaction is fixed.- Throws:
ProtocolException
-
Transaction
public Transaction(NetworkParameters params, byte[] payload, int offset, @Nullable Message parent, MessageSerializer setSerializer, int length, @Nullable byte[] hashFromHeader) throws ProtocolException
Creates a transaction by reading payload starting from offset bytes in. Length of a transaction is fixed.- Parameters:
params
- NetworkParameters object.payload
- Bitcoin protocol formatted byte array containing message content.offset
- The location of the first payload byte within the array.parent
- The parent of the transaction.setSerializer
- The serializer to use for this transaction.length
- The length of message if known. Usually this is provided when deserializing of the wire as the length will be provided as part of the header. If unknown then set to Message.UNKNOWN_LENGTHhashFromHeader
- Used by BitcoinSerializer. The serializer has to calculate a hash for checksumming so to avoid wasting the considerable effort a set method is provided so the serializer can set it. No verification is performed on this hash.- Throws:
ProtocolException
-
Transaction
public Transaction(NetworkParameters params, byte[] payload, @Nullable Message parent, MessageSerializer setSerializer, int length) throws ProtocolException
Creates a transaction by reading payload. Length of a transaction is fixed.- Throws:
ProtocolException
-
-
Method Detail
-
getHash
@Deprecated public Sha256Hash getHash()
Deprecated.usegetTxId()
Description copied from class:Message
This method is a NOP for all classes except Block and Transaction. It is only declared in Message so BitcoinSerializer can avoid 2 instanceof checks + a casting.
-
getHashAsString
@Deprecated public java.lang.String getHashAsString()
Deprecated.usegetTxId()
.toString()
-
getTxId
public Sha256Hash getTxId()
Returns the transaction id as you see them in block explorers. It is used as a reference by transaction inputs via outpoints.
-
getWTxId
public Sha256Hash getWTxId()
Returns the witness transaction id (aka witness id) as per BIP144. For transactions without witness, this is the same asgetTxId()
.
-
getWeight
public int getWeight()
Gets the transaction weight as defined in BIP141.
-
getVsize
public int getVsize()
Gets the virtual transaction size as defined in BIP141.
-
getInputSum
public Coin getInputSum()
Gets the sum of the inputs, regardless of who owns them.
-
getValueSentToMe
public Coin getValueSentToMe(TransactionBag transactionBag)
Calculates the sum of the outputs that are sending coins to a key in the wallet.
-
getAppearsInHashes
@Nullable public java.util.Map<Sha256Hash,java.lang.Integer> getAppearsInHashes()
Returns a map of block [hashes] which contain the transaction mapped to relativity counters, or null if this transaction doesn't have that data because it's not stored in the wallet or because it has never appeared in a block.
-
isPending
public boolean isPending()
Convenience wrapper around getConfidence().getConfidenceType()- Returns:
- true if this transaction hasn't been seen in any block yet.
-
setBlockAppearance
public void setBlockAppearance(StoredBlock block, boolean bestChain, int relativityOffset)
Puts the given block in the internal set of blocks in which this transaction appears. This is used by the wallet to ensure transactions that appear on side chains are recorded properly even though the block stores do not save the transaction data at all.
If there is a re-org this will be called once for each block that was previously seen, to update which block is the best chain. The best chain block is guaranteed to be called last. So this must be idempotent.
Sets updatedAt to be the earliest valid block time where this tx was seen.
- Parameters:
block
- TheStoredBlock
in which the transaction has appeared.bestChain
- whether to set the updatedAt timestamp from the block header (only if not already set)relativityOffset
- A number that disambiguates the order of transactions within a block.
-
addBlockAppearance
public void addBlockAppearance(Sha256Hash blockHash, int relativityOffset)
-
getValueSentFromMe
public Coin getValueSentFromMe(TransactionBag wallet) throws ScriptException
Calculates the sum of the inputs that are spending coins with keys in the wallet. This requires the transactions sending coins to those keys to be in the wallet. This method will not attempt to download the blocks containing the input transactions if the key is in the wallet but the transactions are not.- Returns:
- sum of the inputs that are spending coins with keys in the wallet
- Throws:
ScriptException
-
getOutputSum
public Coin getOutputSum()
Gets the sum of the outputs of the transaction. If the outputs are less than the inputs, it does not count the fee.- Returns:
- the sum of the outputs regardless of who owns them.
-
getValue
public Coin getValue(TransactionBag wallet) throws ScriptException
Returns the difference ofgetValueSentToMe(TransactionBag)
andgetValueSentFromMe(TransactionBag)
.- Throws:
ScriptException
-
getFee
public Coin getFee()
The transaction fee is the difference of the value of all inputs and the value of all outputs. Currently, the fee can only be determined for transactions created by us.- Returns:
- fee, or null if it cannot be determined
-
isAnyOutputSpent
public boolean isAnyOutputSpent()
Returns true if any of the outputs is marked as spent.
-
isEveryOwnedOutputSpent
public boolean isEveryOwnedOutputSpent(TransactionBag transactionBag)
Returns false if this transaction has at least one output that is owned by the given wallet and unspent, true otherwise.
-
getUpdateTime
public java.util.Date getUpdateTime()
Returns the earliest time at which the transaction was seen (broadcast or included into the chain), or the epoch if that information isn't available.
-
setUpdateTime
public void setUpdateTime(java.util.Date updatedAt)
-
unCache
protected void unCache()
Description copied from class:Message
To be called before any change of internal values including any setters. This ensures any cached byte array is removed.
Child messages of this object(e.g. Transactions belonging to a Block) will not have their internal byte caches invalidated unless they are also modified internally.
- Overrides:
unCache
in classChildMessage
-
calcLength
protected static int calcLength(byte[] buf, int offset)
-
parse
protected void parse() throws ProtocolException
Deserialize according to BIP144 or the classic format, depending on if the transaction is segwit or not.- Specified by:
parse
in classMessage
- Throws:
ProtocolException
-
hasWitnesses
public boolean hasWitnesses()
- Returns:
- true of the transaction has any witnesses in any of its inputs
-
getOptimalEncodingMessageSize
public int getOptimalEncodingMessageSize()
-
getMessageSizeForPriorityCalc
public int getMessageSizeForPriorityCalc()
The priority (coin age) calculation doesn't use the regular message size, but rather one adjusted downwards for the number of inputs. The goal is to incentivise cleaning up the UTXO set with free transactions, if one can do so.
-
isCoinBase
public boolean isCoinBase()
A coinbase transaction is one that creates a new coin. They are the first transaction in each block and their value is determined by a formula that all implementations of Bitcoin share. In 2011 the value of a coinbase transaction is 50 coins, but in future it will be less. A coinbase transaction is defined not only by its position in a block but by the data in the inputs.
-
isMature
public boolean isMature()
A transaction is mature if it is either a building coinbase tx that is as deep or deeper than the required coinbase depth, or a non-coinbase tx.
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
toString
public java.lang.String toString(@Nullable AbstractBlockChain chain, @Nullable java.lang.CharSequence indent)
A human readable version of the transaction useful for debugging. The format is not guaranteed to be stable.- Parameters:
chain
- If provided, will be used to estimate lock times (if set). Can be null.
-
toHexString
public java.lang.String toHexString()
Serializes the transaction into the Bitcoin network format and encodes it as hex string.- Returns:
- raw transaction in hex format
-
clearInputs
public void clearInputs()
Removes all the inputs from this transaction. Note that this also invalidates the length attribute
-
addInput
public TransactionInput addInput(TransactionOutput from)
Adds an input to this transaction that imports value from the given output. Note that this input is not complete and after every input is added withaddInput(TransactionInput)
and every output is added withaddOutput(TransactionOutput)
, aTransactionSigner
must be used to finalize the transaction and finish the inputs off. Otherwise it won't be accepted by the network.- Returns:
- the newly created input.
-
addInput
public TransactionInput addInput(TransactionInput input)
Adds an input directly, with no checking that it's valid.- Returns:
- the new input.
-
addInput
public TransactionInput addInput(Sha256Hash spendTxHash, long outputIndex, Script script)
Creates and adds an input to this transaction, with no checking that it's valid.- Returns:
- the newly created input.
-
addSignedInput
public TransactionInput addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, Coin amount, ECKey sigKey, Transaction.SigHash sigHash, boolean anyoneCanPay) throws ScriptException
Adds a new and fully signed input for the given parameters. Note that this method is not thread safe and requires external synchronization. Please refer to general documentation on Bitcoin scripting and contracts to understand the values of sigHash and anyoneCanPay: otherwise you can use the other form of this method that sets them to typical defaults.- Parameters:
prevOut
- A reference to the output being spentscriptPubKey
- The scriptPubKey of the outputamount
- The amount of the output (which is part of the signature hash for segwit)sigKey
- The signing keysigHash
- enum specifying how the transaction hash is calculatedanyoneCanPay
- anyone-can-pay hashing- Returns:
- The newly created input
- Throws:
ScriptException
- if the scriptPubKey is something we don't know how to sign.
-
addSignedInput
public TransactionInput addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, ECKey sigKey, Transaction.SigHash sigHash, boolean anyoneCanPay) throws ScriptException
- Parameters:
prevOut
- A reference to the output being spentscriptPubKey
- The scriptPubKey of the outputsigKey
- The signing keysigHash
- enum specifying how the transaction hash is calculatedanyoneCanPay
- anyone-can-pay hashing- Returns:
- The newly created input
- Throws:
ScriptException
- if the scriptPubKey is something we don't know how to sign.
-
addSignedInput
public TransactionInput addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, Coin amount, ECKey sigKey) throws ScriptException
Adds a new and fully signed input for the given parameters. Note that this method is not thread safe and requires external synchronization. Defaults toTransaction.SigHash.ALL
and "false" for the anyoneCanPay flag. This is normally what you want.- Parameters:
prevOut
- A reference to the output being spentscriptPubKey
- The scriptPubKey of the outputamount
- The amount of the output (which is part of the signature hash for segwit)sigKey
- The signing key- Returns:
- The newly created input
- Throws:
ScriptException
- if the scriptPubKey is something we don't know how to sign.
-
addSignedInput
public TransactionInput addSignedInput(TransactionOutPoint prevOut, Script scriptPubKey, ECKey sigKey) throws ScriptException
- Parameters:
prevOut
- A reference to the output being spentscriptPubKey
- The scriptPubKey of the outputsigKey
- The signing key- Returns:
- The newly created input
- Throws:
ScriptException
- if the scriptPubKey is something we don't know how to sign.
-
addSignedInput
public TransactionInput addSignedInput(TransactionOutput output, ECKey sigKey)
Adds an input that points to the given output and contains a valid signature for it, calculated using the signing key. Defaults toTransaction.SigHash.ALL
and "false" for the anyoneCanPay flag. This is normally what you want.- Parameters:
output
- output to sign and use as inputsigKey
- The signing key- Returns:
- The newly created input
-
addSignedInput
public TransactionInput addSignedInput(TransactionOutput output, ECKey sigKey, Transaction.SigHash sigHash, boolean anyoneCanPay)
Adds an input that points to the given output and contains a valid signature for it, calculated using the signing key.- Parameters:
output
- output to sign and use as inputsigKey
- The signing keysigHash
- enum specifying how the transaction hash is calculatedanyoneCanPay
- anyone-can-pay hashing- Returns:
- The newly created input
- See Also:
addSignedInput(TransactionOutPoint, Script, Coin, ECKey, SigHash, boolean)
-
clearOutputs
public void clearOutputs()
Removes all the outputs from this transaction. Note that this also invalidates the length attribute
-
addOutput
public TransactionOutput addOutput(TransactionOutput to)
Adds the given output to this transaction. The output must be completely initialized. Returns the given output.
-
addOutput
public TransactionOutput addOutput(Coin value, Address address)
Creates an output based on the given address and value, adds it to this transaction, and returns the new output.
-
addOutput
public TransactionOutput addOutput(Coin value, ECKey pubkey)
Creates an output that pays to the given pubkey directly (no address) with the given value, adds it to this transaction, and returns the new output.
-
addOutput
public TransactionOutput addOutput(Coin value, Script script)
Creates an output that pays to the given script. The address and key forms are specialisations of this method, you won't normally need to use it unless you're doing unusual things.
-
calculateSignature
public TransactionSignature calculateSignature(int inputIndex, ECKey key, byte[] redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position. This is simply a wrapper around callinghashForSignature(int, byte[], Transaction.SigHash, boolean)
followed byECKey.sign(Sha256Hash)
and then returning a newTransactionSignature
. The key must be usable for signing as-is: if the key is encrypted it must be decrypted first external to this method.- Parameters:
inputIndex
- Which input to calculate the signature for, as an index.key
- The private key used to calculate the signature.redeemScript
- Byte-exact contents of the scriptPubKey that is being satisfied, or the P2SH redeem script.hashType
- Signing mode, see the enum for documentation.anyoneCanPay
- Signing mode, see the SigHash enum for documentation.- Returns:
- A newly calculated signature object that wraps the r, s and sighash components.
-
calculateSignature
public TransactionSignature calculateSignature(int inputIndex, ECKey key, Script redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position. This is simply a wrapper around callinghashForSignature(int, byte[], Transaction.SigHash, boolean)
followed byECKey.sign(Sha256Hash)
and then returning a newTransactionSignature
.- Parameters:
inputIndex
- Which input to calculate the signature for, as an index.key
- The private key used to calculate the signature.redeemScript
- The scriptPubKey that is being satisfied, or the P2SH redeem script.hashType
- Signing mode, see the enum for documentation.anyoneCanPay
- Signing mode, see the SigHash enum for documentation.- Returns:
- A newly calculated signature object that wraps the r, s and sighash components.
-
calculateSignature
public TransactionSignature calculateSignature(int inputIndex, ECKey key, @Nullable org.bouncycastle.crypto.params.KeyParameter aesKey, byte[] redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position. This is simply a wrapper around callinghashForSignature(int, byte[], Transaction.SigHash, boolean)
followed byECKey.sign(Sha256Hash)
and then returning a newTransactionSignature
. The key must be usable for signing as-is: if the key is encrypted it must be decrypted first external to this method.- Parameters:
inputIndex
- Which input to calculate the signature for, as an index.key
- The private key used to calculate the signature.aesKey
- The AES key to use for decryption of the private key. If null then no decryption is required.redeemScript
- Byte-exact contents of the scriptPubKey that is being satisfied, or the P2SH redeem script.hashType
- Signing mode, see the enum for documentation.anyoneCanPay
- Signing mode, see the SigHash enum for documentation.- Returns:
- A newly calculated signature object that wraps the r, s and sighash components.
-
calculateSignature
public TransactionSignature calculateSignature(int inputIndex, ECKey key, @Nullable org.bouncycastle.crypto.params.KeyParameter aesKey, Script redeemScript, Transaction.SigHash hashType, boolean anyoneCanPay)
Calculates a signature that is valid for being inserted into the input at the given position. This is simply a wrapper around callinghashForSignature(int, byte[], Transaction.SigHash, boolean)
followed byECKey.sign(Sha256Hash)
and then returning a newTransactionSignature
.- Parameters:
inputIndex
- Which input to calculate the signature for, as an index.key
- The private key used to calculate the signature.aesKey
- The AES key to use for decryption of the private key. If null then no decryption is required.redeemScript
- The scriptPubKey that is being satisfied, or the P2SH redeem script.hashType
- Signing mode, see the enum for documentation.anyoneCanPay
- Signing mode, see the SigHash enum for documentation.- Returns:
- A newly calculated signature object that wraps the r, s and sighash components.
-
hashForSignature
public Sha256Hash hashForSignature(int inputIndex, byte[] redeemScript, Transaction.SigHash type, boolean anyoneCanPay)
Calculates a signature hash, that is, a hash of a simplified form of the transaction. How exactly the transaction is simplified is specified by the type and anyoneCanPay parameters.
This is a low level API and when using the regular
Wallet
class you don't have to call this yourself. When working with more complex transaction types and contracts, it can be necessary. When signing a P2SH output the redeemScript should be the script encoded into the scriptSig field, for normal transactions, it's the scriptPubKey of the output you're signing for.- Parameters:
inputIndex
- input the signature is being calculated for. Tx signatures are always relative to an input.redeemScript
- the bytes that should be in the given input during signing.type
- Should be SigHash.ALLanyoneCanPay
- should be false.
-
hashForSignature
public Sha256Hash hashForSignature(int inputIndex, Script redeemScript, Transaction.SigHash type, boolean anyoneCanPay)
Calculates a signature hash, that is, a hash of a simplified form of the transaction. How exactly the transaction is simplified is specified by the type and anyoneCanPay parameters.
This is a low level API and when using the regular
Wallet
class you don't have to call this yourself. When working with more complex transaction types and contracts, it can be necessary. When signing a P2SH output the redeemScript should be the script encoded into the scriptSig field, for normal transactions, it's the scriptPubKey of the output you're signing for.- Parameters:
inputIndex
- input the signature is being calculated for. Tx signatures are always relative to an input.redeemScript
- the script that should be in the given input during signing.type
- Should be SigHash.ALLanyoneCanPay
- should be false.
-
hashForSignature
public Sha256Hash hashForSignature(int inputIndex, byte[] connectedScript, byte sigHashType)
This is required for signatures which use a sigHashType which cannot be represented using SigHash and anyoneCanPay See transaction c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73, which has sigHashType 0
-
calculateWitnessSignature
public TransactionSignature calculateWitnessSignature(int inputIndex, ECKey key, byte[] scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
-
calculateWitnessSignature
public TransactionSignature calculateWitnessSignature(int inputIndex, ECKey key, Script scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
-
calculateWitnessSignature
public TransactionSignature calculateWitnessSignature(int inputIndex, ECKey key, @Nullable org.bouncycastle.crypto.params.KeyParameter aesKey, byte[] scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
-
calculateWitnessSignature
public TransactionSignature calculateWitnessSignature(int inputIndex, ECKey key, @Nullable org.bouncycastle.crypto.params.KeyParameter aesKey, Script scriptCode, Coin value, Transaction.SigHash hashType, boolean anyoneCanPay)
-
hashForWitnessSignature
public Sha256Hash hashForWitnessSignature(int inputIndex, byte[] scriptCode, Coin prevValue, Transaction.SigHash type, boolean anyoneCanPay)
-
hashForWitnessSignature
public Sha256Hash hashForWitnessSignature(int inputIndex, Script scriptCode, Coin prevValue, Transaction.SigHash type, boolean anyoneCanPay)
Calculates a signature hash, that is, a hash of a simplified form of the transaction. How exactly the transaction is simplified is specified by the type and anyoneCanPay parameters.
This is a low level API and when using the regular
Wallet
class you don't have to call this yourself. When working with more complex transaction types and contracts, it can be necessary. When signing a Witness output the scriptCode should be the script encoded into the scriptSig field, for normal transactions, it's the scriptPubKey of the output you're signing for. (See BIP143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki)- Parameters:
inputIndex
- input the signature is being calculated for. Tx signatures are always relative to an input.scriptCode
- the script that should be in the given input during signing.prevValue
- the value of the coin being spenttype
- Should be SigHash.ALLanyoneCanPay
- should be false.
-
hashForWitnessSignature
public Sha256Hash hashForWitnessSignature(int inputIndex, byte[] scriptCode, Coin prevValue, byte sigHashType)
-
bitcoinSerializeToStream
protected void bitcoinSerializeToStream(java.io.OutputStream stream) throws java.io.IOException
Description copied from class:Message
Serializes this message to the provided stream. If you just want the raw bytes use bitcoinSerialize().- Overrides:
bitcoinSerializeToStream
in classMessage
- Throws:
java.io.IOException
-
bitcoinSerializeToStream
protected void bitcoinSerializeToStream(java.io.OutputStream stream, boolean useSegwit) throws java.io.IOException
Serialize according to BIP144 or the classic format, depending on if segwit is desired.- Throws:
java.io.IOException
-
getLockTime
public long getLockTime()
Transactions can have an associated lock time, specified either as a block height or in seconds since the UNIX epoch. A transaction is not allowed to be confirmed by miners until the lock time is reached, and since Bitcoin 0.8+ a transaction that did not end its lock period (non final) is considered to be non standard and won't be relayed or included in the memory pool either.
-
setLockTime
public void setLockTime(long lockTime)
Transactions can have an associated lock time, specified either as a block height or in seconds since the UNIX epoch. A transaction is not allowed to be confirmed by miners until the lock time is reached, and since Bitcoin 0.8+ a transaction that did not end its lock period (non final) is considered to be non standard and won't be relayed or included in the memory pool either.
-
getVersion
public long getVersion()
-
setVersion
public void setVersion(int version)
-
getInputs
public java.util.List<TransactionInput> getInputs()
Returns an unmodifiable view of all inputs.
-
getOutputs
public java.util.List<TransactionOutput> getOutputs()
Returns an unmodifiable view of all outputs.
-
getWalletOutputs
public java.util.List<TransactionOutput> getWalletOutputs(TransactionBag transactionBag)
Returns the list of transacion outputs, whether spent or unspent, that match a wallet by address or that are watched by a wallet, i.e., transaction outputs whose script's address is controlled by the wallet and transaction outputs whose script is watched by the wallet.
- Parameters:
transactionBag
- The wallet that controls addresses and watches scripts.- Returns:
- linked list of outputs relevant to the wallet in this transaction
-
shuffleOutputs
public void shuffleOutputs()
Randomly re-orders the transaction outputs: good for privacy
-
getInput
public TransactionInput getInput(long index)
Same as getInputs().get(index).
-
getOutput
public TransactionOutput getOutput(long index)
Same as getOutputs().get(index)
-
getConfidence
public TransactionConfidence getConfidence()
Returns the confidence object for this transaction from theTxConfidenceTable
referenced by the implicitContext
.
-
getConfidence
public TransactionConfidence getConfidence(Context context)
Returns the confidence object for this transaction from theTxConfidenceTable
referenced by the givenContext
.
-
getConfidence
public TransactionConfidence getConfidence(TxConfidenceTable table)
Returns the confidence object for this transaction from theTxConfidenceTable
-
hasConfidence
public boolean hasConfidence()
Check if the transaction has a known confidence
-
equals
public boolean equals(java.lang.Object o)
- Overrides:
equals
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
getSigOpCount
public int getSigOpCount() throws ScriptException
Gets the count of regular SigOps in this transactions- Throws:
ScriptException
-
checkCoinBaseHeight
public void checkCoinBaseHeight(int height) throws VerificationException
Check block height is in coinbase input script, for use after BIP 34 enforcement is enabled.- Throws:
VerificationException
-
findWitnessCommitment
public Sha256Hash findWitnessCommitment()
Loops the outputs of a coinbase transaction to locate the witness commitment.
-
verify
public void verify() throws VerificationException
Checks the transaction contents for sanity, in ways that can be done in a standalone manner. Does not perform all checks on a transaction such as whether the inputs are already spent. Specifically this method verifies:
- That there is at least one input and output.
- That the serialized size is not larger than the max block size.
- That no outputs have negative value.
- That the outputs do not sum to larger than the max allowed quantity of coin in the system.
- If the tx is a coinbase tx, the coinbase scriptSig size is within range. Otherwise that there are no coinbase inputs in the tx.
- Throws:
VerificationException
-
isTimeLocked
public boolean isTimeLocked()
A transaction is time-locked if at least one of its inputs is non-final and it has a lock time. A transaction can also have a relative lock time which this method doesn't tell. Use
hasRelativeLockTime()
to find out.To check if this transaction is final at a given height and time, see
isFinal(int, long)
-
hasRelativeLockTime
public boolean hasRelativeLockTime()
A transaction has a relative lock time (BIP 68) if it is version 2 or higher and at least one of its inputs has itsTransactionInput.SEQUENCE_LOCKTIME_DISABLE_FLAG
cleared.
-
isOptInFullRBF
public boolean isOptInFullRBF()
Returns whether this transaction will opt into the full replace-by-fee semantics.
-
isFinal
public boolean isFinal(int height, long blockTimeSeconds)
Returns true if this transaction is considered finalized and can be placed in a block. Non-finalized transactions won't be included by miners and can be replaced with newer versions using sequence numbers. This is useful in certain types of contracts, such as micropayment channels.
Note that currently the replacement feature is disabled in Bitcoin Core and will need to be re-activated before this functionality is useful.
-
estimateLockTime
public java.util.Date estimateLockTime(AbstractBlockChain chain)
Returns either the lock time as a date, if it was specified in seconds, or an estimate based on the time in the current head block if it was specified as a block time.
-
getPurpose
public Transaction.Purpose getPurpose()
Returns the purpose for which this transaction was created. See the javadoc forTransaction.Purpose
for more information on the point of this field and what it can be.
-
setPurpose
public void setPurpose(Transaction.Purpose purpose)
Marks the transaction as being created for the given purpose. See the javadoc forTransaction.Purpose
for more information on the point of this field and what it can be.
-
getExchangeRate
@Nullable public ExchangeRate getExchangeRate()
Getter forexchangeRate
.
-
setExchangeRate
public void setExchangeRate(ExchangeRate exchangeRate)
Setter forexchangeRate
.
-
getMemo
@Nullable public java.lang.String getMemo()
Returns the transactionmemo
.
-
setMemo
public void setMemo(java.lang.String memo)
Set the transactionmemo
. It can be used to record the memo of the payment request that initiated the transaction.
-
-