lightninglabs / lightninglabs/loop
I use regtest to call loopd rpc api getinfo,got:14 UNAVAILABLE: No connection established.
- Dominant language
- Go
- Stars
- 595
- Forks
- 135
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 12
Description
``` docker.compose.yml
version: "3"
services:
bitcoind:
image: ruimarinho/bitcoin-core:23
container_name: bitcoind
restart: unless-stopped
networks:
regtest:
aliases:
- bitcoind
command:
- "-txindex"
- "-regtest"
- "-rest"
- "-printtoconsole"
- "-zmqpubrawblock=tcp://0.0.0.0:28332"
- "-zmqpubrawtx=tcp://0.0.0.0:28333"
- "-rpcport=18443"
- "-rpcbind=0.0.0.0"
# This is just the hashed string "lightning" with a salt.
- "-rpcauth=lightning:8492220e715bbfdf5f165102bfd7ed4$$88090545821ed5e9db614588c0afbad575ccc14681fb77f3cae6899bc419af67"
- "-rpcallowip=0.0.0.0/0"
- "-fallbackfee=0.0002"
- "-peerblockfilters=1"
- "-blockfilterindex=1"
- "-wallet=/home/bitcoin/.bitcoin/regtest/wallets/miner"
environment:
- HOME=/home/bitcoin
volumes:
- ./bitcoind:/home/bitcoin/.bitcoin
lndserver:
image: lightninglabs/lnd:v0.17.4-beta
container_name: lndserver
restart: unless-stopped
networks:
regtest:
aliases:
- lndserver
volumes:
- "./lndserver:/root/.lnd"
depends_on:
- bitcoind
command:
- "--logdir=/root/.lnd"
- "--alias=lndserver"
- "--rpclisten=0.0.0.0:10009"
- "--noseedbackup"
- "--bitcoin.active"
- "--bitcoin.regtest"
- "--bitcoin.node=bitcoind"
- "--bitcoind.rpchost=bitcoind"
- "--bitcoind.rpcuser=lightning"
- "--bitcoind.rpcpass=lightning"
- "--bitcoind.zmqpubrawblock=tcp://bitcoind:28332"
- "--bitcoind.zmqpubrawtx=tcp://bitcoind:28333"
- "--debuglevel=debug"
- "--externalip=lndserver"
- "--tlsextradomain=lndserver"
loopserver:
image: lightninglabs/loopserver
container_name: loopserver
restart: unless-stopped
networks:
regtest:
aliases:
- loopserver
volumes:
- "./lndserver:/root/.lnd"
depends_on:
- lndserver
expose:
- "11009"
ports:
- "11009:11009"
command:
- "daemon"
- "--maxamt=5000000"
- "--lnd.host=lndserver:10009"
- "--lnd.macaroondir=/home/loopserver/"
- "--lnd.tlspath=/home/loopserver/tls.cert"
- "--bitcoin.host=bitcoind:18443"
- "--bitcoin.user=lightning"
- "--bitcoin.password=lightning"
- "--bitcoin.zmqpubrawblock=tcp://bitcoind:28332"
- "--bitcoin.zmqpubrawtx=tcp://bitcoind:28333"
lndclient:
image: lightninglabs/lnd:v0.17.4-beta
container_name: lndclient
restart: unless-stopped
networks:
regtest:
aliases:
- lndclient
volumes:
- "./lndclient:/root/.lnd"
expose:
- "8080"
- "10009"
- "9735"
ports:
- "10009:10009"
depends_on:
- bitcoind
command:
- "--logdir=/root/.lnd"
- "--alias=lndclient"
- "--rpclisten=0.0.0.0:10009"
- "--noseedbackup"
- "--bitcoin.active"
- "--bitcoin.regtest"
- "--bitcoin.node=bitcoind"
- "--bitcoind.rpchost=bitcoind"
- "--bitcoind.rpcuser=lightning"
- "--bitcoind.rpcpass=lightning"
- "--bitcoind.zmqpubrawblock=tcp://bitcoind:28332"
- "--bitcoind.zmqpubrawtx=tcp://bitcoind:28333"
- "--debuglevel=debug"
- "--externalip=lndclient"
- "--tlsextradomain=lndclient"
loopclient:
image: loopd
container_name: loopclient
build:
context: ../
dockerfile: Dockerfile
restart: unless-stopped
networks:
regtest:
aliases:
- loopclient
volumes:
- "./lndclient:/root/.lnd"
- "./lndclient/loop:/root/.loop"
expose:
- "8081"
- "11010"
ports:
- "11010:11010"
- "8081:8081"
depends_on:
- lndclient
- loopserver
command:
- "loopd"
- "--network=regtest"
- "--debuglevel=debug"
- "--server.host=loopserver:11009"
- "--server.notls"
- "--lnd.host=lndclient:10009"
- "--lnd.macaroonpath=/root/.lnd/data/chain/bitcoin/regtest/admin.macaroon"
- "--lnd.tlspath=/root/.lnd/tls.cert"
networks:
regtest:
```
```
{
host: '127.0.0.1:11010',
certFilePath: '/Users/wjl/Documents/gamichi/2024/loop/regtest/lndclient/loop/regtest/tls.cert',
macaroonFilePath: '/Users/wjl/Documents/gamichi/2024/loop/regtest/lndclient/loop/regtest/loop.macaroon'
}
const loaderOptions = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
process.env.GRPC_SSL_CIPHER_SUITES = 'HIGH+ECDSA';
const tlsCert = certFilePath ? fs.readFileSync(certFilePath) : '';
const sslCreds = grpc.credentials.createSsl(tlsCert);
if (!macaroonFilePath) {
throw new Error('macaroonFilePath is required')
}
const macaroon = fs.readFileSync(macaroonFilePath).toString('hex');
const macaroonCreds = grpc.credentials.createFromMetadataGenerator(function (args, callback) {
let metadata = new grpc.Metadata();
metadata.add('macaroon', macaroon);
callback(null, metadata);
});
let creds = grpc.credentials.combineChannelCredentials(sslCreds, macaroonCreds);
const packageDefinition = protoLoader.loadSync(protoClient, loaderOptions);
const looprpc = grpc.loadPackageDefinition(packageDefinition).looprpc;
let client = new looprpc.SwapClient(host, creds);
return client
const getInfo = () => {
return new Promise((resolve, reject) => {
client.getInfo({}, function (err, response) {
if (err) {
reject(err)
}
resolve(response)
});
})
}
❌ ~ getRepayByMessage ~ e.message: 14 UNAVAILABLE: No connection established. Last error: Client network socket disconnected before secure TLS connection was established (2024-05-20T12:11:41.245Z)
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the loopclient service in docker.compose.yml and the JavaScript SwapClient setup that calls getInfo. Check the container's exposed 11010 endpoint, TLS certificate paths, and client connection settings, then reproduce the call and use the loopclient logs to identify why the TLS connection is not established. Done means the regtest getInfo call connects successfully and returns a response.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, go, grpc, javascript
- Domain
- api, devops
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 30/100