From 0b053e6868d374e740f31fd9ef1a126714fc4fed Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Fri, 7 Feb 2020 16:16:38 -0800 Subject: [PATCH] lndclient: expose ComputeInputScript in SignerClient --- lndclient/signer_client.go | 66 ++++++++++++++++++++++++++++++++++---- test/signer_mock.go | 7 ++++ 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/lndclient/signer_client.go b/lndclient/signer_client.go index f5cee8f..eec0621 100644 --- a/lndclient/signer_client.go +++ b/lndclient/signer_client.go @@ -17,6 +17,13 @@ type SignerClient interface { SignOutputRaw(ctx context.Context, tx *wire.MsgTx, signDescriptors []*input.SignDescriptor) ([][]byte, error) + // ComputeInputScript generates the proper input script for P2WPKH + // output and NP2WPKH outputs. This method only requires that the + // `Output`, `HashType`, `SigHashes` and `InputIndex` fields are + // populated within the sign descriptors. + ComputeInputScript(ctx context.Context, tx *wire.MsgTx, + signDescriptors []*input.SignDescriptor) ([]*input.Script, error) + // SignMessage signs a message with the key specified in the key // locator. The returned signature is fixed-size LN wire format encoded. SignMessage(ctx context.Context, msg []byte, @@ -56,13 +63,8 @@ func newSignerClient(conn *grpc.ClientConn, } } -func (s *signerClient) SignOutputRaw(ctx context.Context, tx *wire.MsgTx, - signDescriptors []*input.SignDescriptor) ([][]byte, error) { - - txRaw, err := swap.EncodeTx(tx) - if err != nil { - return nil, err - } +func marshallSignDescriptors(signDescriptors []*input.SignDescriptor, +) []*signrpc.SignDescriptor { rpcSignDescs := make([]*signrpc.SignDescriptor, len(signDescriptors)) for i, signDesc := range signDescriptors { @@ -103,6 +105,18 @@ func (s *signerClient) SignOutputRaw(ctx context.Context, tx *wire.MsgTx, } } + return rpcSignDescs +} + +func (s *signerClient) SignOutputRaw(ctx context.Context, tx *wire.MsgTx, + signDescriptors []*input.SignDescriptor) ([][]byte, error) { + + txRaw, err := swap.EncodeTx(tx) + if err != nil { + return nil, err + } + rpcSignDescs := marshallSignDescriptors(signDescriptors) + rpcCtx, cancel := context.WithTimeout(ctx, rpcTimeout) defer cancel() @@ -120,6 +134,44 @@ func (s *signerClient) SignOutputRaw(ctx context.Context, tx *wire.MsgTx, return resp.RawSigs, nil } +// ComputeInputScript generates the proper input script for P2WPKH output and +// NP2WPKH outputs. This method only requires that the `Output`, `HashType`, +// `SigHashes` and `InputIndex` fields are populated within the sign +// descriptors. +func (s *signerClient) ComputeInputScript(ctx context.Context, tx *wire.MsgTx, + signDescriptors []*input.SignDescriptor) ([]*input.Script, error) { + + txRaw, err := swap.EncodeTx(tx) + if err != nil { + return nil, err + } + rpcSignDescs := marshallSignDescriptors(signDescriptors) + + rpcCtx, cancel := context.WithTimeout(ctx, rpcTimeout) + defer cancel() + + rpcCtx = s.signerMac.WithMacaroonAuth(rpcCtx) + resp, err := s.client.ComputeInputScript( + rpcCtx, &signrpc.SignReq{ + RawTxBytes: txRaw, + SignDescs: rpcSignDescs, + }, + ) + if err != nil { + return nil, err + } + + inputScripts := make([]*input.Script, 0, len(resp.InputScripts)) + for _, inputScript := range resp.InputScripts { + inputScripts = append(inputScripts, &input.Script{ + SigScript: inputScript.SigScript, + Witness: inputScript.Witness, + }) + } + + return inputScripts, nil +} + // SignMessage signs a message with the key specified in the key locator. The // returned signature is fixed-size LN wire format encoded. func (s *signerClient) SignMessage(ctx context.Context, msg []byte, diff --git a/test/signer_mock.go b/test/signer_mock.go index 4e68c10..7c3b768 100644 --- a/test/signer_mock.go +++ b/test/signer_mock.go @@ -3,6 +3,7 @@ package test import ( "bytes" "context" + "fmt" "github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/wire" @@ -27,6 +28,12 @@ func (s *mockSigner) SignOutputRaw(ctx context.Context, tx *wire.MsgTx, return rawSigs, nil } +func (s *mockSigner) ComputeInputScript(ctx context.Context, tx *wire.MsgTx, + signDescriptors []*input.SignDescriptor) ([]*input.Script, error) { + + return nil, fmt.Errorf("unimplemented") +} + func (s *mockSigner) SignMessage(ctx context.Context, msg []byte, locator keychain.KeyLocator) ([]byte, error) {