https://github.com/ppad-tech/script
Representations and fast conversions for Script
https://github.com/ppad-tech/script
bitcoin bitcoin-script haskell
Last synced: 7 months ago
JSON representation
Representations and fast conversions for Script
- Host: GitHub
- URL: https://github.com/ppad-tech/script
- Owner: ppad-tech
- License: mit
- Created: 2025-01-18T18:25:21.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2025-03-10T16:57:41.000Z (about 1 year ago)
- Last Synced: 2025-03-10T17:50:59.881Z (about 1 year ago)
- Topics: bitcoin, bitcoin-script, haskell
- Language: Haskell
- Homepage:
- Size: 68.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG
- License: LICENSE
Awesome Lists containing this project
README
# script
[](https://hackage.haskell.org/package/ppad-script)

[](https://docs.ppad.tech/script)
Representations for [Script](https://en.bitcoin.it/wiki/Script),
including abstract syntax, 'ByteArray', and base16-encoded 'ByteString'
versions, as well as fast conversion utilities for working with them.
## Usage
A sample GHCi session:
```
> :set -XOverloadedStrings
>
> -- import qualified
> import qualified Bitcoin.Prim.Script as S
>
> -- base16-encoded p2pkh scriptPubKey
> let p2pkh = "76a91489abcdefabbaabbaabbaabbaabbaabbaabbaabba88ac"
>
> -- bytearray-encoded
> let Just script = S.from_base16 p2pkh
> script
Script [ 0x76, 0xa9, 0x14, 0x89, 0xab, 0xcd, 0xef
, 0xab, 0xba, 0xab, 0xba, 0xab, 0xba, 0xab
, 0xba, 0xab, 0xba, 0xab, 0xba, 0xab, 0xba
, 0xab, 0xba, 0x88, 0xac
]
>
> -- abstract syntax-encoded
> let terms = S.from_script script
> terms
[ OP_DUP, OP_HASH160, OP_PUSHBYTES_20, 0x89, 0xab, 0xcd, 0xef
, 0xab, 0xba, 0xab, 0xba, 0xab, 0xba, 0xab
, 0xba, 0xab, 0xba, 0xab, 0xba, 0xab, 0xba
, 0xab, 0xba, OP_EQUALVERIFY, OP_CHECKSIG
]
>
> -- round-trip
> S.to_base16 (S.to_script terms)
"76a91489abcdefabbaabbaabbaabbaabbaabbaabbaabba88ac"
```
## Documentation
Haddocks (API documentation, etc.) are hosted at
[docs.ppad.tech/script](https://docs.ppad.tech/script).
## Performance
The aim is best-in-class performance for highly-auditable Haskell code.
Current benchmark figures on my mid-2020 MacBook Air look like (use
`cabal bench` to run the benchmark suite):
```
benchmarking to_script
time 484.9 ns (478.3 ns .. 491.4 ns)
0.998 R² (0.997 R² .. 0.999 R²)
mean 496.2 ns (485.8 ns .. 508.1 ns)
std dev 37.17 ns (30.08 ns .. 49.95 ns)
variance introduced by outliers: 83% (severely inflated)
benchmarking from_script
time 380.8 ns (374.3 ns .. 387.5 ns)
0.998 R² (0.996 R² .. 0.999 R²)
mean 383.0 ns (375.3 ns .. 395.4 ns)
std dev 31.88 ns (22.41 ns .. 43.86 ns)
variance introduced by outliers: 86% (severely inflated)
benchmarking to_base16
time 291.3 ns (285.6 ns .. 297.9 ns)
0.996 R² (0.995 R² .. 0.998 R²)
mean 298.3 ns (291.8 ns .. 308.1 ns)
std dev 26.38 ns (21.25 ns .. 34.27 ns)
variance introduced by outliers: 87% (severely inflated)
benchmarking from_base16
time 439.1 ns (429.9 ns .. 448.2 ns)
0.997 R² (0.996 R² .. 0.998 R²)
mean 437.9 ns (429.9 ns .. 450.0 ns)
std dev 32.67 ns (26.12 ns .. 44.04 ns)
variance introduced by outliers: 83% (severely inflated)
```
where the inputs to the above functions are variations of the script found
in the 'Usage' section.
## Security
This library aims at the maximum security achievable in a
garbage-collected language under an optimizing compiler such as GHC, in
which strict constant-timeness can be challenging to achieve.
If you discover any vulnerabilities, please disclose them via
security@ppad.tech.
## Development
You'll require [Nix][nixos] with [flake][flake] support enabled. Enter a
development shell with:
```
$ nix develop
```
Then do e.g.:
```
$ cabal repl ppad-script
```
to get a REPL for the main library.
## Attribution
The list of opcodes was originally taken
verbatim from the 'opcode' crate found in
[rust-bitcoin](https://github.com/rust-bitcoin/rust-bitcoin).
[nixos]: https://nixos.org/
[flake]: https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html