-
Notifications
You must be signed in to change notification settings - Fork 44
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(rpc): RestoreNode call to restore from seed
This adds a new `RestoreNode` call that accepts a 24 word seed mnemonic to restore an xud key, lnd wallets, and a raiden keystore from the seed. This call can be extended to also restore lnd channel backups and xud db backups with additional parameters. The seedutil tool is extended to support an `encipher` subcommand that converts a mnemonic to the enciphered seed bytes, which is necessary for deriving an xud key from aezeed. Closes #1017. Closes #1020.
- Loading branch information
Showing
21 changed files
with
948 additions
and
247 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
import readline from 'readline'; | ||
import { Arguments } from 'yargs'; | ||
import { RestoreNodeRequest, RestoreNodeResponse } from '../../proto/xudrpc_pb'; | ||
import { callback, loadXudInitClient } from '../command'; | ||
import { getDefaultCertPath, waitForCert } from '../utils'; | ||
|
||
export const command = 'restore'; | ||
|
||
export const describe = 'restore an xud instance from seed'; | ||
|
||
export const builder = {}; | ||
|
||
const formatOutput = (response: RestoreNodeResponse.AsObject) => { | ||
let walletRestoredMessage = 'The following wallets were restored: '; | ||
|
||
if (response.restoredLndsList.length) { | ||
walletRestoredMessage += response.restoredLndsList.join(', '); | ||
} | ||
|
||
if (response.restoredRaiden) { | ||
if (!walletRestoredMessage.endsWith(' ')) { | ||
walletRestoredMessage += ', '; | ||
} | ||
|
||
walletRestoredMessage += 'ERC20(ETH)'; | ||
} | ||
|
||
console.log(walletRestoredMessage); | ||
}; | ||
|
||
export const handler = (argv: Arguments<any>) => { | ||
const rl = readline.createInterface({ | ||
input: process.stdin, | ||
output: process.stdout, | ||
terminal: true, | ||
}); | ||
|
||
console.log(` | ||
You are restoring an xud node key and underlying wallets. All will be secured by | ||
a single password provided below. | ||
`); | ||
rl.question('Enter your 24 word mnemonic separated by spaces: ', (mnemonicStr) => { | ||
rl.close(); | ||
const rlQuiet = readline.createInterface({ | ||
input: process.stdin, | ||
terminal: true, | ||
}); | ||
const mnemonic = mnemonicStr.split(' '); | ||
if (mnemonic.length !== 24) { | ||
console.error('Mnemonic must be exactly 24 words'); | ||
process.exitCode = 1; | ||
return; | ||
} | ||
process.stdout.write('Enter a password: '); | ||
rlQuiet.question('', (password1) => { | ||
process.stdout.write('\nRe-enter password: '); | ||
rlQuiet.question('', async (password2) => { | ||
process.stdout.write('\n\n'); | ||
rlQuiet.close(); | ||
if (password1 === password2) { | ||
const request = new RestoreNodeRequest(); | ||
request.setPassword(password1); | ||
request.setSeedMnemonicList(mnemonic); | ||
|
||
const certPath = argv.tlscertpath ? argv.tlscertpath : getDefaultCertPath(); | ||
try { | ||
await waitForCert(certPath); | ||
} catch (err) { | ||
console.error(err); | ||
process.exitCode = 1; | ||
return; | ||
} | ||
|
||
const client = loadXudInitClient(argv); | ||
// wait up to 3 seconds for rpc server to listen before call in case xud was just started | ||
client.waitForReady(Date.now() + 3000, () => { | ||
client.restoreNode(request, callback(argv, formatOutput)); | ||
}); | ||
} else { | ||
process.exitCode = 1; | ||
console.error('Passwords do not match, please try again'); | ||
} | ||
}); | ||
}); | ||
}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.