|
36 | 36 |
|
37 | 37 | long_description_content_type = 'text/markdown' |
38 | 38 | long_description = """\ |
39 | | -Creating Ethereum accounts is complex and fraught with potential for loss of funds. |
| 39 | +Creating Ethereum, Bitcoin and other accounts is complex and fraught with potential for loss of funds. |
40 | 40 |
|
41 | | -A BIP-39 seed recovery phrase helps, but a *single* lapse in security dooms the account. If someone |
42 | | -finds your recovery phrase, the account is /gone/. |
| 41 | +A BIP-39 seed recovery phrase helps, but a *single* lapse in security dooms the account (and all |
| 42 | +derived accounts, in fact). If someone finds your recovery phrase (or you lose it), the accounts |
| 43 | +derived from that seed are /gone/. |
43 | 44 |
|
44 | | -The SLIP-39 standard allows you to split the seed between 1 or more groups of multiple recovery |
45 | | -phrases. This is better, but creating such accounts is difficult; presently, only the Trezor |
46 | | -supports these, and they can only be created "manually". Writing down 5 or more sets of 20 words is |
47 | | -difficult and time consuming. |
| 45 | +The SLIP-39 standard allows you to split the seed between 1, 2, or more groups of several mnemonic |
| 46 | +recovery phrases. This is better, but creating such accounts is difficult; presently, only the |
| 47 | +Trezor supports these, and they can only be created "manually". Writing down 5 or more sets of 20 |
| 48 | +words is difficult, error-prone and time consuming. |
48 | 49 |
|
49 | 50 | The python-slip39 project exists to assist in the safe creation and documentation of Ethereum HD |
50 | | -Wallet accounts, with various SLIP-39 sharing parameters. It generates the new wallet seed, |
51 | | -generates standard Ethereum account(s) (at derivation path =m/44'/60'/0'/0/0= by default) with |
52 | | -Ethereum wallet address and QR code, produces the required SLIP-39 phrases, and outputs a single PDF |
53 | | -containing all the required printable cards to document the account. |
54 | | -
|
55 | | -On an secure (ideally air-gapped) computer, new accounts can safely be generated and the PDF saved |
56 | | -to a USB drive for printing (or directly printed without the file being saved to disk.) |
57 | | -
|
58 | | - $ python3 -m slip39 -v |
59 | | - 2021-12-29 13:21:57 slip39 ETH m/44'/60'/0'/0/0 : 0x8686D2cb685A934233eB8a4907d17e45257eBaD0 |
| 51 | +Wallet seeds and derived accounts, with various SLIP-39 sharing parameters. It generates the new |
| 52 | +random wallet seed, and generates the expected standard Ethereum account(s) (at derivation path |
| 53 | +=m/44'/60'/0'/0/0= by default) and Bitcoin accounts (at Bech32 derivation path =m/84'/0'/0'/0/0= by |
| 54 | +default), with wallet address and QR codee (compatible with Trezor derivations). It produces the |
| 55 | +required SLIP-39 phrases, and outputs a single PDF containing all the required printable cards to |
| 56 | +document the seed (and the specified derived accounts). |
| 57 | +
|
| 58 | +On an secure (ideally air-gapped) computer, new seeds can safely be generated and the PDF saved to a |
| 59 | +USB drive for printing (or directly printed without the file being saved to disk.). Presently, |
| 60 | +=slip39= can output example ETH, BTC, LTC and DOGE addresses derived from the seed, to illustrate |
| 61 | +what accounts are associated with the backed-up seed. Recovery of the seed to a Trezor is simple, |
| 62 | +by entering the mnemonics right on the device. |
| 63 | +
|
| 64 | + $ python3 -m slip39 -v Personal # or run: slip39 -v Personal |
| 65 | + 2022-01-26 13:55:30 slip39 First(1/1): Recover w/ 2 of 4 groups First(1), Second(1), Fam(2/4), Fren(2/6) |
| 66 | + 2022-01-26 13:55:30 slip39 1st 1 sister 8 cricket 15 unhappy |
| 67 | + 2022-01-26 13:55:30 slip39 2 acid 9 mental 16 ocean |
| 68 | + 2022-01-26 13:55:30 slip39 3 acrobat 10 veteran 17 mayor |
| 69 | + 2022-01-26 13:55:30 slip39 4 romp 11 phantom 18 promise |
| 70 | + 2022-01-26 13:55:30 slip39 5 anxiety 12 grownup 19 wrote |
| 71 | + 2022-01-26 13:55:30 slip39 6 laser 13 skunk 20 romp |
| 72 | + 2022-01-26 13:55:30 slip39 7 cricket 14 anatomy |
| 73 | + 2022-01-26 13:55:30 slip39 Second(1/1): Recover w/ 2 of 4 groups First(1), Second(1), Fam(2/4), Fren(2/6) |
| 74 | + 2022-01-26 13:55:30 slip39 1st 1 sister 8 belong 15 spirit |
| 75 | + 2022-01-26 13:55:30 slip39 2 acid 9 survive 16 royal |
| 76 | + 2022-01-26 13:55:30 slip39 3 beard 10 home 17 often |
| 77 | + 2022-01-26 13:55:30 slip39 4 romp 11 herd 18 silver |
| 78 | + 2022-01-26 13:55:30 slip39 5 again 12 mountain 19 grocery |
| 79 | + 2022-01-26 13:55:30 slip39 6 orbit 13 august 20 antenna |
| 80 | + 2022-01-26 13:55:30 slip39 7 very 14 evening |
| 81 | + 2022-01-26 13:55:30 slip39 Fam(2/4): Recover w/ 2 of 4 groups First(1), Second(1), Fam(2/4), Fren(2/6) |
| 82 | + 2022-01-26 13:55:30 slip39 1st 1 sister 8 rainbow 15 husky |
| 83 | + 2022-01-26 13:55:30 slip39 2 acid 9 swing 16 crowd |
| 84 | + 2022-01-26 13:55:30 slip39 3 ceramic 10 credit 17 learn |
| 85 | + 2022-01-26 13:55:30 slip39 4 roster 11 piece 18 priority |
| 86 | + 2022-01-26 13:55:30 slip39 5 already 12 puny 19 hand |
| 87 | + 2022-01-26 13:55:30 slip39 6 quiet 13 senior 20 watch |
| 88 | + 2022-01-26 13:55:30 slip39 7 erode 14 listen |
| 89 | + 2022-01-26 13:55:30 slip39 2nd 1 sister 8 holy 15 revenue |
| 90 | + 2022-01-26 13:55:30 slip39 2 acid 9 execute 16 junction |
| 91 | + 2022-01-26 13:55:30 slip39 3 ceramic 10 lift 17 elite |
| 92 | + 2022-01-26 13:55:30 slip39 4 scared 11 spark 18 flexible |
| 93 | + 2022-01-26 13:55:30 slip39 5 domestic 12 yoga 19 inform |
| 94 | + 2022-01-26 13:55:30 slip39 6 exact 13 medical 20 predator |
| 95 | + 2022-01-26 13:55:30 slip39 7 finger 14 grief |
60 | 96 | ... |
61 | | - 2021-12-29 13:21:57 slip39 First(1/1): Recover w/ 2 of 4 groups First(1), Second(1), Fam(2/4), Fren(2/6) |
62 | | - 2021-12-29 13:21:57 slip39 withdraw pajamas acrobat romp afraid engage sniff olympic rescue taxi careful calcium radar thank realize join thank parcel desktop tofu |
63 | | - 2021-12-29 13:21:57 slip39 Second(1/1): Recover w/ 2 of 4 groups First(1), Second(1), Fam(2/4), Fren(2/6) |
64 | | - 2021-12-29 13:21:57 slip39 withdraw pajamas beard romp ajar cricket medical human unkind undergo legend briefing climate learn member change glasses maximum critical photo |
65 | | - 2021-12-29 13:21:57 slip39 Fam(2/4): Recover w/ 2 of 4 groups First(1), Second(1), Fam(2/4), Fren(2/6) |
66 | | - 2021-12-29 13:21:57 slip39 withdraw pajamas ceramic roster daisy voice bike spider rhyme stay slow devote phantom cricket carpet favorite decent society ending elite |
67 | | - 2021-12-29 13:21:57 slip39 withdraw pajamas ceramic scared calcium says spew fake blue exceed actress velvet romp ounce mild smear sled kernel divorce oral |
| 97 | + 2022-01-26 13:55:30 slip39 ETH m/44'/60'/0'/0/0 : 0x8FBCe53111817DcE01F9f4C4A6319eA1Ca0c3bf1 |
| 98 | + 2022-01-26 13:55:30 slip39 BTC m/84'/0'/0'/0/0 : bc1q6u7qk0tepkxdm8wkhpqzwwy0w8zfls9yvghaxq |
68 | 99 | ... |
69 | | - 2021-12-29 13:21:57 slip39 Wrote SLIP39-encoded wallet for '' to: SLIP39-2021-12-29+13.21.57-0x8686D2cb685A934233eB8a4907d17e45257eBaD0.pdf |
| 100 | + 2022-01-26 13:55:30 slip39 Wrote SLIP39-encoded wallet for 'Personal' to: Personal-2022-01-26+13.55.30-ETH-0x8FBCe53111817DcE01F9f4C4A6319eA1Ca0c3bf1.pdf |
70 | 101 |
|
71 | 102 | Later, if you need to recover the Ethereum wallet, keep entering SLIP-39 mnemonics until the secret |
72 | 103 | is recovered (invalid/duplicate mnemonics will be ignored): |
73 | 104 |
|
74 | | - $ python3 -m slip39.recovery -v |
75 | | - Enter 1st SLIP-39 mnemonic: withdraw pajamas acrobat romp afraid engage sniff olympic rescue taxi careful calcium radar thank realize join thank parcel desktop tofu |
| 105 | + $ python3 -m slip39.recovery -v # or run: slip39-recovery -v |
| 106 | + Enter 1st SLIP-39 mnemonic: sister acid acrobat romp anxiety laser cricket cricket mental veteran phantom grownup skunk anatomy unhappy ocean mayor promise wrote romp |
76 | 107 | 2021-12-29 13:24:25 slip39.recovery Could not recover SLIP-39 master secret with 1 supplied mnemonics: Insufficient number of mnemonic groups. The required number of groups is 2. |
77 | 108 | Enter 2nd SLIP-39 mnemonic: a bc |
78 | 109 | 2021-12-29 13:24:53 slip39.recovery Could not recover SLIP-39 master secret with 2 supplied mnemonics: Invalid mnemonic word 'a'. |
79 | | - Enter 3rd SLIP-39 mnemonic: withdraw pajamas ceramic roster daisy voice bike spider rhyme stay slow devote phantom cricket carpet favorite decent society ending elite |
| 110 | + Enter 3rd SLIP-39 mnemonic: sister acid ceramic roster already quiet erode rainbow swing credit piece puny senior listen husky crowd learn priority hand watch |
80 | 111 | 2021-12-29 13:24:58 slip39.recovery Could not recover SLIP-39 master secret with 3 supplied mnemonics: Invalid mnemonic word 'a'. |
81 | | - Enter 4th SLIP-39 mnemonic: withdraw pajamas ceramic scared calcium says spew fake blue exceed actress velvet romp ounce mild smear sled kernel divorce oral |
| 112 | + Enter 4th SLIP-39 mnemonic: sister acid ceramic scared domestic exact finger holy execute lift spark yoga medical grief revenue junction elite flexible inform predator |
82 | 113 | 2021-12-29 13:25:14 slip39.recovery Recovered SLIP-39 secret with 3 (1st, 3rd, 4th) of 4 supplied mnemonics |
83 | 114 | 2021-12-29 13:25:14 slip39.recovery Recovered SLIP-39 secret; To re-generate, send it to: python3 -m slip39 --secret - |
84 | | - 9658a84b5138f63c428f6086be6e82b5 |
| 115 | + 32448aabb50cb6b022fdf17d960720df |
85 | 116 |
|
86 | 117 | Finally, regenerate the Ethereum wallet, perhaps including an encrypted JSON wallet file for import |
87 | | -into a software wallet; note that the same Ethereum wallet address 0x8686...BaD0 is recovered: |
88 | | -
|
89 | | - $ python3 -m slip39 --secret 9658a84b5138f63c428f6086be6e82b5 --json - |
90 | | - 2021-12-29 13:26:04 slip39 It is recommended to not use '-s|--secret <hex>'; specify '-' to read from input |
91 | | - 2021-12-29 13:26:04 slip39 ETH m/44'/60'/0'/0/0 : 0x8686D2cb685A934233eB8a4907d17e45257eBaD0 |
92 | | - JSON key file password: <enter JSON wallet password> |
93 | | - 2021-12-29 13:26:29 slip39 Wrote JSON encrypted wallet for '' to: SLIP39-2021-12-29+13.26.04-0x8686D2cb685A934233eB8a4907d17e45257eBaD0.json |
94 | | - 2021-12-29 13:26:29 slip39 Wrote SLIP39-encoded wallet for '' to: SLIP39-2021-12-29+13.26.04-0x8686D2cb685A934233eB8a4907d17e45257eBaD0.pdf |
| 118 | +into a software wallet; note that the same Ethereum wallet address 0x8FBC...3bf1 is recovered: |
| 119 | +
|
| 120 | + $ python3 -m slip39 --secret 32448aabb50cb6b022fdf17d960720df --json - |
| 121 | + 2022-01-26 14:06:14 slip39 It is recommended to not use '-s|--secret <hex>'; specify '-' to read from input |
| 122 | + 2022-01-26 14:06:14 slip39 ETH m/44'/60'/0'/0/0 : 0x8FBCe53111817DcE01F9f4C4A6319eA1Ca0c3bf1 |
| 123 | + 2022-01-26 14:06:14 slip39 BTC m/84'/0'/0'/0/0 : bc1q6u7qk0tepkxdm8wkhpqzwwy0w8zfls9yvghaxq |
| 124 | + JSON key file password: |
| 125 | + 2022-01-26 14:06:21 slip39 Wrote JSON SLIP39's encrypted ETH wallet 0x8FBCe53111817DcE01F9f4C4A6319eA1Ca0c3bf1 \ |
| 126 | + derived at m/44'/60'/0'/0/0 to: SLIP39-2022-01-26+14.06.14-ETH-0x8FBCe53111817DcE01F9f4C4A6319eA1Ca0c3bf1.json |
| 127 | + 2022-01-26 14:06:21 slip39 Wrote SLIP39-encoded wallet for '' to: SLIP39-2022-01-26+14.06.14-ETH-0x8FBCe53111817DcE01F9f4C4A6319eA1Ca0c3bf1.pdf |
| 128 | +
|
95 | 129 |
|
96 | 130 | The whole toolchain is suitable for pipelining: |
97 | 131 |
|
|
0 commit comments