Class Script

java.lang.Object
org.bitcoinj.script.Script

public class Script extends 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 Details

  • Constructor Details

    • Script

      public Script(byte[] programBytes) throws ScriptException
      Construct a Script that copies and wraps the programBytes array. The array is parsed and checked for syntactic validity.
      Parameters:
      programBytes - Array of program bytes from a transaction.
      Throws:
      ScriptException
    • Script

      public Script(byte[] programBytes, long creationTimeSeconds) throws ScriptException
      Throws:
      ScriptException
  • Method Details

    • getCreationTimeSeconds

      public long getCreationTimeSeconds()
    • setCreationTimeSeconds

      public void setCreationTimeSeconds(long creationTimeSeconds)
    • toString

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

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

      public List<ScriptChunk> getChunks()
      Returns an immutable list of the scripts parsed form. Each chunk is either an opcode or data element.
    • isSentToRawPubKey

      @Deprecated public boolean isSentToRawPubKey()
    • isSentToAddress

      @Deprecated public boolean isSentToAddress()
    • 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(NetworkParameters params) throws ScriptException
      Gets the destination address from this script, if it's in the required form.
      Throws:
      ScriptException
    • getToAddress

      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(OutputStream os, byte[] buf) throws 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:
      IOException
    • createMultiSigOutputScript

      public static byte[] createMultiSigOutputScript(int threshold, 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.
    • createEmptyWitness

      public TransactionWitness createEmptyWitness(ECKey key)
    • 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 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.
    • isPayToScriptHash

      @Deprecated public boolean isPayToScriptHash()
    • isSentToMultiSig

      @Deprecated public boolean isSentToMultiSig()
    • 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
    • isOpReturn

      @Deprecated public boolean isOpReturn()
    • executeScript

      @Deprecated public static void executeScript(@Nullable Transaction txContainingThis, long index, Script script, LinkedList<byte[]> stack, boolean enforceNullDummy) throws ScriptException
      Exposes the script interpreter. Normally you should not use this directly, instead use TransactionInput.verify(TransactionOutput) or correctlySpends(Transaction, int, TransactionWitness, Coin, Script, Set). This method is useful if you need more precise control or access to the final state of the stack. This interface is very likely to change in future.
      Throws:
      ScriptException
    • executeScript

      public static void executeScript(@Nullable Transaction txContainingThis, long index, Script script, LinkedList<byte[]> stack, Set<Script.VerifyFlag> verifyFlags) throws ScriptException
      Exposes the script interpreter. Normally you should not use this directly, instead use TransactionInput.verify(TransactionOutput) or correctlySpends(Transaction, int, TransactionWitness, Coin, Script, Set). This method is useful if you need more precise control or access to the final state of the stack. This interface is very likely to change in future.
      Throws:
      ScriptException
    • correctlySpends

      public void correctlySpends(Transaction txContainingThis, int scriptSigIndex, @Nullable TransactionWitness witness, @Nullable Coin value, Script scriptPubKey, 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, 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 Script.ScriptType getScriptType()
      Returns:
      The script type, or null if the script is of unknown type
    • equals

      public boolean equals(Object o)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object