Skip to content

Commit 4bca111

Browse files
authored
feat(bip0039): add runtime language selection API (#125)
* feat(bip0039): add runtime language selection API - Add `AnyLanguage` + `BuiltInLanguage` for runtime wordlist selection - Add `AnyMnemonic` API mirroring `Mnemonic<L>` (generate/parse/validate) - Refactor encode/decode internals to accept runtime language handles - Improve docs/tests (docsrs `doc_cfg`, built-in language mapping coverage) * improve to_seed * update tests * update some comments * update benchmarks result
1 parent 37297fe commit 4bca111

9 files changed

Lines changed: 726 additions & 171 deletions

File tree

bip0039/AGENTS.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
Generate GitHub Release notes that cover these sections:
4848

49-
- Breaking Changes
50-
- New Features
49+
- Breaking Changes.
50+
- Bug Fixes.
51+
- New Features.
5152
- Performance & Behavior Improvements.

bip0039/README.md

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,37 @@ Another Rust implementation of [BIP-0039](https://github.com/bitcoin/bips/blob/m
1616

1717
## Usage
1818

19-
Generate a random BIP-0039 mnemonic in English.
19+
### Compile-time language selection
2020

2121
```rust
2222
use bip0039::{Count, English, Mnemonic};
2323

24-
// Generates an English mnemonic with 12 words randomly
24+
// Generate an English mnemonic with 12 words randomly
2525
let mnemonic = <Mnemonic<English>>::generate(Count::Words12);
26-
// Or use the default generic type (English) of struct Mnemonic.
26+
// Or use the default generic type (English).
2727
let mnemonic = <Mnemonic>::generate(Count::Words12);
28-
// Gets the phrase
29-
let phrase = mnemonic.phrase();
30-
// Generates the HD wallet seed from the mnemonic and the passphrase.
28+
println!("phrase: {}", mnemonic.phrase());
29+
30+
// Generate the HD wallet seed from the mnemonic and the passphrase.
31+
let seed = mnemonic.to_seed("");
32+
assert_eq!(seed.len(), 64);
33+
println!("seed: {}", const_hex::encode(seed));
34+
```
35+
36+
### Runtime language selection
37+
38+
```rust
39+
use bip0039::{AnyLanguage, AnyMnemonic, BuiltInLanguage, Count, English};
40+
41+
// Generate an English mnemonic with 12 words randomly
42+
let mnemonic = AnyMnemonic::generate(BuiltInLanguage::English, Count::Words12);
43+
assert_eq!(mnemonic.language(), AnyLanguage::of::<English>());
44+
println!("phrase: {}", mnemonic.phrase());
45+
46+
// Generate the HD wallet seed from the mnemonic and the passphrase.
3147
let seed = mnemonic.to_seed("");
48+
assert_eq!(seed.len(), 64);
49+
println!("seed: {}", const_hex::encode(seed));
3250
```
3351

3452
## Documentation

bip0039/benchmarks/README.md

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,40 @@ cargo bench --bench generate -- --quiet
1212

1313
```text
1414
generate/tiny-bip39 (12 words)
15-
time: [511.31 ns 512.22 ns 513.28 ns]
15+
time: [510.34 ns 511.44 ns 512.60 ns]
1616
generate/bip39 (12 words)
17-
time: [589.13 ns 589.73 ns 590.39 ns]
17+
time: [585.92 ns 587.70 ns 589.44 ns]
1818
generate/coins-bip39 (12 words)
19-
time: [646.37 ns 647.38 ns 648.67 ns]
19+
time: [679.68 ns 681.18 ns 682.70 ns]
2020
generate/bip0039 (12 words)
21-
time: [486.75 ns 487.49 ns 488.32 ns]
21+
time: [494.18 ns 495.15 ns 496.27 ns]
2222
2323
generate/tiny-bip39 (15 words)
24-
time: [590.71 ns 593.44 ns 598.10 ns]
24+
time: [589.61 ns 591.39 ns 592.99 ns]
2525
generate/bip39 (15 words)
26-
time: [647.21 ns 675.35 ns 724.53 ns]
26+
time: [633.80 ns 657.68 ns 710.30 ns]
2727
generate/coins-bip39 (15 words)
28-
time: [708.61 ns 710.66 ns 712.96 ns]
28+
time: [754.56 ns 755.94 ns 757.53 ns]
2929
generate/bip0039 (15 words)
30-
time: [560.29 ns 561.11 ns 562.09 ns]
30+
time: [565.11 ns 566.52 ns 567.96 ns]
3131
3232
generate/tiny-bip39 (18 words)
33-
time: [661.35 ns 663.50 ns 665.94 ns]
33+
time: [658.73 ns 660.51 ns 662.73 ns]
3434
generate/bip39 (18 words)
35-
time: [686.88 ns 688.97 ns 691.15 ns]
35+
time: [686.83 ns 688.94 ns 691.04 ns]
3636
generate/coins-bip39 (18 words)
37-
time: [799.61 ns 800.71 ns 801.96 ns]
37+
time: [848.04 ns 851.16 ns 854.73 ns]
3838
generate/bip0039 (18 words)
39-
time: [624.62 ns 633.58 ns 650.84 ns]
39+
time: [631.66 ns 633.12 ns 634.48 ns]
4040
4141
generate/tiny-bip39 (24 words)
42-
time: [801.77 ns 829.43 ns 893.04 ns]
42+
time: [796.19 ns 797.70 ns 799.28 ns]
4343
generate/bip39 (24 words)
44-
time: [841.98 ns 843.54 ns 845.08 ns]
44+
time: [841.13 ns 843.60 ns 846.30 ns]
4545
generate/coins-bip39 (24 words)
46-
time: [940.16 ns 943.53 ns 948.46 ns]
46+
time: [1.0055 µs 1.0122 µs 1.0239 µs]
4747
generate/bip0039 (24 words)
48-
time: [752.66 ns 767.00 ns 790.62 ns]
48+
time: [765.61 ns 771.53 ns 778.24 ns]
4949
```
5050

5151
## from_entropy
@@ -57,40 +57,40 @@ cargo bench --bench from_entropy -- --quiet
5757

5858
```text
5959
from_entropy/tiny-bip39 (12 words)
60-
time: [496.95 ns 498.20 ns 499.57 ns]
60+
time: [496.68 ns 498.45 ns 500.22 ns]
6161
from_entropy/bip39 (12 words)
62-
time: [571.76 ns 573.90 ns 576.07 ns]
62+
time: [587.38 ns 610.53 ns 646.46 ns]
6363
from_entropy/coins-bip39 (12 words)
64-
time: [540.85 ns 541.77 ns 542.86 ns]
64+
time: [548.97 ns 551.21 ns 553.85 ns]
6565
from_entropy/bip0039 (12 words)
66-
time: [484.98 ns 487.71 ns 490.76 ns]
66+
time: [489.02 ns 491.12 ns 493.42 ns]
6767
6868
from_entropy/tiny-bip39 (15 words)
69-
time: [580.28 ns 581.86 ns 583.75 ns]
69+
time: [577.92 ns 579.27 ns 580.72 ns]
7070
from_entropy/bip39 (15 words)
71-
time: [619.91 ns 622.14 ns 624.24 ns]
71+
time: [618.19 ns 619.04 ns 619.79 ns]
7272
from_entropy/coins-bip39 (15 words)
73-
time: [594.66 ns 622.75 ns 667.58 ns]
73+
time: [600.17 ns 623.76 ns 669.40 ns]
7474
from_entropy/bip0039 (15 words)
75-
time: [540.41 ns 541.49 ns 542.83 ns]
75+
time: [554.35 ns 555.49 ns 556.82 ns]
7676
7777
from_entropy/tiny-bip39 (18 words)
78-
time: [627.58 ns 628.66 ns 629.97 ns]
78+
time: [658.90 ns 665.83 ns 676.43 ns]
7979
from_entropy/bip39 (18 words)
80-
time: [660.28 ns 674.99 ns 700.61 ns]
80+
time: [673.41 ns 714.33 ns 782.13 ns]
8181
from_entropy/coins-bip39 (18 words)
82-
time: [657.68 ns 659.17 ns 660.97 ns]
82+
time: [659.99 ns 666.06 ns 674.00 ns]
8383
from_entropy/bip0039 (18 words)
84-
time: [588.40 ns 589.59 ns 590.68 ns]
84+
time: [618.48 ns 620.44 ns 622.59 ns]
8585
8686
from_entropy/tiny-bip39 (24 words)
87-
time: [758.17 ns 759.91 ns 761.50 ns]
87+
time: [784.05 ns 788.27 ns 793.13 ns]
8888
from_entropy/bip39 (24 words)
89-
time: [809.90 ns 840.94 ns 888.83 ns]
89+
time: [820.16 ns 901.21 ns 1.0273 µs]
9090
from_entropy/coins-bip39 (24 words)
91-
time: [766.62 ns 768.01 ns 769.30 ns]
91+
time: [774.26 ns 777.93 ns 782.24 ns]
9292
from_entropy/bip0039 (24 words)
93-
time: [700.47 ns 702.64 ns 705.24 ns]
93+
time: [742.34 ns 746.56 ns 751.98 ns]
9494
```
9595

9696
## from_phrase
@@ -102,60 +102,60 @@ cargo bench --bench from_phrase -- --quiet
102102

103103
```text
104104
from_phrase/tiny-bip39 (12 words)
105-
time: [1.5470 µs 1.5507 µs 1.5550 µs]
105+
time: [1.5477 µs 1.5554 µs 1.5663 µs]
106106
from_phrase/bip39 (12 words)
107-
time: [3.2437 µs 3.2506 µs 3.2581 µs]
107+
time: [3.2387 µs 3.2454 µs 3.2535 µs]
108108
from_phrase/coins-bip39 (12 words)
109-
time: [2.8801 µs 2.8853 µs 2.8908 µs]
109+
time: [2.8943 µs 2.9048 µs 2.9150 µs]
110110
from_phrase/bip0039 (12 words)
111-
time: [928.75 ns 931.71 ns 935.26 ns]
111+
time: [928.42 ns 949.60 ns 984.64 ns]
112112
113113
from_phrase/tiny-bip39 (15 words)
114-
time: [1.8005 µs 1.8030 µs 1.8059 µs]
114+
time: [1.7950 µs 1.8542 µs 1.9560 µs]
115115
from_phrase/bip39 (15 words)
116-
time: [3.9846 µs 4.1398 µs 4.4807 µs]
116+
time: [3.9781 µs 3.9912 µs 4.0083 µs]
117117
from_phrase/coins-bip39 (15 words)
118-
time: [3.4806 µs 3.4895 µs 3.4989 µs]
118+
time: [3.4690 µs 3.4802 µs 3.4924 µs]
119119
from_phrase/bip0039 (15 words)
120-
time: [1.1016 µs 1.1040 µs 1.1065 µs]
120+
time: [1.0961 µs 1.1024 µs 1.1112 µs]
121121
122122
from_phrase/tiny-bip39 (18 words)
123-
time: [2.0517 µs 2.0572 µs 2.0633 µs]
123+
time: [2.0296 µs 2.0335 µs 2.0377 µs]
124124
from_phrase/bip39 (18 words)
125-
time: [4.7275 µs 4.7463 µs 4.7713 µs]
125+
time: [4.6921 µs 4.7046 µs 4.7184 µs]
126126
from_phrase/coins-bip39 (18 words)
127-
time: [4.1535 µs 4.3375 µs 4.7050 µs]
127+
time: [4.1568 µs 4.1710 µs 4.1869 µs]
128128
from_phrase/bip0039 (18 words)
129-
time: [1.2838 µs 1.2864 µs 1.2897 µs]
129+
time: [1.2578 µs 1.2605 µs 1.2636 µs]
130130
131131
from_phrase/tiny-bip39 (24 words)
132-
time: [2.7044 µs 2.8255 µs 3.0776 µs]
132+
time: [2.6549 µs 2.7577 µs 2.9668 µs]
133133
from_phrase/bip39 (24 words)
134-
time: [6.1414 µs 6.1512 µs 6.1606 µs]
134+
time: [6.1632 µs 6.1869 µs 6.2140 µs]
135135
from_phrase/coins-bip39 (24 words)
136-
time: [5.3374 µs 5.3675 µs 5.4096 µs]
136+
time: [5.3191 µs 5.3350 µs 5.3498 µs]
137137
from_phrase/bip0039 (24 words)
138-
time: [1.6139 µs 1.6176 µs 1.6216 µs]
138+
time: [1.6057 µs 1.6088 µs 1.6125 µs]
139139
140140
from_normalized_phrase/bip39 (12 words)
141-
time: [1.9845 µs 1.9874 µs 1.9903 µs]
141+
time: [1.9888 µs 1.9945 µs 2.0007 µs]
142142
from_normalized_phrase/bip0039 (12 words)
143-
time: [880.27 ns 883.09 ns 885.95 ns]
143+
time: [865.45 ns 867.51 ns 869.88 ns]
144144
145145
from_normalized_phrase/bip39 (15 words)
146-
time: [2.4396 µs 2.4565 µs 2.4775 µs]
146+
time: [2.4202 µs 2.4347 µs 2.4550 µs]
147147
from_normalized_phrase/bip0039 (15 words)
148-
time: [1.0365 µs 1.0771 µs 1.1465 µs]
148+
time: [1.0248 µs 1.0262 µs 1.0277 µs]
149149
150150
from_normalized_phrase/bip39 (18 words)
151-
time: [2.8373 µs 2.8429 µs 2.8485 µs]
151+
time: [2.8493 µs 2.8549 µs 2.8616 µs]
152152
from_normalized_phrase/bip0039 (18 words)
153-
time: [1.2011 µs 1.2033 µs 1.2056 µs]
153+
time: [1.1793 µs 1.2267 µs 1.3133 µs]
154154
155155
from_normalized_phrase/bip39 (24 words)
156-
time: [3.7039 µs 3.7152 µs 3.7295 µs]
156+
time: [3.7213 µs 3.7300 µs 3.7398 µs]
157157
from_normalized_phrase/bip0039 (24 words)
158-
time: [1.5054 µs 1.5084 µs 1.5120 µs]
158+
time: [1.5051 µs 1.5164 µs 1.5347 µs]
159159
```
160160

161161
## to_seed
@@ -167,38 +167,38 @@ cargo bench --bench to_seed -- --quiet
167167

168168
```text
169169
to_seed/tiny-bip39 (12 words)
170-
time: [976.59 µs 987.81 µs 1.0060 ms]
170+
time: [981.56 µs 983.98 µs 986.64 µs]
171171
to_seed/bip39 (12 words)
172-
time: [1.0816 ms 1.0826 ms 1.0835 ms]
172+
time: [1.0847 ms 1.0863 ms 1.0884 ms]
173173
to_seed/coins-bip39 (12 words)
174-
time: [977.50 µs 978.55 µs 979.77 µs]
174+
time: [980.23 µs 981.28 µs 982.43 µs]
175175
to_seed/bip0039 (12 words)
176-
time: [979.98 µs 981.89 µs 984.49 µs]
176+
time: [982.38 µs 985.13 µs 988.23 µs]
177177
178178
to_seed/tiny-bip39 (15 words)
179-
time: [977.02 µs 978.18 µs 979.20 µs]
179+
time: [978.38 µs 981.72 µs 986.31 µs]
180180
to_seed/bip39 (15 words)
181-
time: [1.0823 ms 1.0838 ms 1.0855 ms]
181+
time: [1.0914 ms 1.1414 ms 1.2388 ms]
182182
to_seed/coins-bip39 (15 words)
183-
time: [979.52 µs 981.10 µs 983.00 µs]
183+
time: [979.72 µs 982.73 µs 986.73 µs]
184184
to_seed/bip0039 (15 words)
185-
time: [982.92 µs 994.37 µs 1.0123 ms]
185+
time: [982.71 µs 984.91 µs 987.12 µs]
186186
187187
to_seed/tiny-bip39 (18 words)
188-
time: [975.39 µs 977.23 µs 979.30 µs]
188+
time: [982.45 µs 985.87 µs 990.05 µs]
189189
to_seed/bip39 (18 words)
190-
time: [1.0847 ms 1.0867 ms 1.0892 ms]
190+
time: [1.0884 ms 1.0901 ms 1.0923 ms]
191191
to_seed/coins-bip39 (18 words)
192-
time: [976.24 µs 977.18 µs 978.15 µs]
192+
time: [980.72 µs 982.23 µs 984.03 µs]
193193
to_seed/bip0039 (18 words)
194-
time: [983.08 µs 993.13 µs 1.0064 ms]
194+
time: [979.83 µs 981.50 µs 983.54 µs]
195195
196196
to_seed/tiny-bip39 (24 words)
197-
time: [987.41 µs 992.07 µs 998.69 µs]
197+
time: [981.74 µs 991.87 µs 1.0111 ms]
198198
to_seed/bip39 (24 words)
199-
time: [1.1047 ms 1.1120 ms 1.1226 ms]
199+
time: [1.0873 ms 1.0888 ms 1.0904 ms]
200200
to_seed/coins-bip39 (24 words)
201-
time: [989.70 µs 991.79 µs 993.79 µs]
201+
time: [985.59 µs 1.0074 ms 1.0481 ms]
202202
to_seed/bip0039 (24 words)
203-
time: [1.0205 ms 1.0289 ms 1.0396 ms]
203+
time: [983.85 µs 985.96 µs 988.07 µs]
204204
```

0 commit comments

Comments
 (0)