diff --git a/lnd.go b/lnd.go index 4ead5573..d3edde16 100644 --- a/lnd.go +++ b/lnd.go @@ -153,10 +153,6 @@ type ListenerWithSignal struct { // ListenerCfg is a wrapper around custom listeners that can be passed to lnd // when calling its main method. type ListenerCfg struct { - // WalletUnlocker can be set to the listener to use for the wallet - // unlocker. If nil a regular network listener will be created. - WalletUnlocker *ListenerWithSignal - // RPCListener can be set to the listener to use for the RPC server. If // nil a regular network listener will be created. RPCListener *ListenerWithSignal diff --git a/lnrpc/Dockerfile b/lnrpc/Dockerfile index c871b9b0..abe38567 100644 --- a/lnrpc/Dockerfile +++ b/lnrpc/Dockerfile @@ -11,7 +11,7 @@ RUN apt-get update && apt-get install -y \ ARG PROTOC_GEN_VERSION ARG GRPC_GATEWAY_VERSION -ENV FALAFEL_VERSION="v0.7.1" +ENV FALAFEL_VERSION="v0.8.1" ENV GOCACHE=/tmp/build/.cache ENV GOMODCACHE=/tmp/build/.modcache diff --git a/mobile/bindings.go b/mobile/bindings.go index 8cb60acb..267072fa 100644 --- a/mobile/bindings.go +++ b/mobile/bindings.go @@ -10,6 +10,7 @@ import ( flags "github.com/jessevdk/go-flags" "github.com/lightningnetwork/lnd" "github.com/lightningnetwork/lnd/signal" + "google.golang.org/grpc" ) // Start starts lnd in a new goroutine. @@ -18,14 +19,12 @@ import ( // override what is found in the config file. Example: // extraArgs = "--bitcoin.testnet --lnddir=\"/tmp/folder name/\" --profile=5050" // -// The unlockerReady callback is called when the WalletUnlocker service is -// ready, and rpcReady is called after the wallet has been unlocked and lnd is -// ready to accept RPC calls. +// The rpcReady is called lnd is ready to accept RPC calls. // // NOTE: On mobile platforms the '--lnddir` argument should be set to the // current app directory in order to ensure lnd has the permissions needed to // write to it. -func Start(extraArgs string, unlockerReady, rpcReady Callback) { +func Start(extraArgs string, rpcReady Callback) { // Split the argument string on "--" to get separated command line // arguments. var splitArgs []string @@ -62,20 +61,16 @@ func Start(extraArgs string, unlockerReady, rpcReady Callback) { return } - // Set up channels that will be notified when the RPC servers are ready - // to accept calls. + // Set a channel that will be notified when the RPC server is ready to + // accept calls. var ( - unlockerListening = make(chan struct{}) - rpcListening = make(chan struct{}) + rpcListening = make(chan struct{}) + quit = make(chan struct{}) ) - // We call the main method with the custom in-memory listeners called - // by the mobile APIs, such that the grpc server will use these. + // We call the main method with the custom in-memory listener called by + // the mobile APIs, such that the grpc server will use it. cfg := lnd.ListenerCfg{ - WalletUnlocker: &lnd.ListenerWithSignal{ - Listener: walletUnlockerLis, - Ready: unlockerListening, - }, RPCListener: &lnd.ListenerWithSignal{ Listener: lightningLis, Ready: rpcListening, @@ -85,6 +80,8 @@ func Start(extraArgs string, unlockerReady, rpcReady Callback) { // Call the "real" main in a nested manner so the defers will properly // be executed in the case of a graceful shutdown. go func() { + defer close(quit) + if err := lnd.Main( loadedConfig, cfg, shutdownInterceptor, ); err != nil { @@ -98,40 +95,37 @@ func Start(extraArgs string, unlockerReady, rpcReady Callback) { } }() - // Finally we start two go routines that will call the provided - // callbacks when the RPC servers are ready to accept calls. - go func() { - <-unlockerListening + // By default we'll apply the admin auth options, which will include + // macaroons. + setDefaultDialOption( + func() ([]grpc.DialOption, error) { + return lnd.AdminAuthOptions(loadedConfig, false) + }, + ) - // We must set the TLS certificates in order to properly - // authenticate with the wallet unlocker service. - auth, err := lnd.AdminAuthOptions(loadedConfig, true) - if err != nil { - unlockerReady.OnError(err) + // For the WalletUnlocker and StateService, the macaroons might not be + // available yet when called, so we use a more restricted set of + // options that don't include them. + setWalletUnlockerDialOption( + func() ([]grpc.DialOption, error) { + return lnd.AdminAuthOptions(loadedConfig, true) + }, + ) + setStateDialOption( + func() ([]grpc.DialOption, error) { + return lnd.AdminAuthOptions(loadedConfig, true) + }, + ) + + // Finally we start a go routine that will call the provided callback + // when the RPC server is ready to accept calls. + go func() { + select { + case <-rpcListening: + case <-quit: return } - // Add the auth options to the listener's dial options. - addWalletUnlockerLisDialOption(auth...) - - unlockerReady.OnResponse([]byte{}) - }() - - go func() { - <-rpcListening - - // Now that the RPC server is ready, we can get the needed - // authentication options, and add them to the global dial - // options. - auth, err := lnd.AdminAuthOptions(loadedConfig, false) - if err != nil { - rpcReady.OnError(err) - return - } - - // Add the auth options to the listener's dial options. - addLightningLisDialOption(auth...) - rpcReady.OnResponse([]byte{}) }() }