ekonokomik pisze: ↑ sobota, 3 sierpnia 2024, 23:04
4. Rozumiem, że mogę sobie wygenerować BIP39 Mnemonic, czyli listę np. 24 słów i te słowa (równoważne seed) pozwolą mi w przyszłości odtworzyć portfel? Ale na podstawie tej jednej listy słów narzędzie generuje mi kilkadziesiąt adresów (adres / klucz publ / klucz prv.) w formacie lgeacy (BIP32) lub segwitt (BIP84) i pozwala kliknięciami w przycisk generować kolejne i kolejne...
I jak to niby działa? Na podstawie tej jednej frazy odtworzy mi potem X adresów wraz z kluczami?
Uruchom poniższy kod w
https://go.dev/play/ i sam zobacz, jak przebiega cały proces. Wyniki będą zgodne z
https://iancoleman.io/bip39/. Adresy już nieco komplikują sprawę, więc dla przejrzystości poprzestałem na kluczach.
package main
import (
"encoding/hex"
"fmt"
"strconv"
"strings"
"github.com/FactomProject/go-bip32"
"github.com/FactomProject/go-bip39"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
)
func main() {
ekogen(
"BTC legacy",
"ticket regret opinion pulse solve dune toy urge horror lake claw remain",
"",
"m/44'/0'/0'/0/1",
"0488ADE4",
"0488B21E",
0x80,
)
ekogen(
"BIP39 passphrase, BTC legacy",
"ticket regret opinion pulse solve dune toy urge horror lake claw remain",
"A to moja tajemnica: @w$R%4^7^%#",
"m/44'/0'/0'/0/3",
"0488ADE4",
"0488B21E",
0x80,
)
ekogen(
"BIP39 passphrase, BTC native segwit",
"ticket regret opinion pulse solve dune toy urge horror lake claw remain",
"A to moja tajemnica: @w$R%4^7^%#",
"m/84'/0'/0'/0/5",
"04B2430C",
"04B24746",
0x80,
)
ekogen(
"BIP39 passphrase, ETH",
"ticket regret opinion pulse solve dune toy urge horror lake claw remain",
"A to moja tajemnica: @w$R%4^7^%#",
"m/44'/60'/0'/0/7",
"0488ADE4",
"0488B21E",
0x80,
)
}
func ekogen(comment, mnemonic, password, path, prvVersion, pubVersion string, privateKeyID byte) {
fmt.Println(comment)
fmt.Println(mnemonic, " ", password, " ", path, " ", prvVersion, pubVersion, " ", privateKeyID)
seed, _ := bip39.NewSeedWithErrorChecking(mnemonic, password)
fmt.Println("seed ", hex.EncodeToString(seed))
masterKey, _ := bip32.NewMasterKey(seed)
key := masterKey
key.Version, _ = hex.DecodeString(prvVersion)
fmt.Println("master ", key.String())
at := 1
for _, level := range strings.Split(path, "/")[1:] {
at += 1 + len(level)
idxStr, hardened := strings.CutSuffix(level, "'")
idxInt, _ := strconv.Atoi(idxStr)
idx := uint32(idxInt)
if hardened {
idx += bip32.FirstHardenedChild
}
key, _ = key.NewChildKey(idx)
key.Version, _ = hex.DecodeString(prvVersion)
pub := key.PublicKey()
pub.Version, _ = hex.DecodeString(pubVersion)
eckey, _ := btcec.PrivKeyFromBytes(key.Key)
wif, _ := btcutil.NewWIF(eckey, &chaincfg.Params{PrivateKeyID: privateKeyID}, true)
fmt.Println(
path[:at],
"\n prv ", hex.EncodeToString(key.Key),
"\n enc", key.String(),
"\n WIF", wif.String(),
"\n pub ", hex.EncodeToString(pub.Key),
"\n enc", pub.String(),
)
}
fmt.Print("\n\n\n")
}
ekonokomik pisze: ↑ sobota, 3 sierpnia 2024, 23:04
5. Widzę, że narzędzie mimo użycia BIP39 pozwala dodatkowo zakodować klucze uzyskanych adresów przy pomocy hasła w BIP38. Jaki to ma sens?
Rzeczywiście pozwala, ale przydatność tego jest ograniczona do szczególnego przypadku, który nas nie interesuje. Przy okazji warto tu wspomnieć o passphrase z
BIP39 (mnemoniki dla portfeli deterministycznych), które nie ma nic wspólnego z passphrase z
BIP38 (szyfrowanie kluczy prywatnych). BIP39 passphrase umożliwia
plausible deniability, na
ledgerze może być podpięte pod drugi PIN lub w trybie
temporary passphrase podawane przy każdym użyciu, na
trezorze musi być podawane przy każdym użyciu, przy czym Model One nie pozwala na robienie tego bezpośrednio na urządzeniu, co ze względów bezpieczeństwa przekreśla jego przydatność w tym zakresie (
On-device passphrase entry).
ekonokomik pisze: ↑ sobota, 3 sierpnia 2024, 23:04
Na chwilę obecną zaszyfrowanie kluczy paperwalletów w formacie BIP38 i zapisanie ich (albo mnemoników) jako PDF w szyfrowanym archiwum w formacie VeraCrypt, czy dawny TrueCrypt i trzymanie w kilku kopiach w różnych lokalizacjach wydaje mi się najsensowniejszą opcją, a na pewno lepszą niż trzymanie papieru.
Niech już to, co nie musi, nie dotyka sprzętu elektronicznego. Zgodne ze standardem BIP39 słowa i passphrase (jeżeli używane) na papier, zalaminować lub zabezpieczyć inną techniką, umieścić kilka kopii w kilku miejscach, raz w roku sprawdzać, czy tam jeszcze są i nie wyblakły. Ewentualnie uprzednio podzielić, przetransformować lub zakodować słowa i passphrase w sobie znany sposób, pod warunkiem, że ten sposób będzie po latach jasny dla posiadacza portfela, co nie jest wymogiem prostym do spełnienia.
Moją tezą inwestycyjną jest niechybny pivot skompromitowanej kontrariańskiej narracji o paradygmacie, a by zminimalizować ryzyko drawdownu, prowadzę pozycje dynamicznie hedgując putami in-the-money thetę ekspozycji na optymalnym interwale, jak Leevermore.