Skip to content
shigeyuki azuchi edited this page Mar 18, 2022 · 4 revisions

bitcoinrb support Bitcoin Script and interpreter.

Bitcoin::Script

Bitcoin Script is represented by Bitcoin::Script class.

Create Script instance

Script instances can be constructed in various ways.

# load from bynary.
script = Bitcoin::Script.parse_from_payload('76a91446c2fbfbecc99a63148fa076de58cf29b0bcf0b088ac'.htb)

# load from string.
script = Bitcoin::Script.from_string('OP_DUP OP_HASH160 46c2fbfbecc99a63148fa076de58cf29b0bcf0b0 OP_EQUALVERIFY OP_CHECKSIG')

# create using opcode
include Bitcoin::Opcodes
script = Bitcoin::Script.new << OP_DUP << OP_HASH160 << '46c2fbfbecc99a63148fa076de58cf29b0bcf0b0' << OP_EQUALVERIFY << OP_CHECKSIG

Eval script

Script can be evaluated with the Bitcoin::Script#run method. it returns true if the Script evaluation is successful, false otherwise.

script = Bitcoin::Script.from_string('6 1 OP_ADD 7 OP_EQUAL')
script.run
=> true

This is a simple script execution and the actual evaluation is executed by Bitcoin::ScriptInterpreter.

Utility

Bitcoin::Script has some utility method for handling frequently used scripts.

# create P2PKH script.
script = Bitcoin::Script.to_p2pkh('46c2fbfbecc99a63148fa076de58cf29b0bcf0b0')

# create P2WPKH script.
script = Bitcoin::Script.to_p2wpkh('46c2fbfbecc99a63148fa076de58cf29b0bcf0b0')

# create P2SH script with the current script as the redeem script.
p2sh = script.to_p2sh

# create multisig script.
k1 = '021525ca2c0cbd42de7e4f5793c79887fbc8b136b5fe98b279581ef6959307f9e9'
k2 = '032ad705d98318241852ba9394a90e85f6afc8f7b5f445675040318a9d9ea29e35'
script = Bitcoin::Script.to_p2sh_multisig_script(1, [k1, k2])

# create P2WSH script
script = Bitcoin::Script.to_p2wsh(<redeem script>)

There are any other useful methods.

Bitcoin::ScriptInterpreter

Bitcoin::ScriptInterpreter is a script interpreter that is also used when validating transactions, allowing more detailed script evaluation with flags.

script_pubkey = Bitcoin::Script.to_p2pkh('46c2fbfbecc99a63148fa076de58cf29b0bcf0b0')
script_sig = Bitcoin::Script.new << <sig> << <pubkey>

tx_checker = Bitcoin::TxChecker.new(tx: <Bitcoin::Tx instance>, input_index: 0, amount: <value per satoshi>)
interpreter = Bitcoin::ScriptInterpreter.new(flags: Bitcoin::STANDARD_SCRIPT_VERIFY_FLAGS, checker: tx_checker)
interpreter.verify_script(script_sig, script_pubkey)
# if success return true, otherwise false

# if using segwit transaction, specify witness data.
interpreter.verify_script(script_sig, script_pubkey, witness)
Clone this wiki locally