Skip to main content

SignCoordinatorStreams

SignCoordinatorStreams dispatches a bi-directional streaming RPC that allows a remote signer to connect to a watch-only node and remotely provide signatures and ECDH results on demand.

Source: watchonlyrpc/watchonly.proto

gRPC

info

This is a bidirectional-streaming RPC

rpc SignCoordinatorStreams (stream SignCoordinatorResponse) returns (stream SignCoordinatorRequest);

REST

HTTP MethodPath
POST /v2/watchonly/stream

Code Samples

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', 'watchonlyrpc/watchonly.proto'], loaderOptions);
const watchonlyrpc = grpc.loadPackageDefinition(packageDefinition).watchonlyrpc;
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 watchonlyrpc.WatchOnly(GRPC_HOST, creds);
let request = {
ref_request_id: <uint64>,
signer_registration: <SignerRegistration>,
pong: <bool>,
shared_key_response: <SharedKeyResponse>,
sign_message_resp: <SignMessageResp>,
mu_sig2_session_response: <MuSig2SessionResponse>,
mu_sig2_register_nonces_response: <MuSig2RegisterNoncesResponse>,
mu_sig2_comb_nonces_resp: <MuSig2RegisterCombinedNonceResponse>,
mu_sig2_get_comb_nonces_resp: <MuSig2GetCombinedNonceResponse>,
mu_sig2_sign_response: <MuSig2SignResponse>,
mu_sig2_combine_sig_response: <MuSig2CombineSigResponse>,
mu_sig2_cleanup_response: <MuSig2CleanupResponse>,
sign_psbt_response: <SignPsbtResponse>,
signer_error: <SignerError>,
};
let call = client.signCoordinatorStreams({});
call.on('data', function(response) {
// A response was received from the server.
console.log(response);
});
call.on('status', function(status) {
// The current status of the stream.
});
call.on('end', function() {
// The server has closed the stream.
});
call.write(request);
// Console output:
// {
// "request_id": <uint64>,
// "registration_response": <RegistrationResponse>,
// "ping": <bool>,
// "shared_key_request": <SharedKeyRequest>,
// "sign_message_req": <SignMessageReq>,
// "mu_sig2_session_request": <MuSig2SessionRequest>,
// "mu_sig2_register_nonces_request": <MuSig2RegisterNoncesRequest>,
// "mu_sig2_combined_nonces_req": <MuSig2RegisterCombinedNonceRequest>,
// "mu_sig2_get_combined_nonces_req": <MuSig2GetCombinedNonceRequest>,
// "mu_sig2_sign_request": <MuSig2SignRequest>,
// "mu_sig2_combine_sig_request": <MuSig2CombineSigRequest>,
// "mu_sig2_cleanup_request": <MuSig2CleanupRequest>,
// "sign_psbt_request": <SignPsbtRequest>,
// }

Messages

watchonlyrpc.SignCoordinatorResponse

Source: watchonlyrpc/watchonly.proto

FieldgRPC TypeREST TypeREST Placement
ref_request_id
uint64stringbody
signer_registration
SignerRegistrationobjectbody
pong
boolbooleanbody
shared_key_response
SharedKeyResponseobjectbody
sign_message_resp
SignMessageRespobjectbody
mu_sig2_session_response
MuSig2SessionResponseobjectbody
mu_sig2_register_nonces_response
MuSig2RegisterNoncesResponseobjectbody
mu_sig2_comb_nonces_resp
MuSig2RegisterCombinedNonceResponseobjectbody
mu_sig2_get_comb_nonces_resp
MuSig2GetCombinedNonceResponseobjectbody
mu_sig2_sign_response
MuSig2SignResponseobjectbody
mu_sig2_combine_sig_response
MuSig2CombineSigResponseobjectbody
mu_sig2_cleanup_response
MuSig2CleanupResponseobjectbody
sign_psbt_response
SignPsbtResponseobjectbody
signer_error
SignerErrorobjectbody

watchonlyrpc.SignCoordinatorRequest

Source: watchonlyrpc/watchonly.proto

FieldgRPC TypeREST Type
request_id
uint64string
registration_response
RegistrationResponseobject
ping
boolboolean
shared_key_request
SharedKeyRequestobject
sign_message_req
SignMessageReqobject
mu_sig2_session_request
MuSig2SessionRequestobject
mu_sig2_register_nonces_request
MuSig2RegisterNoncesRequestobject
mu_sig2_combined_nonces_req
MuSig2RegisterCombinedNonceRequestobject
mu_sig2_get_combined_nonces_req
MuSig2GetCombinedNonceRequestobject
mu_sig2_sign_request
MuSig2SignRequestobject
mu_sig2_combine_sig_request
MuSig2CombineSigRequestobject
mu_sig2_cleanup_request
MuSig2CleanupRequestobject
sign_psbt_request
SignPsbtRequestobject

Nested Messages

signrpc.KeyDescriptor

FieldgRPC TypeREST Type
raw_key_bytes
bytesstring
key_loc
KeyLocatorobject

signrpc.KeyLocator

FieldgRPC TypeREST Type
key_family
int32integer
key_index
int32integer

signrpc.MuSig2CleanupRequest

FieldgRPC TypeREST Type
session_id
bytesstring

signrpc.MuSig2CleanupResponse

note

This response has no parameters.

signrpc.MuSig2CombineSigRequest

FieldgRPC TypeREST Type
session_id
bytesstring
other_partial_signatures
bytes[]array

signrpc.MuSig2CombineSigResponse

FieldgRPC TypeREST Type
have_all_signatures
boolboolean
final_signature
bytesstring

signrpc.MuSig2GetCombinedNonceRequest

FieldgRPC TypeREST Type
session_id
bytesstring

signrpc.MuSig2GetCombinedNonceResponse

FieldgRPC TypeREST Type
combined_public_nonce
bytesstring

signrpc.MuSig2RegisterCombinedNonceRequest

FieldgRPC TypeREST Type
session_id
bytesstring
combined_public_nonce
bytesstring

signrpc.MuSig2RegisterCombinedNonceResponse

note

This response has no parameters.

signrpc.MuSig2RegisterNoncesRequest

FieldgRPC TypeREST Type
session_id
bytesstring
other_signer_public_nonces
bytes[]array

signrpc.MuSig2RegisterNoncesResponse

FieldgRPC TypeREST Type
have_all_nonces
boolboolean

signrpc.MuSig2SessionRequest

FieldgRPC TypeREST Type
key_loc
KeyLocatorobject
all_signer_pubkeys
bytes[]array
other_signer_public_nonces
bytes[]array
tweaks
TweakDesc[]array
taproot_tweak
TaprootTweakDescobject
version
MuSig2Versionstring
pregenerated_local_nonce
bytesstring

signrpc.MuSig2SessionResponse

FieldgRPC TypeREST Type
session_id
bytesstring
combined_key
bytesstring
taproot_internal_key
bytesstring
local_public_nonces
bytesstring
have_all_nonces
boolboolean
version
MuSig2Versionstring

signrpc.MuSig2SignRequest

FieldgRPC TypeREST Type
session_id
bytesstring
message_digest
bytesstring
cleanup
boolboolean

signrpc.MuSig2SignResponse

FieldgRPC TypeREST Type
local_partial_signature
bytesstring

signrpc.SharedKeyRequest

FieldgRPC TypeREST Type
ephemeral_pubkey
bytesstring
key_locdeprecated
KeyLocatorobject
key_desc
KeyDescriptorobject

signrpc.SharedKeyResponse

FieldgRPC TypeREST Type
shared_key
bytesstring

signrpc.SignMessageReq

FieldgRPC TypeREST Type
msg
bytesstring
key_loc
KeyLocatorobject
double_hash
boolboolean
compact_sig
boolboolean
schnorr_sig
boolboolean
schnorr_sig_tap_tweak
bytesstring
tag
bytesstring

signrpc.SignMessageResp

FieldgRPC TypeREST Type
signature
bytesstring

signrpc.TaprootTweakDesc

FieldgRPC TypeREST Type
script_root
bytesstring
key_spend_only
boolboolean

signrpc.TweakDesc

FieldgRPC TypeREST Type
tweak
bytesstring
is_x_only
boolboolean

walletrpc.SignPsbtRequest

FieldgRPC TypeREST Type
funded_psbt
bytesstring

walletrpc.SignPsbtResponse

FieldgRPC TypeREST Type
signed_psbt
bytesstring
signed_inputs
uint32[]array

watchonlyrpc.RegistrationComplete

FieldgRPC TypeREST Type
signature
stringstring
registration_info
stringstring

watchonlyrpc.RegistrationResponse

FieldgRPC TypeREST Type
registration_complete
RegistrationCompleteobject
registration_error
stringstring

watchonlyrpc.SignerError

FieldgRPC TypeREST Type
error
stringstring

watchonlyrpc.SignerRegistration

FieldgRPC TypeREST Type
registration_challenge
bytesstring
registration_info
stringstring

Enums

signrpc.MuSig2Version

NameNumber
MUSIG2_VERSION_UNDEFINED
0
MUSIG2_VERSION_V040
1
MUSIG2_VERSION_V100RC2
2