===================================== The BitcoinScript Interactive Shell ===================================== The easiest way to play around with the bitcoin scripting language is using an interactive shell. **BitcoinScript integrates with IPython**, by adding a bunch of IPython-magics. This way, you can perform bitcoin-script operations inside a IPython session, while enjoying all the nice features of IPython. :note: The examples here use the `automagic` IPython setting, so they don't require a `%`-prefix before each magic call. If you don't use `automagic`, you'd need to add the `%`-prefix as required. Starting the Interactive Shell ================================= Start an IPython session, and activate the BitcoinScript magics by importing `bitcoinscript.shell`:: % ipython3 > import bitcoinscript.shell *** BitcoinScript shell magics are Enabled. Enter `%Shelp` for more details. *** > Alternatively, you can load the BitcoinScript magics explicitly when starting ipython:: % ipython3 -i bitcoinscript/shell.py *** BitcoinScript shell magics are Enabled. Enter `%Shelp` for more details. *** > To find the path to pass to ipython's `-i` option, run:: python3 -c 'import bitcoinscript.shell; print(bitcoinscript.shell.__file__)' Interactive Shell Example ================================= A simple example, for the challange of finding the hash-preimage of `c0b057f584795eff8b06d5e420e71d747587d20de836f501921fd1b5741f1283`:: % ipython3 ### Activate BitcoinScript magics: > import bitcoinscript.shell *** BitcoinScript shell magics are Enabled. Enter `%Shelp` for more details. *** ### Compose the output script: given an input, hash it, push the expected hash, and compare. ### The scripts are printed after each addition. We could use `Sechooff` to supress echoing. > OP_HASH256 InScript : [] *OutScript : [OP_HASH256] > Spushdata 0xc0b057f584795eff8b06d5e420e71d747587d20de836f501921fd1b5741f1283 InScript : [] *OutScript : [OP_HASH256 c0b057f5...741f1283] > OP_EQUAL InScript : [] *OutScript : [OP_HASH256 c0b057f5...741f1283 OP_EQUAL] ### We get an error if we run the script without providing an input. > Sverify *ERROR* [MissingOpArgumentsError] EvalScript: missing arguments for OP_HASH256; need 1 items, but only 0 on stack ### Add an input. Maybe the answer is 2? > Sinscript INSCRIPT is now active > OP_2 *InScript : [2] OutScript : [OP_HASH256 c0b057f5...741f1283 OP_EQUAL] > Sverify *ERROR* [VerifyScriptError] scriptPubKey returned false ### Try another input. Maybe the answer is 0xff? > Sclear *InScript : [] OutScript : [OP_HASH256 c0b057f5...741f1283 OP_EQUAL] > Spushdata 0xff *InScript : [ff] OutScript : [OP_HASH256 c0b057f5...741f1283 OP_EQUAL] > Sverify SUCCESS ### YES!!