Class Script


  • public class Script
    extends java.lang.Object

    Programs embedded inside transactions that control redemption of payments.

    Bitcoin transactions don't specify what they do directly. Instead a small binary stack language is used to define programs that when evaluated return whether the transaction "accepts" or rejects the other transactions connected to it.

    In SPV mode, scripts are not run, because that would require all transactions to be available and lightweight clients don't have that data. In full mode, this class is used to run the interpreted language. It also has static methods for building scripts.

    • Field Detail

      • ALL_VERIFY_FLAGS

        public static final java.util.EnumSet<Script.VerifyFlag> ALL_VERIFY_FLAGS
      • MAX_SCRIPT_ELEMENT_SIZE

        public static final int MAX_SCRIPT_ELEMENT_SIZE
        See Also:
        Constant Field Values
      • MAX_P2SH_SIGOPS

        public static final int MAX_P2SH_SIGOPS
        Max number of sigops allowed in a standard p2sh redeem script
        See Also:
        Constant Field Values
    • Method Detail

      • of

        public static Script of​(java.util.List<ScriptChunk> chunks)
        Wraps given script chunks.
        Parameters:
        chunks - chunks to wrap
        Returns:
        script that wraps the chunks
      • of

        public static Script of​(java.util.List<ScriptChunk> chunks,
                                java.time.Instant creationTime)
        Wraps given script chunks.
        Parameters:
        chunks - chunks to wrap
        creationTime - creation time of the script
        Returns:
        script that wraps the chunks
      • parse

        public static Script parse​(byte[] program)
                            throws ScriptException
        Construct a script that copies and wraps a given program. The array is parsed and checked for syntactic validity. Programs like this are e.g. used in TransactionInput and TransactionOutput.
        Parameters:
        program - array of program bytes
        Returns:
        parsed program
        Throws:
        ScriptException - if the program could not be parsed
      • parse

        public static Script parse​(byte[] program,
                                   java.time.Instant creationTime)
                            throws ScriptException
        Construct a script that copies and wraps a given program, and a creation time. The array is parsed and checked for syntactic validity. Programs like this are e.g. used in TransactionInput and TransactionOutput.
        Parameters:
        program - Array of program bytes from a transaction.
        creationTime - creation time of the script
        Returns:
        parsed program
        Throws:
        ScriptException - if the program could not be parsed
      • program

        public byte[] program()
        Gets the serialized program as a newly created byte array.
        Returns:
        serialized program
      • getProgram

        @Deprecated
        public byte[] getProgram()
        Deprecated.
      • chunks

        public java.util.List<ScriptChunk> chunks()
        Gets an immutable list of the scripts parsed form. Each chunk is either an opcode or data element.
        Returns:
        script chunks
      • getChunks

        @Deprecated
        public java.util.List<ScriptChunk> getChunks()
        Deprecated.
      • creationTime

        public java.util.Optional<java.time.Instant> creationTime()
        Gets the creation time of this script, or empty if unknown.
        Returns:
        creation time of this script, or empty if unknown
      • getCreationTimeSeconds

        @Deprecated
        public long getCreationTimeSeconds()
        Deprecated.
      • toString

        public java.lang.String toString()
        Returns the program opcodes as a string, for example "[1234] DUP HASH160", or "<empty>".
        Overrides:
        toString in class java.lang.Object
      • getPubKeyHash

        public byte[] getPubKeyHash()
                             throws ScriptException

        If the program somehow pays to a hash, returns the hash.

        Otherwise this method throws a ScriptException.

        Throws:
        ScriptException
      • getToAddress

        public Address getToAddress​(Network network,
                                    boolean forcePayToPubKey)
                             throws ScriptException
        Gets the destination address from this script, if it's in the required form.
        Parameters:
        forcePayToPubKey - If true, allow payToPubKey to be casted to the corresponding address. This is useful if you prefer showing addresses rather than pubkeys.
        Throws:
        ScriptException
      • getToAddress

        @Deprecated
        public Address getToAddress​(NetworkParameters params,
                                    boolean forcePayToPubKey)
                             throws ScriptException
        Gets the destination address from this script, if it's in the required form.
        Parameters:
        forcePayToPubKey - If true, allow payToPubKey to be casted to the corresponding address. This is useful if you prefer showing addresses rather than pubkeys.
        Throws:
        ScriptException
      • writeBytes

        public static void writeBytes​(java.io.OutputStream os,
                                      byte[] buf)
                               throws java.io.IOException
        Writes out the given byte buffer to the output stream with the correct opcode prefix To write an integer call writeBytes(out, Utils.reverseBytes(Utils.encodeMPI(val, false)));
        Throws:
        java.io.IOException
      • createMultiSigOutputScript

        public static byte[] createMultiSigOutputScript​(int threshold,
                                                        java.util.List<ECKey> pubkeys)
        Creates a program that requires at least N of the given keys to sign, using OP_CHECKMULTISIG.
      • createInputScript

        public static byte[] createInputScript​(byte[] signature,
                                               byte[] pubkey)
      • createInputScript

        public static byte[] createInputScript​(byte[] signature)
      • createEmptyInputScript

        public Script createEmptyInputScript​(@Nullable
                                             ECKey key,
                                             @Nullable
                                             Script redeemScript)
        Creates an incomplete scriptSig that, once filled with signatures, can redeem output containing this scriptPubKey. Instead of the signatures resulting script has OP_0. Having incomplete input script allows to pass around partially signed tx. It is expected that this program later on will be updated with proper signatures.
      • getScriptSigWithSignature

        public Script getScriptSigWithSignature​(Script scriptSig,
                                                byte[] sigBytes,
                                                int index)
        Returns a copy of the given scriptSig with the signature inserted in the given position.
      • getSigInsertionIndex

        public int getSigInsertionIndex​(Sha256Hash hash,
                                        ECKey signingKey)
        Returns the index where a signature by the key should be inserted. Only applicable to a P2SH scriptSig.
      • getPubKeys

        public java.util.List<ECKey> getPubKeys()
        Returns a list of the keys required by this script, assuming a multi-sig script.
        Throws:
        ScriptException - if the script type is not understood or is pay to address or is P2SH (run this method on the "Redeem script" instead).
      • decodeFromOpN

        public static int decodeFromOpN​(int opcode)
      • encodeToOpN

        public static int encodeToOpN​(int value)
      • getSigOpCount

        public static int getSigOpCount​(byte[] program)
                                 throws ScriptException
        Gets the count of regular SigOps in the script program (counting multisig ops as 20)
        Throws:
        ScriptException
      • getP2SHSigOpCount

        public static long getP2SHSigOpCount​(byte[] scriptSig)
                                      throws ScriptException
        Gets the count of P2SH Sig Ops in the Script scriptSig
        Throws:
        ScriptException
      • getNumberOfSignaturesRequiredToSpend

        public int getNumberOfSignaturesRequiredToSpend()
        Returns number of signatures required to satisfy this script.
      • getNumberOfBytesRequiredToSpend

        public int getNumberOfBytesRequiredToSpend​(@Nullable
                                                   ECKey pubKey,
                                                   @Nullable
                                                   Script redeemScript)
        Returns number of bytes required to spend this script. It accepts optional ECKey and redeemScript that may be required for certain types of script to estimate target size.
      • removeAllInstancesOf

        public static byte[] removeAllInstancesOf​(byte[] inputScript,
                                                  byte[] chunkToRemove)
        Returns the script bytes of inputScript with all instances of the specified script object removed
      • removeAllInstancesOfOp

        public static byte[] removeAllInstancesOfOp​(byte[] inputScript,
                                                    int opCode)
        Returns the script bytes of inputScript with all instances of the given op code removed
      • correctlySpends

        public void correctlySpends​(Transaction txContainingThis,
                                    int scriptSigIndex,
                                    @Nullable
                                    TransactionWitness witness,
                                    @Nullable
                                    Coin value,
                                    Script scriptPubKey,
                                    java.util.Set<Script.VerifyFlag> verifyFlags)
                             throws ScriptException
        Verifies that this script (interpreted as a scriptSig) correctly spends the given scriptPubKey.
        Parameters:
        txContainingThis - The transaction in which this input scriptSig resides. Accessing txContainingThis from another thread while this method runs results in undefined behavior.
        scriptSigIndex - The index in txContainingThis of the scriptSig (note: NOT the index of the scriptPubKey).
        scriptPubKey - The connected scriptPubKey containing the conditions needed to claim the value.
        witness - Transaction witness belonging to the transaction input containing this script. Needed for segwit.
        value - Value of the output. Needed for segwit scripts.
        verifyFlags - Each flag enables one validation rule.
        Throws:
        ScriptException
      • correctlySpends

        @Deprecated
        public void correctlySpends​(Transaction txContainingThis,
                                    long scriptSigIndex,
                                    Script scriptPubKey,
                                    java.util.Set<Script.VerifyFlag> verifyFlags)
                             throws ScriptException
        Verifies that this script (interpreted as a scriptSig) correctly spends the given scriptPubKey.
        Parameters:
        txContainingThis - The transaction in which this input scriptSig resides. Accessing txContainingThis from another thread while this method runs results in undefined behavior.
        scriptSigIndex - The index in txContainingThis of the scriptSig (note: NOT the index of the scriptPubKey).
        scriptPubKey - The connected scriptPubKey containing the conditions needed to claim the value.
        verifyFlags - Each flag enables one validation rule.
        Throws:
        ScriptException
      • getScriptType

        @Nullable
        public ScriptType getScriptType()
        Get the ScriptType.
        Returns:
        The script type, or null if the script is of unknown type
      • equals

        public boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object