mirror of
https://github.com/guggero/chantools.git
synced 2026-08-13 12:33:34 +02:00
genimportscript: add Electrum format, write result to file
This commit is contained in:
parent
0821c35442
commit
ce3cc2ceef
6 changed files with 69 additions and 18 deletions
|
|
@ -3,6 +3,7 @@ package btc
|
|||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/btcsuite/btcd/chaincfg"
|
||||
|
|
@ -16,6 +17,7 @@ const (
|
|||
FormatCli = "bitcoin-cli"
|
||||
FormatCliWatchOnly = "bitcoin-cli-watchonly"
|
||||
FormatImportwallet = "bitcoin-importwallet"
|
||||
FormatElectrum = "electrum"
|
||||
)
|
||||
|
||||
type KeyExporter interface {
|
||||
|
|
@ -40,6 +42,9 @@ func ParseFormat(format string) KeyExporter {
|
|||
|
||||
case FormatImportwallet:
|
||||
return &ImportWallet{}
|
||||
|
||||
case FormatElectrum:
|
||||
return &Electrum{}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -215,3 +220,35 @@ func (i *ImportWallet) Format(hdKey *hdkeychain.ExtendedKey,
|
|||
func (i *ImportWallet) Trailer(_ uint32) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
type Electrum struct{}
|
||||
|
||||
func (p *Electrum) Header() string {
|
||||
return "# Copy the content of this file (without this line) into " +
|
||||
"Electrum."
|
||||
}
|
||||
|
||||
func (p *Electrum) Format(hdKey *hdkeychain.ExtendedKey,
|
||||
params *chaincfg.Params, path string, branch, index uint32) (string,
|
||||
error) {
|
||||
|
||||
privKey, err := hdKey.ECPrivKey()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not derive private key: %v", err)
|
||||
}
|
||||
wif, err := btcutil.NewWIF(privKey, params, true)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not encode WIF: %v", err)
|
||||
}
|
||||
|
||||
prefix := "p2wpkh"
|
||||
if strings.HasPrefix(path, lnd.WalletBIP49DerivationPath) {
|
||||
prefix = "p2wpkh-p2sh"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s:%s", prefix, wif.String()), nil
|
||||
}
|
||||
|
||||
func (p *Electrum) Trailer(_ uint32) string {
|
||||
return ""
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ type genImportScriptCommand struct {
|
|||
DerivationPath string
|
||||
RecoveryWindow uint32
|
||||
RescanFrom uint32
|
||||
Stdout bool
|
||||
|
||||
rootKey *rootKey
|
||||
cmd *cobra.Command
|
||||
|
|
@ -46,7 +47,9 @@ The following script formats are currently supported:
|
|||
imported into bitcoind to watch the UTXOs of those keys. The funds cannot be
|
||||
spent that way as they are watch-only.
|
||||
* bitcoin-importwallet: Creates a text output that is compatible with
|
||||
bitcoind's importwallet command.`,
|
||||
bitcoind's importwallet command.
|
||||
* electrum: Creates a text output that contains one private key per line with
|
||||
the address type as the prefix, the way Electrum expects them.`,
|
||||
Example: `chantools genimportscript --format bitcoin-cli \
|
||||
--recoverywindow 5000`,
|
||||
RunE: cc.Execute,
|
||||
|
|
@ -54,8 +57,8 @@ The following script formats are currently supported:
|
|||
cc.cmd.Flags().StringVar(
|
||||
&cc.Format, "format", "bitcoin-importwallet", "format of the "+
|
||||
"generated import script; currently supported are: "+
|
||||
"bitcoin-importwallet, bitcoin-cli and "+
|
||||
"bitcoin-cli-watchonly",
|
||||
"bitcoin-importwallet, bitcoin-cli, "+
|
||||
"bitcoin-cli-watchonly and electrum",
|
||||
)
|
||||
cc.cmd.Flags().BoolVar(
|
||||
&cc.LndPaths, "lndpaths", false, "use all derivation paths "+
|
||||
|
|
@ -79,6 +82,9 @@ The following script formats are currently supported:
|
|||
"from the wallet birthday if the lnd 24 word aezeed "+
|
||||
"is entered",
|
||||
)
|
||||
cc.cmd.Flags().BoolVar(
|
||||
&cc.Stdout, "stdout", false, "write generated import script "+
|
||||
"to standard out instead of writing it to a file")
|
||||
|
||||
cc.rootKey = newRootKey(cc.cmd, "decrypting the backup")
|
||||
|
||||
|
|
@ -137,10 +143,25 @@ func (c *genImportScriptCommand) Execute(_ *cobra.Command, _ []string) error {
|
|||
}
|
||||
}
|
||||
|
||||
writer := os.Stdout
|
||||
if !c.Stdout {
|
||||
fileName := fmt.Sprintf("results/genimportscript-%s.txt",
|
||||
time.Now().Format("2006-01-02-15-04-05"))
|
||||
log.Infof("Writing import script with format '%s' to %s",
|
||||
c.Format, fileName)
|
||||
|
||||
var err error
|
||||
writer, err = os.Create(fileName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating result file %s: %v",
|
||||
fileName, err)
|
||||
}
|
||||
}
|
||||
|
||||
exporter := btc.ParseFormat(c.Format)
|
||||
err = btc.ExportKeys(
|
||||
extendedKey, strPaths, paths, chainParams, c.RecoveryWindow,
|
||||
c.RescanFrom, exporter, os.Stdout,
|
||||
c.RescanFrom, exporter, writer,
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error exporting keys: %v", err)
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import (
|
|||
|
||||
const (
|
||||
defaultAPIURL = "https://blockstream.info/api"
|
||||
version = "0.9.2"
|
||||
version = "0.9.3"
|
||||
na = "n/a"
|
||||
|
||||
Commit = ""
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ chantools fakechanbackup --from_channel_graph lncli_describegraph.json \
|
|||
--channelpoint string funding transaction outpoint of the channel to rescue (<txid>:<txindex>) as it is displayed on 1ml.com
|
||||
--from_channel_graph string the full LN channel graph in the JSON format that the 'lncli describegraph' returns
|
||||
-h, --help help for fakechanbackup
|
||||
--multi_file string the fake channel backup file to create (default "results/fake-2021-08-29-18-21-11.backup")
|
||||
--multi_file string the fake channel backup file to create (default "results/fake-2021-08-29-22-04-34.backup")
|
||||
--remote_node_addr string the remote node connection information in the format pubkey@host:port
|
||||
--rootkey string BIP32 HD root key of the wallet to use for encrypting the backup; leave empty to prompt for lnd 24 word aezeed
|
||||
--short_channel_id string the short channel ID in the format <blockheight>x<transactionindex>x<outputindex>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ The following script formats are currently supported:
|
|||
spent that way as they are watch-only.
|
||||
* bitcoin-importwallet: Creates a text output that is compatible with
|
||||
bitcoind's importwallet command.
|
||||
* electrum: Creates a text output that contains one private key per line with
|
||||
the address type as the prefix, the way Electrum expects them.
|
||||
|
||||
```
|
||||
chantools genimportscript [flags]
|
||||
|
|
@ -35,12 +37,13 @@ chantools genimportscript --format bitcoin-cli \
|
|||
```
|
||||
--bip39 read a classic BIP39 seed and passphrase from the terminal instead of asking for lnd seed format or providing the --rootkey flag
|
||||
--derivationpath string use one specific derivation path; specify the first levels of the derivation path before any internal/external branch; Cannot be used in conjunction with --lndpaths
|
||||
--format string format of the generated import script; currently supported are: bitcoin-importwallet, bitcoin-cli and bitcoin-cli-watchonly (default "bitcoin-importwallet")
|
||||
--format string format of the generated import script; currently supported are: bitcoin-importwallet, bitcoin-cli, bitcoin-cli-watchonly and electrum (default "bitcoin-importwallet")
|
||||
-h, --help help for genimportscript
|
||||
--lndpaths use all derivation paths that lnd used; results in a large number of results; cannot be used in conjunction with --derivationpath
|
||||
--recoverywindow uint32 number of keys to scan per internal/external branch; output will consist of double this amount of keys (default 2500)
|
||||
--rescanfrom uint32 block number to rescan from; will be set automatically from the wallet birthday if the lnd 24 word aezeed is entered (default 500000)
|
||||
--rootkey string BIP32 HD root key of the wallet to use for decrypting the backup; leave empty to prompt for lnd 24 word aezeed
|
||||
--stdout write generated import script to standard out instead of writing it to a file
|
||||
```
|
||||
|
||||
### Options inherited from parent commands
|
||||
|
|
|
|||
|
|
@ -157,19 +157,9 @@ func AllDerivationPaths(params *chaincfg.Params) ([]string, [][]uint32, error) {
|
|||
)
|
||||
}
|
||||
pathStrings := []string{
|
||||
"m/44'/0'/0'",
|
||||
"m/49'/0'/0'",
|
||||
WalletBIP49DerivationPath,
|
||||
WalletDefaultDerivationPath,
|
||||
mkPath(keychain.KeyFamilyMultiSig),
|
||||
mkPath(keychain.KeyFamilyRevocationBase),
|
||||
mkPath(keychain.KeyFamilyHtlcBase),
|
||||
mkPath(keychain.KeyFamilyPaymentBase),
|
||||
mkPath(keychain.KeyFamilyDelayBase),
|
||||
mkPath(keychain.KeyFamilyRevocationRoot),
|
||||
mkPath(keychain.KeyFamilyNodeKey),
|
||||
mkPath(keychain.KeyFamilyStaticBackup),
|
||||
mkPath(keychain.KeyFamilyTowerSession),
|
||||
mkPath(keychain.KeyFamilyTowerID),
|
||||
}
|
||||
paths := make([][]uint32, len(pathStrings))
|
||||
for idx, path := range pathStrings {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue