From af356685c16ba03a90f352a832964ba793056d28 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Sat, 1 May 2021 22:10:09 +0200 Subject: [PATCH] zombierecovery: add new commands for zombie channel recovery --- README.md | 11 +- btc/explorer_api.go | 25 + btc/summary.go | 2 +- cmd/chantools/dropchannelgraph.go | 2 +- cmd/chantools/fakechanbackup.go | 12 +- cmd/chantools/rescueclosed.go | 2 +- cmd/chantools/root.go | 3 +- cmd/chantools/sweeptimelock.go | 2 +- cmd/chantools/zombierecovery_findmatches.go | 200 ++++++++ cmd/chantools/zombierecovery_makeoffer.go | 505 ++++++++++++++++++++ cmd/chantools/zombierecovery_preparekeys.go | 138 ++++++ cmd/chantools/zombierecovery_root.go | 42 ++ cmd/chantools/zombierecovery_signoffer.go | 193 ++++++++ doc/chantools.md | 1 + doc/chantools_derivekey.md | 2 +- doc/chantools_rescuefunding.md | 2 +- doc/chantools_sweeptimelock.md | 2 +- doc/chantools_sweeptimelockmanual.md | 2 +- doc/chantools_zombierecovery.md | 37 ++ doc/chantools_zombierecovery_findmatches.md | 45 ++ doc/chantools_zombierecovery_makeoffer.md | 49 ++ doc/chantools_zombierecovery_preparekeys.md | 45 ++ doc/chantools_zombierecovery_signoffer.md | 35 ++ doc/rescue-flow.plantuml | 1 + doc/rescue-flow.png | Bin 69758 -> 76076 bytes doc/zombierecovery.md | 6 + lnd/graph.go | 33 +- lnd/hdkeychain.go | 7 + lnd/signer.go | 2 +- 29 files changed, 1381 insertions(+), 25 deletions(-) create mode 100644 cmd/chantools/zombierecovery_findmatches.go create mode 100644 cmd/chantools/zombierecovery_makeoffer.go create mode 100644 cmd/chantools/zombierecovery_preparekeys.go create mode 100644 cmd/chantools/zombierecovery_root.go create mode 100644 cmd/chantools/zombierecovery_signoffer.go create mode 100644 doc/chantools_zombierecovery.md create mode 100644 doc/chantools_zombierecovery_findmatches.md create mode 100644 doc/chantools_zombierecovery_makeoffer.md create mode 100644 doc/chantools_zombierecovery_preparekeys.md create mode 100644 doc/chantools_zombierecovery_signoffer.md create mode 100644 doc/zombierecovery.md diff --git a/README.md b/README.md index fdc447f..7a95797 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ compacting the DB). don't have a `channel.db` file or because `chantools` couldn't rescue all your node's channels. There are a few things you can try manually that have some chance of working: - - Make sure you can connect to all nodes when restoring from SCB: It happens + - Make sure you can connect to all nodes when restoring from SCB: It happens all the time that nodes change their IP addresses. When restoring from a static channel backup, your node tries to connect to the node using the IP address encoded in the backup file. If the address changed, the SCB restore @@ -194,13 +194,20 @@ compacting the DB). `lncli connect @:` in the recovered `lnd` node from step 3 and wait a few hours to see if the channel is now being force closed by the remote node. - - Find out who the node belongs to: Maybe you opened the channel with someone + - Find out who the node belongs to: Maybe you opened the channel with someone you know. Or maybe their node alias contains some information about who the node belongs to. If you can find out who operates the remote node, you can ask them to force-close the channel from their end. If the channel was opened with the `option_static_remote_key`, (`lnd v0.8.0` and later), the funds can be swept by your node. +12. **Use Zombie Channel Recovery Matcher**: As a final, last resort, you can + go to [node-recovery.com](https://www.node-recovery.com/) and register your + node's ID for being matched up against other nodes with the same problem. +

+ Once you were contacted with a match, follow the instructions on the + [Zombie Channel Recovery Guide](doc/zombierecovery.md) page. + ## Seed and passphrase input All commands that require the seed (and, if set, the seed's passphrase) offer diff --git a/btc/explorer_api.go b/btc/explorer_api.go index f00ed6d..eeeb3c2 100644 --- a/btc/explorer_api.go +++ b/btc/explorer_api.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "net/http" + "strconv" "strings" ) @@ -89,6 +90,30 @@ func (a *ExplorerAPI) Outpoint(addr string) (*TX, int, error) { return nil, 0, fmt.Errorf("no tx found") } +func (a *ExplorerAPI) Address(outpoint string) (string, error) { + parts := strings.Split(outpoint, ":") + + if len(parts) != 2 { + return "", fmt.Errorf("invalid outpoint: %v", outpoint) + } + + tx, err := a.Transaction(parts[0]) + if err != nil { + return "", err + } + + vout, err := strconv.Atoi(parts[1]) + if err != nil { + return "", err + } + + if len(tx.Vout) <= vout { + return "", fmt.Errorf("invalid output index: %d", vout) + } + + return tx.Vout[vout].ScriptPubkeyAddr, nil +} + func (a *ExplorerAPI) PublishTx(rawTxHex string) (string, error) { url := fmt.Sprintf("%s/tx", a.BaseURL) resp, err := http.Post(url, "text/plain", strings.NewReader(rawTxHex)) diff --git a/btc/summary.go b/btc/summary.go index 20ecb33..6649dbf 100644 --- a/btc/summary.go +++ b/btc/summary.go @@ -102,7 +102,7 @@ func reportOutspend(api *ExplorerAPI, entry.ClosingTX.ToRemoteAddr = o.ScriptPubkeyAddr } } - + if couldBeOurs(entry, utxo) { summaryFile.ChannelsWithPotential++ summaryFile.FundsForceClose += utxo[0].Value diff --git a/cmd/chantools/dropchannelgraph.go b/cmd/chantools/dropchannelgraph.go index 298b97c..5105c7a 100644 --- a/cmd/chantools/dropchannelgraph.go +++ b/cmd/chantools/dropchannelgraph.go @@ -67,6 +67,6 @@ func (c *dropChannelGraphCommand) Execute(_ *cobra.Command, _ []string) error { if err := rwTx.DeleteTopLevelBucket(graphMetaBucket); err != nil { return err } - + return rwTx.Commit() } diff --git a/cmd/chantools/fakechanbackup.go b/cmd/chantools/fakechanbackup.go index 232c549..949240e 100644 --- a/cmd/chantools/fakechanbackup.go +++ b/cmd/chantools/fakechanbackup.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/hex" "fmt" - "github.com/lightningnetwork/lnd/tor" "io/ioutil" "net" "strconv" @@ -21,6 +20,7 @@ import ( "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/tor" "github.com/spf13/cobra" ) @@ -166,21 +166,21 @@ func (c *fakeChanBackupCommand) Execute(_ *cobra.Command, _ []string) error { } // Parse the short channel ID. - splitChanId := strings.Split(c.ShortChanID, "x") - if len(splitChanId) != 3 { + splitChanID := strings.Split(c.ShortChanID, "x") + if len(splitChanID) != 3 { return fmt.Errorf("--short_channel_id expected in format: " + "xx", ) } - blockHeight, err := strconv.ParseInt(splitChanId[0], 10, 32) + blockHeight, err := strconv.ParseInt(splitChanID[0], 10, 32) if err != nil { return fmt.Errorf("could not parse block height: %s", err) } - txIndex, err := strconv.ParseInt(splitChanId[1], 10, 32) + txIndex, err := strconv.ParseInt(splitChanID[1], 10, 32) if err != nil { return fmt.Errorf("could not parse transaction index: %s", err) } - chanOutputIdx, err := strconv.ParseInt(splitChanId[2], 10, 32) + chanOutputIdx, err := strconv.ParseInt(splitChanID[2], 10, 32) if err != nil { return fmt.Errorf("could not parse output index: %s", err) } diff --git a/cmd/chantools/rescueclosed.go b/cmd/chantools/rescueclosed.go index 92261ac..1a1766f 100644 --- a/cmd/chantools/rescueclosed.go +++ b/cmd/chantools/rescueclosed.go @@ -225,7 +225,7 @@ func commitPointsFromLogFile(lndLog string) ([]*btcec.PublicKey, error) { dedupMap[groups[1]] = commitPoint } - var result []*btcec.PublicKey + result := make([]*btcec.PublicKey, 0, len(dedupMap)) for _, commitPoint := range dedupMap { result = append(result, commitPoint) } diff --git a/cmd/chantools/root.go b/cmd/chantools/root.go index 7853d7a..55950ef 100644 --- a/cmd/chantools/root.go +++ b/cmd/chantools/root.go @@ -26,7 +26,7 @@ import ( const ( defaultAPIURL = "https://blockstream.info/api" - version = "0.8.3" + version = "0.8.4" na = "n/a" Commit = "" @@ -102,6 +102,7 @@ func main() { newSweepTimeLockManualCommand(), newVanityGenCommand(), newWalletInfoCommand(), + newZombieRecoveryCommand(), ) if err := rootCmd.Execute(); err != nil { diff --git a/cmd/chantools/sweeptimelock.go b/cmd/chantools/sweeptimelock.go index bfbbc0d..0aeeb80 100644 --- a/cmd/chantools/sweeptimelock.go +++ b/cmd/chantools/sweeptimelock.go @@ -19,7 +19,7 @@ import ( ) const ( - defaultFeeSatPerVByte = 2 + defaultFeeSatPerVByte = 30 defaultCsvLimit = 2016 ) diff --git a/cmd/chantools/zombierecovery_findmatches.go b/cmd/chantools/zombierecovery_findmatches.go new file mode 100644 index 0000000..4bf930d --- /dev/null +++ b/cmd/chantools/zombierecovery_findmatches.go @@ -0,0 +1,200 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "regexp" + "time" + + "github.com/btcsuite/btcd/btcec" + "github.com/gogo/protobuf/jsonpb" + "github.com/guggero/chantools/btc" + "github.com/guggero/chantools/lnd" + "github.com/lightningnetwork/lnd/lnrpc" + "github.com/spf13/cobra" +) + +var ( + patternRegistration = regexp.MustCompile( + "(?m)(?s)ID: ([0-9a-f]{66})\nContact: (.*?)\n" + + "Time: ") +) + +type nodeInfo struct { + PubKey string `json:"identity_pubkey"` + Contact string `json:"contact"` + PayoutAddr string `json:"payout_addr,omitempty"` + MultisigKeys []string `json:"multisig_keys,omitempty"` +} + +type channel struct { + ChannelID string `json:"short_channel_id"` + ChanPoint string `json:"chan_point"` + Address string `json:"address"` + Capacity int64 `json:"capacity"` + txid string + vout uint32 + ourKeyIndex uint32 + ourKey *btcec.PublicKey + theirKey *btcec.PublicKey + witnessScript []byte +} + +type match struct { + Node1 *nodeInfo `json:"node1"` + Node2 *nodeInfo `json:"node2"` + Channels []*channel `json:"channels"` +} + +type zombieRecoveryFindMatchesCommand struct { + APIURL string + Registrations string + ChannelGraph string + + cmd *cobra.Command +} + +func newZombieRecoveryFindMatchesCommand() *cobra.Command { + cc := &zombieRecoveryFindMatchesCommand{} + cc.cmd = &cobra.Command{ + Use: "findmatches", + Short: "[0/3] Match maker only: Find matches between " + + "registered nodes", + Long: `Match maker only: Runs through all the nodes that have +registered their ID on https://www.node-recovery.com and checks whether there +are any matches of channels between them by looking at the whole channel graph. + +This command will be run by guggero and the result will be sent to the +registered nodes.`, + Example: `chantools zombierecovery findmatches \ + --registrations data.txt \ + --channel_graph lncli_describegraph.json`, + RunE: cc.Execute, + } + + cc.cmd.Flags().StringVar( + &cc.APIURL, "apiurl", defaultAPIURL, "API URL to use (must "+ + "be esplora compatible)", + ) + cc.cmd.Flags().StringVar( + &cc.Registrations, "registrations", "", "the raw data.txt "+ + "where the registrations are stored in", + ) + cc.cmd.Flags().StringVar( + &cc.ChannelGraph, "channel_graph", "", "the full LN channel "+ + "graph in the JSON format that the "+ + "'lncli describegraph' returns", + ) + + return cc.cmd +} + +func (c *zombieRecoveryFindMatchesCommand) Execute(_ *cobra.Command, + _ []string) error { + + api := &btc.ExplorerAPI{BaseURL: c.APIURL} + + logFileBytes, err := ioutil.ReadFile(c.Registrations) + if err != nil { + return fmt.Errorf("error reading registrations file %s: %v", + c.Registrations, err) + } + + allMatches := patternRegistration.FindAllStringSubmatch( + string(logFileBytes), -1, + ) + registrations := make(map[string]string, len(allMatches)) + for _, groups := range allMatches { + if _, err := pubKeyFromHex(groups[1]); err != nil { + return fmt.Errorf("error parsing node ID: %v", err) + } + + registrations[groups[1]] = groups[2] + + log.Infof("%s: %s", groups[1], groups[2]) + } + + graphBytes, err := ioutil.ReadFile(c.ChannelGraph) + if err != nil { + return fmt.Errorf("error reading graph JSON file %s: "+ + "%v", c.ChannelGraph, err) + } + graph := &lnrpc.ChannelGraph{} + err = jsonpb.UnmarshalString(string(graphBytes), graph) + if err != nil { + return fmt.Errorf("error parsing graph JSON: %v", err) + } + + // Loop through all nodes now. + matches := make(map[string]map[string]*match) + for node1, contact1 := range registrations { + matches[node1] = make(map[string]*match) + for node2, contact2 := range registrations { + if node1 == node2 { + continue + } + + // We've already looked at this pair. + if matches[node2][node1] != nil { + continue + } + + edges := lnd.FindCommonEdges(graph, node1, node2) + if len(edges) > 0 { + matches[node1][node2] = &match{ + Node1: &nodeInfo{ + PubKey: node1, + Contact: contact1, + }, + Node2: &nodeInfo{ + PubKey: node2, + Contact: contact2, + }, + Channels: make([]*channel, len(edges)), + } + + for idx, edge := range edges { + cid := fmt.Sprintf("%d", edge.ChannelId) + c := &channel{ + ChannelID: cid, + ChanPoint: edge.ChanPoint, + Capacity: edge.Capacity, + } + + addr, err := api.Address(c.ChanPoint) + if err == nil { + c.Address = addr + } + + matches[node1][node2].Channels[idx] = c + } + } + } + } + + // Write the matches to files. + for node1, node1map := range matches { + for node2, match := range node1map { + if match == nil { + continue + } + + matchBytes, err := json.MarshalIndent(match, "", " ") + if err != nil { + return err + } + + fileName := fmt.Sprintf("results/match-%s-%s-%s.json", + time.Now().Format("2006-01-02"), + node1, node2) + log.Infof("Writing result to %s", fileName) + err = ioutil.WriteFile(fileName, matchBytes, 0644) + if err != nil { + return err + } + } + } + + return nil +} diff --git a/cmd/chantools/zombierecovery_makeoffer.go b/cmd/chantools/zombierecovery_makeoffer.go new file mode 100644 index 0000000..9afce76 --- /dev/null +++ b/cmd/chantools/zombierecovery_makeoffer.go @@ -0,0 +1,505 @@ +package main + +import ( + "bufio" + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" + + "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/wire" + "github.com/btcsuite/btcutil/psbt" + "github.com/guggero/chantools/lnd" + "github.com/lightningnetwork/lnd/input" + "github.com/lightningnetwork/lnd/keychain" + "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/lnwallet/chainfee" + "github.com/spf13/cobra" +) + +type zombieRecoveryMakeOfferCommand struct { + Node1 string + Node2 string + FeeRate uint16 + + rootKey *rootKey + cmd *cobra.Command +} + +func newZombieRecoveryMakeOfferCommand() *cobra.Command { + cc := &zombieRecoveryMakeOfferCommand{} + cc.cmd = &cobra.Command{ + Use: "makeoffer", + Short: "[2/3] Make an offer on how to split the funds to " + + "recover", + Long: `After both parties have prepared their keys with the +'preparekeys' command and have exchanged the files generated from that step, +one party has to create an offer on how to split the funds that are in the +channels to be rescued. +If the other party agrees with the offer, they can sign and publish the offer +with the 'signoffer' command. If the other party does not agree, they can create +a counter offer.`, + Example: `chantools zombierecovery makeoffer \ + --node1_keys preparedkeys-xxxx-xx-xx-.json \ + --node2_keys preparedkeys-xxxx-xx-xx-.json \ + --feerate 15`, + RunE: cc.Execute, + } + + cc.cmd.Flags().StringVar( + &cc.Node1, "node1_keys", "", "the JSON file generated in the"+ + "previous step ('preparekeys') command of node 1", + ) + cc.cmd.Flags().StringVar( + &cc.Node2, "node2_keys", "", "the JSON file generated in the"+ + "previous step ('preparekeys') command of node 2", + ) + cc.cmd.Flags().Uint16Var( + &cc.FeeRate, "feerate", defaultFeeSatPerVByte, "fee rate to "+ + "use for the sweep transaction in sat/vByte", + ) + + cc.rootKey = newRootKey(cc.cmd, "signing the offer") + + return cc.cmd +} + +func (c *zombieRecoveryMakeOfferCommand) Execute(_ *cobra.Command, // nolint:gocyclo + _ []string) error { + + extendedKey, err := c.rootKey.read() + if err != nil { + return fmt.Errorf("error reading root key: %v", err) + } + + if c.FeeRate == 0 { + c.FeeRate = defaultFeeSatPerVByte + } + + node1Bytes, err := ioutil.ReadFile(c.Node1) + if err != nil { + return fmt.Errorf("error reading node1 key file %s: %v", + c.Node1, err) + } + node2Bytes, err := ioutil.ReadFile(c.Node2) + if err != nil { + return fmt.Errorf("error reading node2 key file %s: %v", + c.Node2, err) + } + keys1, keys2 := &match{}, &match{} + decoder := json.NewDecoder(bytes.NewReader(node1Bytes)) + if err := decoder.Decode(&keys1); err != nil { + return fmt.Errorf("error decoding node1 key file %s: %v", + c.Node1, err) + } + decoder = json.NewDecoder(bytes.NewReader(node2Bytes)) + if err := decoder.Decode(&keys2); err != nil { + return fmt.Errorf("error decoding node2 key file %s: %v", + c.Node2, err) + } + + // Make sure the key files were filled correctly. + if keys1.Node1 == nil || keys1.Node2 == nil { + return fmt.Errorf("invalid node1 file, node info missing") + } + if keys2.Node1 == nil || keys2.Node2 == nil { + return fmt.Errorf("invalid node2 file, node info missing") + } + if keys1.Node1.PubKey != keys2.Node1.PubKey { + return fmt.Errorf("invalid files, node 1 pubkey doesn't match") + } + if keys1.Node2.PubKey != keys2.Node2.PubKey { + return fmt.Errorf("invalid files, node 2 pubkey doesn't match") + } + if len(keys1.Node1.MultisigKeys) == 0 && + len(keys1.Node2.MultisigKeys) == 0 { + + return fmt.Errorf("invalid node1 file, missing multisig keys") + } + if len(keys2.Node1.MultisigKeys) == 0 && + len(keys2.Node2.MultisigKeys) == 0 { + + return fmt.Errorf("invalid node2 file, missing multisig keys") + } + if len(keys1.Node1.MultisigKeys) == len(keys2.Node1.MultisigKeys) { + return fmt.Errorf("invalid files, channel info incorrect") + } + if len(keys1.Node2.MultisigKeys) == len(keys2.Node2.MultisigKeys) { + return fmt.Errorf("invalid files, channel info incorrect") + } + if len(keys1.Channels) != len(keys2.Channels) { + return fmt.Errorf("invalid files, channels don't match") + } + for idx, node1Channel := range keys1.Channels { + if keys2.Channels[idx].ChanPoint != node1Channel.ChanPoint { + return fmt.Errorf("invalid files, channels don't match") + } + + if keys2.Channels[idx].Address != node1Channel.Address { + return fmt.Errorf("invalid files, channels don't match") + } + + if keys2.Channels[idx].Address == "" || + node1Channel.Address == "" { + + return fmt.Errorf("invalid files, channel address " + + "missing") + } + } + + // Make sure one of the nodes is ours. + _, pubKey, _, err := lnd.DeriveKey( + extendedKey, lnd.IdentityPath(chainParams), chainParams, + ) + if err != nil { + return fmt.Errorf("error deriving identity pubkey: %v", err) + } + + pubKeyStr := hex.EncodeToString(pubKey.SerializeCompressed()) + if keys1.Node1.PubKey != pubKeyStr && keys1.Node2.PubKey != pubKeyStr { + return fmt.Errorf("derived pubkey %s from seed but that key "+ + "was not found in the match files", pubKeyStr) + } + + // Pick the correct list of keys. There are 4 possibilities, given 2 + // files with 2 node slots each. + var ( + ourKeys []string + ourPayoutAddr string + theirKeys []string + theirPayoutAddr string + ) + if keys1.Node1.PubKey == pubKeyStr && len(keys1.Node1.MultisigKeys) > 0 { + ourKeys = keys1.Node1.MultisigKeys + ourPayoutAddr = keys1.Node1.PayoutAddr + theirKeys = keys2.Node2.MultisigKeys + theirPayoutAddr = keys2.Node2.PayoutAddr + } + if keys1.Node2.PubKey == pubKeyStr && len(keys1.Node2.MultisigKeys) > 0 { + ourKeys = keys1.Node2.MultisigKeys + ourPayoutAddr = keys1.Node2.PayoutAddr + theirKeys = keys2.Node1.MultisigKeys + theirPayoutAddr = keys2.Node1.PayoutAddr + } + if keys2.Node1.PubKey == pubKeyStr && len(keys2.Node1.MultisigKeys) > 0 { + ourKeys = keys2.Node1.MultisigKeys + ourPayoutAddr = keys2.Node1.PayoutAddr + theirKeys = keys1.Node2.MultisigKeys + theirPayoutAddr = keys1.Node2.PayoutAddr + } + if keys2.Node2.PubKey == pubKeyStr && len(keys2.Node2.MultisigKeys) > 0 { + ourKeys = keys2.Node2.MultisigKeys + ourPayoutAddr = keys2.Node2.PayoutAddr + theirKeys = keys1.Node1.MultisigKeys + theirPayoutAddr = keys1.Node1.PayoutAddr + } + if len(ourKeys) == 0 || len(theirKeys) == 0 { + return fmt.Errorf("couldn't find necessary keys") + } + if ourPayoutAddr == "" || theirPayoutAddr == "" { + return fmt.Errorf("payout address missing") + } + + ourPubKeys := make([]*btcec.PublicKey, len(ourKeys)) + theirPubKeys := make([]*btcec.PublicKey, len(theirKeys)) + for idx, pubKeyHex := range ourKeys { + ourPubKeys[idx], err = pubKeyFromHex(pubKeyHex) + if err != nil { + return fmt.Errorf("error parsing our pubKey: %v", err) + } + } + for idx, pubKeyHex := range theirKeys { + theirPubKeys[idx], err = pubKeyFromHex(pubKeyHex) + if err != nil { + return fmt.Errorf("error parsing their pubKey: %v", err) + } + } + + // Loop through all channels and all keys now, this will definitely take + // a while. +channelLoop: + for _, channel := range keys1.Channels { + for ourKeyIndex, ourKey := range ourPubKeys { + for _, theirKey := range theirPubKeys { + match, witnessScript, err := matchScript( + channel.Address, ourKey, theirKey, + chainParams, + ) + if err != nil { + return fmt.Errorf("error matching "+ + "keys to script: %v", err) + } + + if match { + channel.ourKeyIndex = uint32(ourKeyIndex) + channel.ourKey = ourKey + channel.theirKey = theirKey + channel.witnessScript = witnessScript + + log.Infof("Found keys for channel %s", + channel.ChanPoint) + + continue channelLoop + } + } + } + + return fmt.Errorf("didn't find matching multisig keys for "+ + "channel %s", channel.ChanPoint) + } + + // Let's now sum up the tally of how much of the rescued funds should + // go to which party. + var ( + inputs = make([]*wire.TxIn, 0, len(keys1.Channels)) + ourSum int64 + theirSum int64 + ) + for idx, channel := range keys1.Channels { + op, err := lnd.ParseOutpoint(channel.ChanPoint) + if err != nil { + return fmt.Errorf("error parsing channel out point: %v", + err) + } + channel.txid = op.Hash.String() + channel.vout = op.Index + + ourPart, theirPart, err := askAboutChannel( + channel, idx+1, len(keys1.Channels), ourPayoutAddr, + theirPayoutAddr, + ) + if err != nil { + return err + } + + ourSum += ourPart + theirSum += theirPart + inputs = append(inputs, &wire.TxIn{ + PreviousOutPoint: *op, + // It's not actually an old sig script but a witness + // script but we'll move that to the correct place once + // we create the PSBT. + SignatureScript: channel.witnessScript, + }) + } + + // Let's create a fee estimator now to give an overview over the + // deducted fees. + estimator := input.TxWeightEstimator{} + + // Only add output for us if we should receive something. + if ourSum > 0 { + estimator.AddP2WKHOutput() + } + if theirSum > 0 { + estimator.AddP2WKHOutput() + } + for range inputs { + estimator.AddWitnessInput(input.MultiSigWitnessSize) + } + feeRateKWeight := chainfee.SatPerKVByte(1000 * c.FeeRate).FeePerKWeight() + totalFee := int64(feeRateKWeight.FeeForWeight(int64(estimator.Weight()))) + + fmt.Printf("Current tally (before fees):\n\t"+ + "To our address (%s): %d sats\n\t"+ + "To their address (%s): %d sats\n\t"+ + "Estimated fees (at rate %d sat/vByte): %d sats\n", + ourPayoutAddr, ourSum, theirPayoutAddr, theirSum, c.FeeRate, + totalFee) + + // Distribute the fees. + halfFee := totalFee / 2 + switch { + case ourSum-halfFee > 0 && theirSum-halfFee > 0: + ourSum -= halfFee + theirSum -= halfFee + + case ourSum-totalFee > 0: + ourSum -= totalFee + + case theirSum-totalFee > 0: + theirSum -= totalFee + + default: + return fmt.Errorf("error distributing fees, unhandled case") + } + + // Don't create dust. + if ourSum <= int64(lnwallet.DefaultDustLimit()) { + ourSum = 0 + } + if theirSum <= int64(lnwallet.DefaultDustLimit()) { + theirSum = 0 + } + + fmt.Printf("Current tally (after fees):\n\t"+ + "To our address (%s): %d sats\n\t"+ + "To their address (%s): %d sats\n", + ourPayoutAddr, ourSum, theirPayoutAddr, theirSum) + + // And now create the PSBT. + tx := wire.NewMsgTx(2) + if ourSum > 0 { + pkScript, err := lnd.GetP2WPKHScript(ourPayoutAddr, chainParams) + if err != nil { + return fmt.Errorf("error parsing our payout address: "+ + "%v", err) + } + tx.TxOut = append(tx.TxOut, &wire.TxOut{ + PkScript: pkScript, + Value: ourSum, + }) + } + if theirSum > 0 { + pkScript, err := lnd.GetP2WPKHScript( + theirPayoutAddr, chainParams, + ) + if err != nil { + return fmt.Errorf("error parsing their payout "+ + "address: %v", err) + } + tx.TxOut = append(tx.TxOut, &wire.TxOut{ + PkScript: pkScript, + Value: theirSum, + }) + } + for _, txIn := range inputs { + tx.TxIn = append(tx.TxIn, &wire.TxIn{ + PreviousOutPoint: txIn.PreviousOutPoint, + }) + } + packet, err := psbt.NewFromUnsignedTx(tx) + if err != nil { + return fmt.Errorf("error creating PSBT from TX: %v", err) + } + + signer := &lnd.Signer{ + ExtendedKey: extendedKey, + ChainParams: chainParams, + } + for idx, txIn := range inputs { + channel := keys1.Channels[idx] + + // We've mis-used this field to transport the witness script, + // let's now copy it to the correct place. + packet.Inputs[idx].WitnessScript = txIn.SignatureScript + + // Let's prepare the witness UTXO. + pkScript, err := input.WitnessScriptHash(channel.witnessScript) + if err != nil { + return err + } + packet.Inputs[idx].WitnessUtxo = &wire.TxOut{ + PkScript: pkScript, + Value: channel.Capacity, + } + + // We'll be signing with our key so we can just add the other + // party's pubkey as additional info so it's easy for them to + // sign as well. + packet.Inputs[idx].Unknowns = append( + packet.Inputs[idx].Unknowns, &psbt.Unknown{ + Key: PsbtKeyTypeOutputMissingSigPubkey, + Value: channel.theirKey.SerializeCompressed(), + }, + ) + + keyDesc := keychain.KeyDescriptor{ + PubKey: channel.ourKey, + KeyLocator: keychain.KeyLocator{ + Family: keychain.KeyFamilyMultiSig, + Index: channel.ourKeyIndex, + }, + } + utxo := &wire.TxOut{ + Value: channel.Capacity, + } + err = signer.AddPartialSignature( + packet, keyDesc, utxo, txIn.SignatureScript, idx, + ) + if err != nil { + return fmt.Errorf("error signing input %d: %v", idx, + err) + } + } + + // Looks like we're done! + base64, err := packet.B64Encode() + if err != nil { + return fmt.Errorf("error encoding PSBT: %v", err) + } + + fmt.Printf("Done creating offer, please send this PSBT string to \n"+ + "the other party to review and sign (if they accept): \n%s\n", + base64) + + return nil +} + +func matchScript(address string, key1, key2 *btcec.PublicKey, + params *chaincfg.Params) (bool, []byte, error) { + + channelScript, err := lnd.GetP2WSHScript(address, params) + if err != nil { + return false, nil, err + } + + witnessScript, err := input.GenMultiSigScript( + key1.SerializeCompressed(), key2.SerializeCompressed(), + ) + if err != nil { + return false, nil, err + } + pkScript, err := input.WitnessScriptHash(witnessScript) + if err != nil { + return false, nil, err + } + + return bytes.Equal(channelScript, pkScript), witnessScript, nil +} + +func askAboutChannel(channel *channel, current, total int, ourAddr, + theirAddr string) (int64, int64, error) { + + fundingTxid := strings.Split(channel.ChanPoint, ":")[0] + + fmt.Printf("Channel %s (%d of %d): \n\tCapacity: %d sat\n\t"+ + "Funding TXID: https://blockstream.info/tx/%v\n\t"+ + "Channel info: https://1ml.com/channel/%s\n\t"+ + "Channel funding address: %s\n\n"+ + "How many sats should go to you (%s) before fees?: ", + channel.ChanPoint, current, total, channel.Capacity, + fundingTxid, channel.ChannelID, channel.Address, ourAddr) + reader := bufio.NewReader(os.Stdin) + ourPartStr, err := reader.ReadString('\n') + if err != nil { + return 0, 0, err + } + + ourPart, err := strconv.ParseUint(strings.TrimSpace(ourPartStr), 10, 64) + if err != nil { + return 0, 0, err + } + + // Let the user try again if they entered something incorrect. + if int64(ourPart) > channel.Capacity { + fmt.Printf("Cannot send more than %d sats to ourself!\n", + channel.Capacity) + return askAboutChannel( + channel, current, total, ourAddr, theirAddr, + ) + } + + theirPart := channel.Capacity - int64(ourPart) + fmt.Printf("\nWill send: \n\t%d sats to our address (%s) and \n\t"+ + "%d sats to the other peer's address (%s).\n\n", ourPart, + ourAddr, theirPart, theirAddr) + + return int64(ourPart), theirPart, nil +} diff --git a/cmd/chantools/zombierecovery_preparekeys.go b/cmd/chantools/zombierecovery_preparekeys.go new file mode 100644 index 0000000..2549844 --- /dev/null +++ b/cmd/chantools/zombierecovery_preparekeys.go @@ -0,0 +1,138 @@ +package main + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "io/ioutil" + "time" + + "github.com/guggero/chantools/lnd" + "github.com/spf13/cobra" +) + +const ( + numMultisigKeys = 2500 +) + +type zombieRecoveryPrepareKeysCommand struct { + MatchFile string + PayoutAddr string + + rootKey *rootKey + cmd *cobra.Command +} + +func newZombieRecoveryPrepareKeysCommand() *cobra.Command { + cc := &zombieRecoveryPrepareKeysCommand{} + cc.cmd = &cobra.Command{ + Use: "preparekeys", + Short: "[1/3] Prepare all public keys for a recovery attempt", + Long: `Takes a match file, validates it against the seed and +then adds the first 2500 multisig pubkeys to it. +This must be run by both parties of a channel for a successful recovery. The +next step (makeoffer) takes two such key enriched files and tries to find the +correct ones for the matched channels.`, + Example: `chantools zombierecovery preparekeys \ + --match_file match-xxxx-xx-xx--.json \ + --payout_addr bc1q...`, + RunE: cc.Execute, + } + + cc.cmd.Flags().StringVar( + &cc.MatchFile, "match_file", "", "the match JSON file that "+ + "was sent to both nodes by the match maker", + ) + cc.cmd.Flags().StringVar( + &cc.PayoutAddr, "payout_addr", "", "the address where this "+ + "node's rescued funds should be sent to, must be a "+ + "P2WPKH (native SegWit) address") + + cc.rootKey = newRootKey(cc.cmd, "deriving the multisig keys") + + return cc.cmd +} + +func (c *zombieRecoveryPrepareKeysCommand) Execute(_ *cobra.Command, + _ []string) error { + + extendedKey, err := c.rootKey.read() + if err != nil { + return fmt.Errorf("error reading root key: %v", err) + } + + _, err = lnd.GetP2WPKHScript(c.PayoutAddr, chainParams) + if err != nil { + return fmt.Errorf("invalid payout address, must be P2WPKH") + } + + matchFileBytes, err := ioutil.ReadFile(c.MatchFile) + if err != nil { + return fmt.Errorf("error reading match file %s: %v", + c.MatchFile, err) + } + + decoder := json.NewDecoder(bytes.NewReader(matchFileBytes)) + match := &match{} + if err := decoder.Decode(&match); err != nil { + return fmt.Errorf("error decoding match file %s: %v", + c.MatchFile, err) + } + + // Make sure the match file was filled correctly. + if match.Node1 == nil || match.Node2 == nil { + return fmt.Errorf("invalid match file, node info missing") + } + + _, pubKey, _, err := lnd.DeriveKey( + extendedKey, lnd.IdentityPath(chainParams), chainParams, + ) + if err != nil { + return fmt.Errorf("error deriving identity pubkey: %v", err) + } + + pubKeyStr := hex.EncodeToString(pubKey.SerializeCompressed()) + var nodeInfo *nodeInfo + switch { + case match.Node1.PubKey != pubKeyStr && match.Node2.PubKey != pubKeyStr: + return fmt.Errorf("derived pubkey %s from seed but that key "+ + "was not found in the match file %s", pubKeyStr, + c.MatchFile) + + case match.Node1.PubKey == pubKeyStr: + nodeInfo = match.Node1 + + default: + nodeInfo = match.Node2 + } + + // Derive all 2500 keys now, this might take a while. + for index := 0; index < numMultisigKeys; index++ { + _, pubKey, _, err := lnd.DeriveKey( + extendedKey, lnd.MultisigPath(chainParams, index), + chainParams, + ) + if err != nil { + return fmt.Errorf("error deriving multisig pubkey: %v", + err) + } + + nodeInfo.MultisigKeys = append( + nodeInfo.MultisigKeys, + hex.EncodeToString(pubKey.SerializeCompressed()), + ) + } + nodeInfo.PayoutAddr = c.PayoutAddr + + // Write the result back into a new file. + matchBytes, err := json.MarshalIndent(match, "", " ") + if err != nil { + return err + } + + fileName := fmt.Sprintf("results/preparedkeys-%s-%s.json", + time.Now().Format("2006-01-02"), pubKeyStr) + log.Infof("Writing result to %s", fileName) + return ioutil.WriteFile(fileName, matchBytes, 0644) +} diff --git a/cmd/chantools/zombierecovery_root.go b/cmd/chantools/zombierecovery_root.go new file mode 100644 index 0000000..d081b61 --- /dev/null +++ b/cmd/chantools/zombierecovery_root.go @@ -0,0 +1,42 @@ +package main + +import ( + "os" + + "github.com/spf13/cobra" +) + +type zombieRecoveryCommand struct { + cmd *cobra.Command +} + +func newZombieRecoveryCommand() *cobra.Command { + cc := &zombieRecoveryCommand{} + cc.cmd = &cobra.Command{ + Use: "zombierecovery", + Short: "Try rescuing funds stuck in channels with zombie nodes", + Long: `A sub command that hosts a set of further sub commands +to help with recovering funds tuck in zombie channels. + +Please visit https://github.com/guggero/chantools/blob/master/doc/zombierecovery.md +for more information on how to use these commands.`, + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + _ = cmd.Help() + os.Exit(0) + } + }, + } + + cobra.EnableCommandSorting = false + cc.cmd.AddCommand( + // Here the order matters, we don't want them to be + // alphabetically sorted but by step number. + newZombieRecoveryFindMatchesCommand(), + newZombieRecoveryPrepareKeysCommand(), + newZombieRecoveryMakeOfferCommand(), + newZombieRecoverySignOfferCommand(), + ) + + return cc.cmd +} diff --git a/cmd/chantools/zombierecovery_signoffer.go b/cmd/chantools/zombierecovery_signoffer.go new file mode 100644 index 0000000..83ce010 --- /dev/null +++ b/cmd/chantools/zombierecovery_signoffer.go @@ -0,0 +1,193 @@ +package main + +import ( + "bufio" + "bytes" + "fmt" + "github.com/btcsuite/btcd/txscript" + "os" + + "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcutil/hdkeychain" + "github.com/btcsuite/btcutil/psbt" + "github.com/guggero/chantools/lnd" + "github.com/lightningnetwork/lnd/keychain" + "github.com/spf13/cobra" +) + +type zombieRecoverySignOfferCommand struct { + Psbt string + + rootKey *rootKey + cmd *cobra.Command +} + +func newZombieRecoverySignOfferCommand() *cobra.Command { + cc := &zombieRecoverySignOfferCommand{} + cc.cmd = &cobra.Command{ + Use: "signoffer", + Short: "[3/3] Sign an offer sent by the remote peer to " + + "recover funds", + Long: `Inspect and sign an offer that was sent by the remote +peer to recover funds from one or more channels.`, + Example: `chantools zombierecovery signoffer \ + --psbt `, + RunE: cc.Execute, + } + + cc.cmd.Flags().StringVar( + &cc.Psbt, "psbt", "", "the base64 encoded PSBT that the other "+ + "party sent as an offer to rescue funds", + ) + + cc.rootKey = newRootKey(cc.cmd, "signing the offer") + + return cc.cmd +} + +func (c *zombieRecoverySignOfferCommand) Execute(_ *cobra.Command, + _ []string) error { + + extendedKey, err := c.rootKey.read() + if err != nil { + return fmt.Errorf("error reading root key: %v", err) + } + + signer := &lnd.Signer{ + ExtendedKey: extendedKey, + ChainParams: chainParams, + } + + // Decode the PSBT. + packet, err := psbt.NewFromRawBytes( + bytes.NewReader([]byte(c.Psbt)), true, + ) + if err != nil { + return fmt.Errorf("error decoding PSBT: %v", err) + } + + return signOffer(extendedKey, packet, signer) +} + +func signOffer(rootKey *hdkeychain.ExtendedKey, + packet *psbt.Packet, signer *lnd.Signer) error { + + // First, we need to derive the correct branch from the local root key. + localMultisig, err := lnd.DeriveChildren(rootKey, []uint32{ + lnd.HardenedKeyStart + uint32(keychain.BIP0043Purpose), + lnd.HardenedKeyStart + chainParams.HDCoinType, + lnd.HardenedKeyStart + uint32(keychain.KeyFamilyMultiSig), + 0, + }) + if err != nil { + return fmt.Errorf("could not derive local multisig key: %v", + err) + } + + // Now let's check that the packet has the expected proprietary key with + // our pubkey that we need to sign with. + if len(packet.Inputs) == 0 { + return fmt.Errorf("invalid PSBT, expected at least 1 input, "+ + "got %d", len(packet.Inputs)) + } + for idx := range packet.Inputs { + if len(packet.Inputs[idx].Unknowns) != 1 { + return fmt.Errorf("invalid PSBT, expected 1 unknown "+ + "in input %d, got %d", idx, + len(packet.Inputs[idx].Unknowns)) + } + } + + fmt.Printf("The PSBT contains the following proposal:\n\n\t"+ + "Close %d channels: \n", len(packet.Inputs)) + var totalInput int64 + for idx, txIn := range packet.UnsignedTx.TxIn { + value := packet.Inputs[idx].WitnessUtxo.Value + totalInput += value + fmt.Printf("\tChannel %d (%s:%d), capacity %d sats\n", + idx, txIn.PreviousOutPoint.Hash.String(), + txIn.PreviousOutPoint.Index, value) + } + fmt.Println() + var totalOutput int64 + for _, txOut := range packet.UnsignedTx.TxOut { + totalOutput += txOut.Value + pkScript, err := txscript.ParsePkScript(txOut.PkScript) + if err != nil { + return fmt.Errorf("error parsing pk script: %v", err) + } + addr, err := pkScript.Address(chainParams) + if err != nil { + return fmt.Errorf("error parsing address: %v", err) + } + fmt.Printf("\tSend %d sats to address %s\n", txOut.Value, addr) + } + fmt.Printf("\n\tTotal fees: %d sats\n\nDo you want to continue?\n", + totalInput-totalOutput) + fmt.Printf("Press to continue and sign the transaction or " + + " to abort: ") + _, _ = bufio.NewReader(os.Stdin).ReadString('\n') + + for idx := range packet.Inputs { + unknown := packet.Inputs[idx].Unknowns[0] + if !bytes.Equal(unknown.Key, PsbtKeyTypeOutputMissingSigPubkey) { + return fmt.Errorf("invalid PSBT, unknown has invalid "+ + "key %x, expected %x", unknown.Key, + PsbtKeyTypeOutputMissingSigPubkey) + } + targetKey, err := btcec.ParsePubKey(unknown.Value, btcec.S256()) + if err != nil { + return fmt.Errorf("invalid PSBT, proprietary key has "+ + "invalid pubkey: %v", err) + } + + // Now we can look up the local key and check the PSBT further, + // then add our signature. + localKeyDesc, err := findLocalMultisigKey( + localMultisig, targetKey, + ) + if err != nil { + return fmt.Errorf("could not find local multisig key: "+ + "%v", err) + } + if len(packet.Inputs[idx].WitnessScript) == 0 { + return fmt.Errorf("invalid PSBT, missing witness " + + "script") + } + witnessScript := packet.Inputs[idx].WitnessScript + if packet.Inputs[idx].WitnessUtxo == nil { + return fmt.Errorf("invalid PSBT, witness UTXO missing") + } + utxo := packet.Inputs[idx].WitnessUtxo + + err = signer.AddPartialSignature( + packet, *localKeyDesc, utxo, witnessScript, idx, + ) + if err != nil { + return fmt.Errorf("error adding partial signature: %v", + err) + } + } + + // We're almost done. Now we just need to make sure we can finalize and + // extract the final TX. + err = psbt.MaybeFinalizeAll(packet) + if err != nil { + return fmt.Errorf("error finalizing PSBT: %v", err) + } + finalTx, err := psbt.Extract(packet) + if err != nil { + return fmt.Errorf("unable to extract final TX: %v", err) + } + var buf bytes.Buffer + err = finalTx.Serialize(&buf) + if err != nil { + return fmt.Errorf("unable to serialize final TX: %v", err) + } + + fmt.Printf("Success, we counter signed the PSBT and extracted the "+ + "final\ntransaction. Please publish this using any bitcoin "+ + "node:\n\n%x\n\n", buf.Bytes()) + + return nil +} diff --git a/doc/chantools.md b/doc/chantools.md index bbd34b1..fcd69c4 100644 --- a/doc/chantools.md +++ b/doc/chantools.md @@ -40,4 +40,5 @@ Complete documentation is available at https://github.com/guggero/chantools/. * [chantools sweeptimelockmanual](chantools_sweeptimelockmanual.md) - Sweep the force-closed state of a single channel manually if only a channel backup file is available * [chantools vanitygen](chantools_vanitygen.md) - Generate a seed with a custom lnd node identity public key that starts with the given prefix * [chantools walletinfo](chantools_walletinfo.md) - Shows info about an lnd wallet.db file and optionally extracts the BIP32 HD root key +* [chantools zombierecovery](chantools_zombierecovery.md) - Try rescuing funds stuck in channels with zombie nodes diff --git a/doc/chantools_derivekey.md b/doc/chantools_derivekey.md index a75ea92..d14279f 100644 --- a/doc/chantools_derivekey.md +++ b/doc/chantools_derivekey.md @@ -15,7 +15,7 @@ chantools derivekey [flags] ``` chantools derivekey --path "m/1017'/0'/5'/0/0'" \ - --neuter + --neuter chantools derivekey --identity ``` diff --git a/doc/chantools_rescuefunding.md b/doc/chantools_rescuefunding.md index b6bd9f2..bdc54dd 100644 --- a/doc/chantools_rescuefunding.md +++ b/doc/chantools_rescuefunding.md @@ -36,7 +36,7 @@ chantools rescuefunding \ --channeldb string lnd channel.db file to rescue a channel from; must contain the pending channel specified with --channelpoint --channelpoint string funding transaction outpoint of the channel to rescue (:) as it is recorded in the DB --confirmedchannelpoint string channel outpoint that got confirmed on chain (:); normally this is the same as the --channelpoint so it will be set to that value ifthis is left empty - --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 2) + --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 30) -h, --help help for rescuefunding --rootkey string BIP32 HD root key of the wallet to use for deriving keys; leave empty to prompt for lnd 24 word aezeed --sweepaddr string address to sweep the funds to diff --git a/doc/chantools_sweeptimelock.md b/doc/chantools_sweeptimelock.md index 9e2e8fc..d12317c 100644 --- a/doc/chantools_sweeptimelock.md +++ b/doc/chantools_sweeptimelock.md @@ -30,7 +30,7 @@ chantools sweeptimelock \ ``` --apiurl string API URL to use (must be esplora compatible) (default "https://blockstream.info/api") --bip39 read a classic BIP39 seed and passphrase from the terminal instead of asking for lnd seed format or providing the --rootkey flag - --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 2) + --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 30) --fromchanneldb string channel input is in the format of an lnd channel.db file --fromsummary string channel input is in the format of chantool's channel summary; specify '-' to read from stdin -h, --help help for sweeptimelock diff --git a/doc/chantools_sweeptimelockmanual.md b/doc/chantools_sweeptimelockmanual.md index 36c81ec..ab97b67 100644 --- a/doc/chantools_sweeptimelockmanual.md +++ b/doc/chantools_sweeptimelockmanual.md @@ -36,7 +36,7 @@ chantools sweeptimelockmanual \ ``` --apiurl string API URL to use (must be esplora compatible) (default "https://blockstream.info/api") --bip39 read a classic BIP39 seed and passphrase from the terminal instead of asking for lnd seed format or providing the --rootkey flag - --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 2) + --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 30) --fromchanneldb string channel input is in the format of an lnd channel.db file --fromsummary string channel input is in the format of chantool's channel summary; specify '-' to read from stdin -h, --help help for sweeptimelockmanual diff --git a/doc/chantools_zombierecovery.md b/doc/chantools_zombierecovery.md new file mode 100644 index 0000000..322db7a --- /dev/null +++ b/doc/chantools_zombierecovery.md @@ -0,0 +1,37 @@ +## chantools zombierecovery + +Try rescuing funds stuck in channels with zombie nodes + +### Synopsis + +A sub command that hosts a set of further sub commands +to help with recovering funds tuck in zombie channels. + +Please visit https://github.com/guggero/chantools/blob/master/doc/zombierecovery.md +for more information on how to use these commands. + +``` +chantools zombierecovery [flags] +``` + +### Options + +``` + -h, --help help for zombierecovery +``` + +### Options inherited from parent commands + +``` + -r, --regtest Indicates if regtest parameters should be used + -t, --testnet Indicates if testnet parameters should be used +``` + +### SEE ALSO + +* [chantools](chantools.md) - Chantools helps recover funds from lightning channels +* [chantools zombierecovery findmatches](chantools_zombierecovery_findmatches.md) - [0/3] Match maker only: Find matches between registered nodes +* [chantools zombierecovery makeoffer](chantools_zombierecovery_makeoffer.md) - [2/3] Make an offer on how to split the funds to recover +* [chantools zombierecovery preparekeys](chantools_zombierecovery_preparekeys.md) - [1/3] Prepare all public keys for a recovery attempt +* [chantools zombierecovery signoffer](chantools_zombierecovery_signoffer.md) - [3/3] Sign an offer sent by the remote peer to recover funds + diff --git a/doc/chantools_zombierecovery_findmatches.md b/doc/chantools_zombierecovery_findmatches.md new file mode 100644 index 0000000..b0d0321 --- /dev/null +++ b/doc/chantools_zombierecovery_findmatches.md @@ -0,0 +1,45 @@ +## chantools zombierecovery findmatches + +[0/3] Match maker only: Find matches between registered nodes + +### Synopsis + +Match maker only: Runs through all the nodes that have +registered their ID on https://www.node-recovery.com and checks whether there +are any matches of channels between them by looking at the whole channel graph. + +This command will be run by guggero and the result will be sent to the +registered nodes. + +``` +chantools zombierecovery findmatches [flags] +``` + +### Examples + +``` +chantools zombierecovery findmatches \ + --registrations data.txt \ + --channel_graph lncli_describegraph.json +``` + +### Options + +``` + --apiurl string API URL to use (must be esplora compatible) (default "https://blockstream.info/api") + --channel_graph string the full LN channel graph in the JSON format that the 'lncli describegraph' returns + -h, --help help for findmatches + --registrations string the raw data.txt where the registrations are stored in +``` + +### Options inherited from parent commands + +``` + -r, --regtest Indicates if regtest parameters should be used + -t, --testnet Indicates if testnet parameters should be used +``` + +### SEE ALSO + +* [chantools zombierecovery](chantools_zombierecovery.md) - Try rescuing funds stuck in channels with zombie nodes + diff --git a/doc/chantools_zombierecovery_makeoffer.md b/doc/chantools_zombierecovery_makeoffer.md new file mode 100644 index 0000000..a5367a2 --- /dev/null +++ b/doc/chantools_zombierecovery_makeoffer.md @@ -0,0 +1,49 @@ +## chantools zombierecovery makeoffer + +[2/3] Make an offer on how to split the funds to recover + +### Synopsis + +After both parties have prepared their keys with the +'preparekeys' command and have exchanged the files generated from that step, +one party has to create an offer on how to split the funds that are in the +channels to be rescued. +If the other party agrees with the offer, they can sign and publish the offer +with the 'signoffer' command. If the other party does not agree, they can create +a counter offer. + +``` +chantools zombierecovery makeoffer [flags] +``` + +### Examples + +``` +chantools zombierecovery makeoffer \ + --node1_keys preparedkeys-xxxx-xx-xx-.json \ + --node2_keys preparedkeys-xxxx-xx-xx-.json \ + --feerate 15 +``` + +### Options + +``` + --bip39 read a classic BIP39 seed and passphrase from the terminal instead of asking for lnd seed format or providing the --rootkey flag + --feerate uint16 fee rate to use for the sweep transaction in sat/vByte (default 30) + -h, --help help for makeoffer + --node1_keys string the JSON file generated in theprevious step ('preparekeys') command of node 1 + --node2_keys string the JSON file generated in theprevious step ('preparekeys') command of node 2 + --rootkey string BIP32 HD root key of the wallet to use for signing the offer; leave empty to prompt for lnd 24 word aezeed +``` + +### Options inherited from parent commands + +``` + -r, --regtest Indicates if regtest parameters should be used + -t, --testnet Indicates if testnet parameters should be used +``` + +### SEE ALSO + +* [chantools zombierecovery](chantools_zombierecovery.md) - Try rescuing funds stuck in channels with zombie nodes + diff --git a/doc/chantools_zombierecovery_preparekeys.md b/doc/chantools_zombierecovery_preparekeys.md new file mode 100644 index 0000000..608f110 --- /dev/null +++ b/doc/chantools_zombierecovery_preparekeys.md @@ -0,0 +1,45 @@ +## chantools zombierecovery preparekeys + +[1/3] Prepare all public keys for a recovery attempt + +### Synopsis + +Takes a match file, validates it against the seed and +then adds the first 2500 multisig pubkeys to it. +This must be run by both parties of a channel for a successful recovery. The +next step (makeoffer) takes two such key enriched files and tries to find the +correct ones for the matched channels. + +``` +chantools zombierecovery preparekeys [flags] +``` + +### Examples + +``` +chantools zombierecovery preparekeys \ + --match_file match-xxxx-xx-xx--.json \ + --payout_addr bc1q... +``` + +### Options + +``` + --bip39 read a classic BIP39 seed and passphrase from the terminal instead of asking for lnd seed format or providing the --rootkey flag + -h, --help help for preparekeys + --match_file string the match JSON file that was sent to both nodes by the match maker + --payout_addr string the address where this node's rescued funds should be sent to, must be a P2WPKH (native SegWit) address + --rootkey string BIP32 HD root key of the wallet to use for deriving the multisig keys; leave empty to prompt for lnd 24 word aezeed +``` + +### Options inherited from parent commands + +``` + -r, --regtest Indicates if regtest parameters should be used + -t, --testnet Indicates if testnet parameters should be used +``` + +### SEE ALSO + +* [chantools zombierecovery](chantools_zombierecovery.md) - Try rescuing funds stuck in channels with zombie nodes + diff --git a/doc/chantools_zombierecovery_signoffer.md b/doc/chantools_zombierecovery_signoffer.md new file mode 100644 index 0000000..e082bdf --- /dev/null +++ b/doc/chantools_zombierecovery_signoffer.md @@ -0,0 +1,35 @@ +## chantools zombierecovery signoffer + +[3/3] Sign an offer sent by the remote peer to recover funds + +``` +chantools zombierecovery signoffer [flags] +``` + +### Examples + +``` +chantools zombierecovery signoffer \ + --psbt +``` + +### Options + +``` + --bip39 read a classic BIP39 seed and passphrase from the terminal instead of asking for lnd seed format or providing the --rootkey flag + -h, --help help for signoffer + --psbt string the base64 encoded PSBT that the other party sent as an offer to rescue funds + --rootkey string BIP32 HD root key of the wallet to use for signing the offer; leave empty to prompt for lnd 24 word aezeed +``` + +### Options inherited from parent commands + +``` + -r, --regtest Indicates if regtest parameters should be used + -t, --testnet Indicates if testnet parameters should be used +``` + +### SEE ALSO + +* [chantools zombierecovery](chantools_zombierecovery.md) - Try rescuing funds stuck in channels with zombie nodes + diff --git a/doc/rescue-flow.plantuml b/doc/rescue-flow.plantuml index 5b27c08..5d47a43 100644 --- a/doc/rescue-flow.plantuml +++ b/doc/rescue-flow.plantuml @@ -24,6 +24,7 @@ if "Pending/Open\nchannels left?" then else -->[no] ===MANUAL=== --> "11: Manual intervention necessary" + --> "12: Use Zombie Channel Recovery Matcher" --> (*) endif else diff --git a/doc/rescue-flow.png b/doc/rescue-flow.png index 7a66e0c46dd025e11a49a03a427b910aa48b2d4d..ab8eec124b021f3cf827adf9ddf5a1eb2e6255f5 100644 GIT binary patch literal 76076 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 eB^X9Dz8IDHFS4Y