bip32

Pure Haskell BIP32 hierarchical deterministic wallets (docs.ppad.tech/bip32).
git clone git://git.ppad.tech/bip32.git
Log | Files | Refs | README | LICENSE

commit d4b9d2f26e19416e1153571e449321ac5d62c939
parent 1012b91e5537dff1f00b59ae2759b177f8a2ae31
Author: Jared Tobin <jared@jtobin.io>
Date:   Fri, 20 Jun 2025 16:47:08 +0400

meta: readme

Diffstat:
MREADME.md | 55+++++++++++++++++++++++++------------------------------
1 file changed, 25 insertions(+), 30 deletions(-)

diff --git a/README.md b/README.md @@ -23,17 +23,17 @@ A sample GHCi session: "xpub661MyMwAqRbcG6TPJvVs1yKFJGtN4vi785g2xDacQ9Luyw3gyAyvY5DNatPzfsUQK4nTUAmQboxw3WYDHtY4vfcGJR4FAuLLaUp2t7ejhoC" > > -- derive child nodes via a path - > let child = derive_partial m "m/44'/0'/0'/0/0" + > let Just child = derive m "m/44'/0'/0'/0/0" > xpub child "xpub6GEwJiJFou5PH6LL8cagArvArrXhSaq35XWnT73CShNRBJa9jxHsWnPsydvmN2vcPBg9KHfRyYLiYnUKCJ8ncba4CgzF56n4kpkqMTSFy35" > > -- use the 'hd_key' record to extract the extended key - > let Right (XPrv (X sec cod)) = hd_key child - > sec + > let Right my_xprv = hd_key child + > xprv_key my_xprv 82064013501759548583899633460204676801585795402966146917762774758050650403971 > > -- use 'parse' to import an extended key - > let Just hd = parse (xprv child) + > let Just hd = xprv child >>= parse > hd == child True ``` @@ -49,44 +49,39 @@ The aim is best-in-class performance for pure, highly-auditable Haskell code. Most time is spent on elliptic curve multiplication or hashing; strict BIP32 functionality is only a small layer on top of that. -Current benchmark figures on my mid-2020 MacBook Air look like (use +Current benchmark figures on an M4 Silicon MacBook Air look like (use `cabal bench` to run the benchmark suite): ``` benchmarking ppad-bip32/derive_child_pub - time 7.766 ms (7.404 ms .. 8.215 ms) - 0.985 R² (0.975 R² .. 0.995 R²) - mean 7.717 ms (7.565 ms .. 7.890 ms) - std dev 463.5 μs (362.7 μs .. 653.5 μs) - variance introduced by outliers: 31% (moderately inflated) + time 2.668 ms (2.663 ms .. 2.672 ms) + 1.000 R² (1.000 R² .. 1.000 R²) + mean 2.661 ms (2.658 ms .. 2.664 ms) + std dev 8.440 μs (6.211 μs .. 13.00 μs) benchmarking ppad-bip32/derive_child_priv - time 5.080 ms (4.884 ms .. 5.277 ms) - 0.991 R² (0.985 R² .. 0.997 R²) - mean 5.045 ms (4.974 ms .. 5.140 ms) - std dev 252.6 μs (201.1 μs .. 310.9 μs) - variance introduced by outliers: 28% (moderately inflated) + time 1.784 ms (1.783 ms .. 1.785 ms) + 1.000 R² (1.000 R² .. 1.000 R²) + mean 1.781 ms (1.780 ms .. 1.782 ms) + std dev 2.300 μs (1.939 μs .. 2.835 μs) benchmarking ppad-bip32/xpub - time 2.654 ms (2.571 ms .. 2.771 ms) - 0.984 R² (0.976 R² .. 0.992 R²) - mean 2.613 ms (2.538 ms .. 2.684 ms) - std dev 242.8 μs (204.0 μs .. 284.3 μs) - variance introduced by outliers: 64% (severely inflated) + time 901.1 μs (900.0 μs .. 902.3 μs) + 1.000 R² (1.000 R² .. 1.000 R²) + mean 900.3 μs (899.7 μs .. 901.7 μs) + std dev 3.053 μs (1.724 μs .. 5.362 μs) benchmarking ppad-bip32/xprv - time 28.10 μs (25.95 μs .. 30.39 μs) - 0.949 R² (0.910 R² .. 0.987 R²) - mean 27.39 μs (25.84 μs .. 30.17 μs) - std dev 6.442 μs (3.813 μs .. 10.21 μs) - variance introduced by outliers: 97% (severely inflated) + time 8.665 μs (8.656 μs .. 8.673 μs) + 1.000 R² (1.000 R² .. 1.000 R²) + mean 8.667 μs (8.663 μs .. 8.670 μs) + std dev 12.75 ns (9.805 ns .. 17.26 ns) benchmarking ppad-bip32/parse - time 33.20 μs (31.98 μs .. 34.31 μs) - 0.993 R² (0.989 R² .. 0.997 R²) - mean 32.89 μs (32.08 μs .. 33.81 μs) - std dev 2.958 μs (2.300 μs .. 3.970 μs) - variance introduced by outliers: 81% (severely inflated) + time 9.295 μs (9.273 μs .. 9.330 μs) + 1.000 R² (1.000 R² .. 1.000 R²) + mean 9.294 μs (9.288 μs .. 9.308 μs) + std dev 27.58 ns (11.06 ns .. 55.76 ns) ``` ## Security