The original ES6 source can be found on GitHub.
This package can be used to evaluate Bitcoin scripts as follows:
var evaluate = evaluate;var script = 'OP_1 OP_VERIFY';;// => true
OP_VERIFY could be excluded, as default behavior is to check for a 1 on the top of the stack if there's no terminating command in the script.)
Alternatively, you can use the lock-unlock paradigm, which concatenates the scripts before evaluating:
var unlock = unlock;var scriptSig = 'OP_1';var scriptPubKey = 'OP_VERIFY';;// => true
If you'd like to enable disabled commands, you can do so by passing
true as the second argument to any of the exported functions. Here, we use the
OP_MUL command, which is typically disabled:
var evaluate = evaluate;var script = 'OP_2 OP_3 OP_MUL OP_6 OP_EQUAL OP_VERIFY';;// => true
How It Works
(A longer explanation of Script and this implementation can be found in my blog post.)
When the parser runs over a Script program, it returns an object of the following form:
value: valuecode: code
This allows for inspection into the compiled code (e.g., for use in the live editor), as well as the return value (
false) of the Script.
As a user, you should only be using the functions exported in
index.js, which includes a
parse function that returns this
(value, code) pair.
Deviations From the Spec
Note that as this is an educational tool, the goal is not to create a full-fidelity re-implementation of Script, but rather, to focus on re-creating Script's core behavior. With that in mind, the implementation here differs from that described on the Wiki in a few ways. For example:
- Unlike in the official implementation, OP_CHECKMULTISIG does not pop an extra, arbitrary value off the stack (as this is considered a bug and would only serve to confuse new users).
- Signatures aren't generated by hashing transaction inputs and outputs (as the snippets only exist in isolation); instead, the protocol expects users to sign a simple nonce (in this case, the string 'Secure').
- Any hex data is pushed to the state with no limitations.