optionnally provide an external seed
usage: `PHOENIX_SEED="focus certain canvas rude exist sausage chuckle forget bronze brown warm comic" ./phoenixd`
This commit is contained in:
		
							parent
							
								
									0432da38e5
								
							
						
					
					
						commit
						f2b378484a
					
				@ -18,12 +18,15 @@ import com.github.ajalt.clikt.sources.MapValueSource
 | 
			
		||||
import com.github.ajalt.mordant.rendering.TextColors.*
 | 
			
		||||
import com.github.ajalt.mordant.rendering.TextStyles.bold
 | 
			
		||||
import fr.acinq.bitcoin.Chain
 | 
			
		||||
import fr.acinq.bitcoin.MnemonicCode
 | 
			
		||||
import fr.acinq.lightning.BuildVersions
 | 
			
		||||
import fr.acinq.lightning.Lightning.randomBytes32
 | 
			
		||||
import fr.acinq.lightning.LiquidityEvents
 | 
			
		||||
import fr.acinq.lightning.NodeParams
 | 
			
		||||
import fr.acinq.lightning.PaymentEvents
 | 
			
		||||
import fr.acinq.lightning.bin.conf.EnvVars.PHOENIX_SEED
 | 
			
		||||
import fr.acinq.lightning.bin.conf.LSP
 | 
			
		||||
import fr.acinq.lightning.bin.conf.PhoenixSeed
 | 
			
		||||
import fr.acinq.lightning.bin.conf.getOrGenerateSeed
 | 
			
		||||
import fr.acinq.lightning.bin.conf.readConfFile
 | 
			
		||||
import fr.acinq.lightning.bin.db.SqliteChannelsDb
 | 
			
		||||
@ -47,6 +50,7 @@ import fr.acinq.lightning.payment.LiquidityPolicy
 | 
			
		||||
import fr.acinq.lightning.utils.Connection
 | 
			
		||||
import fr.acinq.lightning.utils.msat
 | 
			
		||||
import fr.acinq.lightning.utils.sat
 | 
			
		||||
import fr.acinq.lightning.utils.toByteVector
 | 
			
		||||
import fr.acinq.phoenix.db.*
 | 
			
		||||
import io.ktor.http.*
 | 
			
		||||
import io.ktor.server.application.*
 | 
			
		||||
@ -69,6 +73,17 @@ fun main(args: Array<String>) = Phoenixd()
 | 
			
		||||
 | 
			
		||||
class Phoenixd : CliktCommand() {
 | 
			
		||||
    private val confFile = datadir / "phoenix.conf"
 | 
			
		||||
    private val seed by option("--seed", help = "Manually provide a 12-words seed", hidden = true, envvar = PHOENIX_SEED)
 | 
			
		||||
        .convert { PhoenixSeed(MnemonicCode.toSeed(it, "").toByteVector(), isNew = false) }
 | 
			
		||||
        .defaultLazy {
 | 
			
		||||
            val value = getOrGenerateSeed(datadir)
 | 
			
		||||
            if (value.isNew) {
 | 
			
		||||
                terminal.print(yellow("Generating new seed..."))
 | 
			
		||||
                runBlocking { delay(500.milliseconds) }
 | 
			
		||||
                terminal.println(white("done"))
 | 
			
		||||
            }
 | 
			
		||||
            value
 | 
			
		||||
        }
 | 
			
		||||
    private val chain by option("--chain", help = "Bitcoin chain to use").choice(
 | 
			
		||||
        "mainnet" to Chain.Mainnet, "testnet" to Chain.Testnet
 | 
			
		||||
    ).default(Chain.Mainnet, defaultForHelp = "mainnet")
 | 
			
		||||
@ -155,13 +170,8 @@ class Phoenixd : CliktCommand() {
 | 
			
		||||
    @OptIn(DelicateCoroutinesApi::class)
 | 
			
		||||
    override fun run() {
 | 
			
		||||
        FileSystem.SYSTEM.createDirectories(datadir)
 | 
			
		||||
        val (seed, new) = getOrGenerateSeed(datadir)
 | 
			
		||||
        if (new) {
 | 
			
		||||
        if (seed.isNew) {
 | 
			
		||||
            runBlocking {
 | 
			
		||||
                terminal.print(yellow("Generating new seed..."))
 | 
			
		||||
                delay(500.milliseconds)
 | 
			
		||||
                terminal.println(white("done"))
 | 
			
		||||
                terminal.println()
 | 
			
		||||
                terminal.println(green("Backup"))
 | 
			
		||||
                terminal.println("This software is self-custodial, you have full control and responsibility over your funds.")
 | 
			
		||||
                terminal.println("Your 12-words seed is located in ${FileSystem.SYSTEM.canonicalize(datadir)}, ${bold(red("make sure to do a backup or you risk losing your funds"))}.")
 | 
			
		||||
@ -215,7 +225,7 @@ class Phoenixd : CliktCommand() {
 | 
			
		||||
            skipAbsoluteFeeCheck = false,
 | 
			
		||||
            maxAllowedCredit = liquidityOptions.maxFeeCredit
 | 
			
		||||
        )
 | 
			
		||||
        val keyManager = LocalKeyManager(seed, chain, lsp.swapInXpub)
 | 
			
		||||
        val keyManager = LocalKeyManager(seed.seed, chain, lsp.swapInXpub)
 | 
			
		||||
        val nodeParams = NodeParams(chain, loggerFactory, keyManager)
 | 
			
		||||
            .copy(
 | 
			
		||||
                zeroConfPeers = setOf(lsp.walletParams.trampolineNode.id),
 | 
			
		||||
 | 
			
		||||
@ -2,4 +2,5 @@ package fr.acinq.lightning.bin.conf
 | 
			
		||||
 | 
			
		||||
object EnvVars {
 | 
			
		||||
    const val PHOENIX_DATADIR = "PHOENIX_DATADIR"
 | 
			
		||||
    const val PHOENIX_SEED = "PHOENIX_SEED"
 | 
			
		||||
}
 | 
			
		||||
@ -1,18 +1,21 @@
 | 
			
		||||
package fr.acinq.lightning.bin.conf
 | 
			
		||||
 | 
			
		||||
import fr.acinq.bitcoin.ByteVector
 | 
			
		||||
import fr.acinq.bitcoin.ByteVector32
 | 
			
		||||
import fr.acinq.bitcoin.MnemonicCode
 | 
			
		||||
import fr.acinq.lightning.Lightning.randomBytes
 | 
			
		||||
import fr.acinq.lightning.utils.toByteVector
 | 
			
		||||
import okio.FileSystem
 | 
			
		||||
import okio.Path
 | 
			
		||||
 | 
			
		||||
data class PhoenixSeed(val seed: ByteVector, val isNew: Boolean)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @return a pair with the seed and a boolean indicating whether the seed was newly generated
 | 
			
		||||
 */
 | 
			
		||||
fun getOrGenerateSeed(dir: Path): Pair<ByteVector, Boolean> {
 | 
			
		||||
fun getOrGenerateSeed(dir: Path): PhoenixSeed {
 | 
			
		||||
    val file = dir / "seed.dat"
 | 
			
		||||
    val (mnemonics, new) = if (FileSystem.SYSTEM.exists(file)) {
 | 
			
		||||
    val (mnemonics, isNew) = if (FileSystem.SYSTEM.exists(file)) {
 | 
			
		||||
        FileSystem.SYSTEM.read(file) { readUtf8() } to false
 | 
			
		||||
    } else {
 | 
			
		||||
        val entropy = randomBytes(16)
 | 
			
		||||
@ -20,5 +23,5 @@ fun getOrGenerateSeed(dir: Path): Pair<ByteVector, Boolean> {
 | 
			
		||||
        FileSystem.SYSTEM.write(file) { writeUtf8(mnemonics) }
 | 
			
		||||
        mnemonics to true
 | 
			
		||||
    }
 | 
			
		||||
    return MnemonicCode.toSeed(mnemonics, "").toByteVector() to new
 | 
			
		||||
    return PhoenixSeed(seed = MnemonicCode.toSeed(mnemonics, "").toByteVector(), isNew = isNew)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user