AddTower
AddTower adds a new watchtower reachable at the given address and considers it for new sessions. If the watchtower already exists, then any new addresses included will be considered when dialing it for session negotiations and backups.
Source: wtclientrpc/wtclient.proto
gRPC
rpc AddTower (AddTowerRequest) returns (AddTowerResponse);
REST
HTTP Method | Path |
---|---|
POST | /v2/watchtower/client |
Code Samples
- gRPC
- REST
- Shell
- Javascript
- Python
const fs = require('fs');
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const GRPC_HOST = 'localhost:10009'
const MACAROON_PATH = 'LND_DIR/data/chain/bitcoin/regtest/admin.macaroon'
const TLS_PATH = 'LND_DIR/tls.cert'
const loaderOptions = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
const packageDefinition = protoLoader.loadSync(['lightning.proto', 'wtclientrpc/wtclient.proto'], loaderOptions);
const wtclientrpc = grpc.loadPackageDefinition(packageDefinition).wtclientrpc;
process.env.GRPC_SSL_CIPHER_SUITES = 'HIGH+ECDSA';
const tlsCert = fs.readFileSync(TLS_PATH);
const sslCreds = grpc.credentials.createSsl(tlsCert);
const macaroon = fs.readFileSync(MACAROON_PATH).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);
let client = new wtclientrpc.WatchtowerClient(GRPC_HOST, creds);
let request = {
pubkey: <bytes>,
address: <string>,
};
client.addTower(request, function(err, response) {
console.log(response);
});
// Console output:
// {
// }
import codecs, grpc, os
# Generate the following 2 modules by compiling the wtclientrpc/wtclient.proto with the grpcio-tools.
# See https://github.com/lightningnetwork/lnd/blob/master/docs/grpc/python.md for instructions.
import wtclient_pb2 as wtclientrpc, wtclient_pb2_grpc as wtclientstub
GRPC_HOST = 'localhost:10009'
MACAROON_PATH = 'LND_DIR/data/chain/bitcoin/regtest/admin.macaroon'
TLS_PATH = 'LND_DIR/tls.cert'
# create macaroon credentials
macaroon = codecs.encode(open(MACAROON_PATH, 'rb').read(), 'hex')
def metadata_callback(context, callback):
callback([('macaroon', macaroon)], None)
auth_creds = grpc.metadata_call_credentials(metadata_callback)
# create SSL credentials
os.environ['GRPC_SSL_CIPHER_SUITES'] = 'HIGH+ECDSA'
cert = open(TLS_PATH, 'rb').read()
ssl_creds = grpc.ssl_channel_credentials(cert)
# combine macaroon and SSL credentials
combined_creds = grpc.composite_channel_credentials(ssl_creds, auth_creds)
# make the request
channel = grpc.secure_channel(GRPC_HOST, combined_creds)
stub = wtclientstub.WatchtowerClientStub(channel)
request = wtclientrpc.AddTowerRequest(
pubkey=<bytes>,
address=<string>,
)
response = stub.AddTower(request)
print(response)
# {
# }
- Javascript
- Python
const fs = require('fs');
const request = require('request');
const REST_HOST = 'localhost:8080'
const MACAROON_PATH = 'LND_DIR/data/chain/bitcoin/regtest/admin.macaroon'
let requestBody = {
pubkey: <string>, // <bytes> (base64 encoded)
address: <string>, // <string>
};
let options = {
url: `https://${REST_HOST}/v2/watchtower/client`,
// Work-around for self-signed certificates.
rejectUnauthorized: false,
json: true,
headers: {
'Grpc-Metadata-macaroon': fs.readFileSync(MACAROON_PATH).toString('hex'),
},
form: JSON.stringify(requestBody),
}
request.post(options, function(error, response, body) {
console.log(body);
});
// Console output:
// {
// }
import base64, codecs, json, requests
REST_HOST = 'localhost:8080'
MACAROON_PATH = 'LND_DIR/data/chain/bitcoin/regtest/admin.macaroon'
TLS_PATH = 'LND_DIR/tls.cert'
url = f'https://{REST_HOST}/v2/watchtower/client'
macaroon = codecs.encode(open(MACAROON_PATH, 'rb').read(), 'hex')
headers = {'Grpc-Metadata-macaroon': macaroon}
data = {
'pubkey': base64.b64encode(<bytes>),
'address': <string>,
}
r = requests.post(url, headers=headers, data=json.dumps(data), verify=TLS_PATH)
print(r.json())
# {
# }
$ lncli wtclient add --help
NAME:
lncli wtclient add - Register a watchtower to use for future sessions/backups.
USAGE:
lncli wtclient add pubkey@address
DESCRIPTION:
If the watchtower has already been registered, then this command serves as a way of updating the watchtower with new addresses it is reachable over.
Messages
wtclientrpc.AddTowerRequest
Source: wtclientrpc/wtclient.proto
Field | gRPC Type | REST Type | REST Placement |
---|---|---|---|
pubkey | bytes | string | body |
address | string | string | body |
wtclientrpc.AddTowerResponse
Source: wtclientrpc/wtclient.proto
note
This response has no parameters.