multi: add a rpc endpoint to track the recovery process
This commit is contained in:
1 parent
c1ef5bb908
commit
987edc9d81
17 files changed
+1182
-613
No files matched your search
@@ -817,6 +817,105 @@ const (
|
||||
AddrTypeNestedPubkeyHash = lnrpc.AddressType_NESTED_PUBKEY_HASH
|
||||
)
|
||||
|
||||
// testGetRecoveryInfo checks whether lnd gives the right information about
|
||||
// the wallet recovery process.
|
||||
func testGetRecoveryInfo(net *lntest.NetworkHarness, t *harnessTest) {
|
||||
ctxb := context.Background()
|
||||
|
||||
// First, create a new node with strong passphrase and grab the mnemonic
|
||||
// used for key derivation. This will bring up Carol with an empty
|
||||
// wallet, and such that she is synced up.
|
||||
password := []byte("The Magic Words are Squeamish Ossifrage")
|
||||
carol, mnemonic, err := net.NewNodeWithSeed("Carol", nil, password)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to create node with seed; %v", err)
|
||||
}
|
||||
|
||||
shutdownAndAssert(net, t, carol)
|
||||
|
||||
checkInfo := func(expectedRecoveryMode, expectedRecoveryFinished bool,
|
||||
expectedProgress float64, recoveryWindow int32) {
|
||||
|
||||
// Restore Carol, passing in the password, mnemonic, and
|
||||
// desired recovery window.
|
||||
node, err := net.RestoreNodeWithSeed(
|
||||
"Carol", nil, password, mnemonic, recoveryWindow, nil,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to restore node: %v", err)
|
||||
}
|
||||
|
||||
// Wait for Carol to sync to the chain.
|
||||
_, minerHeight, err := net.Miner.Node.GetBestBlock()
|
||||
if err != nil {
|
||||
t.Fatalf("unable to get current blockheight %v", err)
|
||||
}
|
||||
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
|
||||
err = waitForNodeBlockHeight(ctxt, node, minerHeight)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to sync to chain: %v", err)
|
||||
}
|
||||
|
||||
// Query carol for her current wallet recovery progress.
|
||||
var (
|
||||
recoveryMode bool
|
||||
recoveryFinished bool
|
||||
progress float64
|
||||
)
|
||||
|
||||
err = wait.Predicate(func() bool {
|
||||
// Verify that recovery info gives the right response.
|
||||
req := &lnrpc.GetRecoveryInfoRequest{}
|
||||
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
|
||||
resp, err := node.GetRecoveryInfo(ctxt, req)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to query recovery info: %v", err)
|
||||
}
|
||||
|
||||
recoveryMode = resp.RecoveryMode
|
||||
recoveryFinished = resp.RecoveryFinished
|
||||
progress = resp.Progress
|
||||
|
||||
if recoveryMode != expectedRecoveryMode ||
|
||||
recoveryFinished != expectedRecoveryFinished ||
|
||||
progress != expectedProgress {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}, 15*time.Second)
|
||||
if err != nil {
|
||||
t.Fatalf("expected recovery mode to be %v, got %v, "+
|
||||
"expected recovery finished to be %v, got %v, "+
|
||||
"expected progress %v, got %v",
|
||||
expectedRecoveryMode, recoveryMode,
|
||||
expectedRecoveryFinished, recoveryFinished,
|
||||
expectedProgress, progress,
|
||||
)
|
||||
}
|
||||
|
||||
// Lastly, shutdown this Carol so we can move on to the next
|
||||
// restoration.
|
||||
shutdownAndAssert(net, t, node)
|
||||
}
|
||||
|
||||
// Restore Carol with a recovery window of 0. Since it's not in recovery
|
||||
// mode, the recovery info will give a response with recoveryMode=false,
|
||||
// recoveryFinished=false, and progress=0
|
||||
checkInfo(false, false, 0, 0)
|
||||
|
||||
// Change the recovery windown to be 1 to turn on recovery mode. Since the
|
||||
// current chain height is the same as the birthday height, it should
|
||||
// indicate the recovery process is finished.
|
||||
checkInfo(true, true, 1, 1)
|
||||
|
||||
// We now go ahead 5 blocks. Because the wallet's syncing process is
|
||||
// controlled by a goroutine in the background, it will catch up quickly.
|
||||
// This makes the recovery progress back to 1.
|
||||
mineBlocks(t, net, 5, 0)
|
||||
checkInfo(true, true, 1, 1)
|
||||
}
|
||||
|
||||
// testOnchainFundRecovery checks lnd's ability to rescan for onchain outputs
|
||||
// when providing a valid aezeed that owns outputs on the chain. This test
|
||||
// performs multiple restorations using the same seed and various recovery
|
||||
@@ -14430,6 +14529,10 @@ var testsCases = []*testCase{
|
||||
name: "sweep coins",
|
||||
test: testSweepAllCoins,
|
||||
},
|
||||
{
|
||||
name: "recovery info",
|
||||
test: testGetRecoveryInfo,
|
||||
},
|
||||
{
|
||||
name: "onchain fund recovery",
|
||||
test: testOnchainFundRecovery,
|
||||
|
||||
Reference in new issue
Block a user