Skip to content

Commit b8a007d

Browse files
author
Robyn Ffrancon
authored
Merge pull request #660 from lightninglabs/getblockheader_verifier
chain_bridge: fetch block headers over blocks when verifying proofs
2 parents d6dd7d0 + 8a52e70 commit b8a007d

File tree

3 files changed

+58
-10
lines changed

3 files changed

+58
-10
lines changed

chain_bridge.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ import (
99
"github.com/lightninglabs/lndclient"
1010
"github.com/lightninglabs/taproot-assets/tapgarden"
1111
"github.com/lightningnetwork/lnd/chainntnfs"
12+
"github.com/lightningnetwork/lnd/lnrpc/verrpc"
1213
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
1314
)
1415

1516
// LndRpcChainBridge is an implementation of the tapgarden.ChainBridge
1617
// interface backed by an active remote lnd node.
1718
type LndRpcChainBridge struct {
1819
lnd *lndclient.LndServices
20+
21+
getBlockHeaderSupported *bool
1922
}
2023

2124
// NewLndRpcChainBridge creates a new chain bridge from an active lnd services
@@ -79,6 +82,19 @@ func (l *LndRpcChainBridge) GetBlock(ctx context.Context,
7982
return block, nil
8083
}
8184

85+
// GetBlockHeader returns a block header given its hash.
86+
func (l *LndRpcChainBridge) GetBlockHeader(ctx context.Context,
87+
hash chainhash.Hash) (*wire.BlockHeader, error) {
88+
89+
header, err := l.lnd.ChainKit.GetBlockHeader(ctx, hash)
90+
if err != nil {
91+
return nil, fmt.Errorf("unable to retrieve block header: %w",
92+
err)
93+
}
94+
95+
return header, nil
96+
}
97+
8298
// GetBlockHash returns the hash of the block in the best blockchain at the
8399
// given height.
84100
func (l *LndRpcChainBridge) GetBlockHash(ctx context.Context,
@@ -93,6 +109,31 @@ func (l *LndRpcChainBridge) GetBlockHash(ctx context.Context,
93109
return blockHash, nil
94110
}
95111

112+
// GetBlockHeaderSupported returns true if the chain backend supports the
113+
// `GetBlockHeader` RPC call.
114+
func (l *LndRpcChainBridge) GetBlockHeaderSupported(ctx context.Context) bool {
115+
// Check if we've already asserted the compatibility of the chain
116+
// backend.
117+
if l.getBlockHeaderSupported != nil {
118+
return *l.getBlockHeaderSupported
119+
}
120+
121+
// The ChainKit.GetBlockHeader() RPC call was added in lnd v0.17.1.
122+
getBlockHeaderMinimalVersion := &verrpc.Version{
123+
AppMajor: 0,
124+
AppMinor: 17,
125+
AppPatch: 1,
126+
}
127+
128+
getBlockHeaderUnsupported := lndclient.AssertVersionCompatible(
129+
l.lnd.Version, getBlockHeaderMinimalVersion,
130+
)
131+
getBlockHeaderSupported := getBlockHeaderUnsupported == nil
132+
133+
l.getBlockHeaderSupported = &getBlockHeaderSupported
134+
return *l.getBlockHeaderSupported
135+
}
136+
96137
// VerifyBlock returns an error if a block (with given header and height) is not
97138
// present on-chain. It also checks to ensure that block height corresponds to
98139
// the given block header.
@@ -121,7 +162,14 @@ func (l *LndRpcChainBridge) VerifyBlock(ctx context.Context,
121162
"expectedHash: %s)", height, hash, expectedHash)
122163
}
123164

124-
// Ensure that the block header corresponds to a block on-chain.
165+
// Ensure that the block header corresponds to a block on-chain. Fetch
166+
// only the corresponding block header and not the entire block if
167+
// supported.
168+
if l.GetBlockHeaderSupported(ctx) {
169+
_, err = l.GetBlockHeader(ctx, header.BlockHash())
170+
return err
171+
}
172+
125173
_, err = l.GetBlock(ctx, header.BlockHash())
126174
return err
127175
}

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/btcsuite/btcd/btcutil/psbt v1.1.8
1010
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2
1111
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f
12-
github.com/btcsuite/btcwallet v0.16.10-0.20230804184612-07be54bc22cf
12+
github.com/btcsuite/btcwallet v0.16.10-0.20231017144732-e3ff37491e9c
1313
github.com/caddyserver/certmagic v0.17.2
1414
github.com/davecgh/go-spew v1.1.1
1515
github.com/go-errors/errors v1.0.1
@@ -23,9 +23,9 @@ require (
2323
github.com/lib/pq v1.10.7
2424
github.com/lightninglabs/aperture v0.1.21-beta.0.20230705004936-87bb996a4030
2525
github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2
26-
github.com/lightninglabs/lndclient v0.17.0-1
26+
github.com/lightninglabs/lndclient v0.17.0-4
2727
github.com/lightninglabs/neutrino/cache v1.1.1
28-
github.com/lightningnetwork/lnd v0.17.0-beta
28+
github.com/lightningnetwork/lnd v0.17.1-beta
2929
github.com/lightningnetwork/lnd/cert v1.2.2
3030
github.com/lightningnetwork/lnd/clock v1.1.1
3131
github.com/lightningnetwork/lnd/ticker v1.1.1

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtyd
9999
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
100100
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
101101
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
102-
github.com/btcsuite/btcwallet v0.16.10-0.20230804184612-07be54bc22cf h1:iZrvu/dynDPUcLJFkKiN9wnS4EdjwZSJS1H33Rx/a1Y=
103-
github.com/btcsuite/btcwallet v0.16.10-0.20230804184612-07be54bc22cf/go.mod h1:qUPTONX2GVX7ERHvgh352/WySsfYlrkL4729qX9o9cA=
102+
github.com/btcsuite/btcwallet v0.16.10-0.20231017144732-e3ff37491e9c h1:+7tbYEUj0TYYIvuvE9YP+x5dU3FT/8J6Qh8d5YvQwrE=
103+
github.com/btcsuite/btcwallet v0.16.10-0.20231017144732-e3ff37491e9c/go.mod h1:WSKhOJWUmUOHKCKEzdt+jWAHFAE/t4RqVbCwL2pEdiU=
104104
github.com/btcsuite/btcwallet/wallet/txauthor v1.3.2 h1:etuLgGEojecsDOYTII8rYiGHjGyV5xTqsXi+ZQ715UU=
105105
github.com/btcsuite/btcwallet/wallet/txauthor v1.3.2/go.mod h1:Zpk/LOb2sKqwP2lmHjaZT9AdaKsHPSbNLm2Uql5IQ/0=
106106
github.com/btcsuite/btcwallet/wallet/txrules v1.2.0 h1:BtEN5Empw62/RVnZ0VcJaVtVlBijnLlJY+dwjAye2Bg=
@@ -521,8 +521,8 @@ github.com/lightninglabs/lightning-node-connect v0.2.5-alpha h1:ZRVChwczFXK0CEbx
521521
github.com/lightninglabs/lightning-node-connect v0.2.5-alpha/go.mod h1:A9Pof9fETkH+F67BnOmrBDThPKstqp73wlImWOZvTXQ=
522522
github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2 h1:Er1miPZD2XZwcfE4xoS5AILqP1mj7kqnhbBSxW9BDxY=
523523
github.com/lightninglabs/lightning-node-connect/hashmailrpc v1.0.2/go.mod h1:antQGRDRJiuyQF6l+k6NECCSImgCpwaZapATth2Chv4=
524-
github.com/lightninglabs/lndclient v0.17.0-1 h1:r/25L1P86Wjdj0UmqfMNF3Ph+SJOTeGKlOIjkX3iWiw=
525-
github.com/lightninglabs/lndclient v0.17.0-1/go.mod h1:J2RD7ZcIVreQKy6NTOGJMM7AeGvsMLHO+Aoegkzpijs=
524+
github.com/lightninglabs/lndclient v0.17.0-4 h1:2nU7kMYctGmx6NCpbWAwRt3mmlsSzb6HI41WODReYzA=
525+
github.com/lightninglabs/lndclient v0.17.0-4/go.mod h1:oVQUAYEeuYUaoxCWjUBaa/uF0kiqEJJjEaiMhEXHH7Y=
526526
github.com/lightninglabs/neutrino v0.16.0 h1:YNTQG32fPR/Zg0vvJVI65OBH8l3U18LSXXtX91hx0q0=
527527
github.com/lightninglabs/neutrino v0.16.0/go.mod h1:x3OmY2wsA18+Kc3TSV2QpSUewOCiscw2mKpXgZv2kZk=
528528
github.com/lightninglabs/neutrino/cache v1.1.1 h1:TllWOSlkABhpgbWJfzsrdUaDH2fBy/54VSIB4vVqV8M=
@@ -531,8 +531,8 @@ github.com/lightninglabs/protobuf-go-hex-display v1.30.0-hex-display h1:pRdza2wl
531531
github.com/lightninglabs/protobuf-go-hex-display v1.30.0-hex-display/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
532532
github.com/lightningnetwork/lightning-onion v1.2.1-0.20230823005744-06182b1d7d2f h1:Pua7+5TcFEJXIIZ1I2YAUapmbcttmLj4TTi786bIi3s=
533533
github.com/lightningnetwork/lightning-onion v1.2.1-0.20230823005744-06182b1d7d2f/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI=
534-
github.com/lightningnetwork/lnd v0.17.0-beta h1:Vzl2W3ClIDdffuQD5IaZwyP7CKR/CbXxWqws72Cq51g=
535-
github.com/lightningnetwork/lnd v0.17.0-beta/go.mod h1:8w27nArqZ1P7U6FP9U78GlaTLNm7u9GhV5Edv1C1yRU=
534+
github.com/lightningnetwork/lnd v0.17.1-beta h1:ya5pXahwrEJ9Sj9TQu0rIsOr1dMK8myuFMslZlmVmhA=
535+
github.com/lightningnetwork/lnd v0.17.1-beta/go.mod h1:wgnCM0tlwxUDZ9y7CeBkXtBJkaY45+R8A3XAgsFS0MA=
536536
github.com/lightningnetwork/lnd/cert v1.2.2 h1:71YK6hogeJtxSxw2teq3eGeuy4rHGKcFf0d0Uy4qBjI=
537537
github.com/lightningnetwork/lnd/cert v1.2.2/go.mod h1:jQmFn/Ez4zhDgq2hnYSw8r35bqGVxViXhX6Cd7HXM6U=
538538
github.com/lightningnetwork/lnd/clock v1.0.1/go.mod h1:KnQudQ6w0IAMZi1SgvecLZQZ43ra2vpDNj7H/aasemg=

0 commit comments

Comments
 (0)