Skip to content

Commit 30d92d2

Browse files
Roasbeefguggero
authored andcommitted
multi: introduce in proof.VerifierCtx struct
In this commit, we introduce a new proof.VerifierCtx struct to cut down on line noise when verifying single proofs and proof files. This also lets us centralize the creation of the various interfaces we need to verify a proof. Finally, this is a prep for an upcoming change where we'll add a new interface to the validation context.
1 parent 04d0996 commit 30d92d2

28 files changed

+290
-268
lines changed

itest/assertions.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -746,10 +746,14 @@ func VerifyProofBlob(t *testing.T, tapClient taprpc.TaprootAssetsClient,
746746
return nil
747747
}
748748

749-
snapshot, err := f.Verify(
750-
ctxt, headerVerifier, proof.DefaultMerkleVerifier,
751-
groupVerifier, proof.MockChainLookup,
752-
)
749+
vCtx := proof.VerifierCtx{
750+
HeaderVerifier: headerVerifier,
751+
MerkleVerifier: proof.DefaultMerkleVerifier,
752+
GroupVerifier: groupVerifier,
753+
ChainLookupGen: proof.MockChainLookup,
754+
}
755+
756+
snapshot, err := f.Verify(ctxt, vCtx)
753757
require.NoError(t, err)
754758

755759
return f, snapshot

itest/utils.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,9 @@ func ManualMintSimpleAsset(t *harnessTest, lndNode *node.HarnessNode,
712712
)
713713
require.NoError(t.t, err)
714714

715-
chainBridge := tapgarden.NewMockChainBridge()
716715
mintingProofs, err := proof.NewMintingBlobs(
717-
&baseProof, proof.MockHeaderVerifier, proof.MockMerkleVerifier,
718-
proof.MockGroupVerifier, proof.MockGroupAnchorVerifier,
719-
chainBridge, proof.WithAssetMetaReveals(metaReveals),
716+
&baseProof, proof.MockVerifierCtx,
717+
proof.WithAssetMetaReveals(metaReveals),
720718
)
721719
require.NoError(t.t, err)
722720

proof/append.go

+3-6
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ type TransitionParams struct {
4343
// the proof for. This method returns both the encoded full provenance (proof
4444
// chain) and the added latest proof.
4545
func AppendTransition(blob Blob, params *TransitionParams,
46-
headerVerifier HeaderVerifier, merkleVerifier MerkleVerifier,
47-
groupVerifier GroupVerifier, chainLookup asset.ChainLookup) (Blob,
48-
*Proof, error) {
46+
vCtx VerifierCtx) (Blob, *Proof, error) {
4947

5048
// Decode the proof blob into a proper file structure first.
5149
f := NewEmptyFile(V0)
@@ -83,9 +81,8 @@ func AppendTransition(blob Blob, params *TransitionParams,
8381
if err := f.AppendProof(*newProof); err != nil {
8482
return nil, nil, fmt.Errorf("error appending proof: %w", err)
8583
}
86-
_, err = f.Verify(
87-
ctx, headerVerifier, merkleVerifier, groupVerifier, chainLookup,
88-
)
84+
85+
_, err = f.Verify(ctx, vCtx)
8986
if err != nil {
9087
return nil, nil, fmt.Errorf("error verifying proof: %w", err)
9188
}

proof/append_test.go

+5-12
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,7 @@ func runAppendTransitionTest(t *testing.T, assetType asset.Type, amt uint64,
212212

213213
// Append the new transition to the genesis blob.
214214
transitionBlob, transitionProof, err := AppendTransition(
215-
genesisBlob, transitionParams, MockHeaderVerifier,
216-
MockMerkleVerifier, MockGroupVerifier, MockChainLookup,
215+
genesisBlob, transitionParams, MockVerifierCtx,
217216
)
218217
require.NoError(t, err)
219218
require.Greater(t, len(transitionBlob), len(genesisBlob))
@@ -421,8 +420,7 @@ func runAppendTransitionTest(t *testing.T, assetType asset.Type, amt uint64,
421420
}
422421

423422
split1Blob, split1Proof, err := AppendTransition(
424-
transitionBlob, split1Params, MockHeaderVerifier,
425-
MockMerkleVerifier, MockGroupVerifier, MockChainLookup,
423+
transitionBlob, split1Params, MockVerifierCtx,
426424
)
427425
require.NoError(t, err)
428426
require.Greater(t, len(split1Blob), len(transitionBlob))
@@ -464,8 +462,7 @@ func runAppendTransitionTest(t *testing.T, assetType asset.Type, amt uint64,
464462
}
465463

466464
split2Blob, split2Proof, err := AppendTransition(
467-
transitionBlob, split2Params, MockHeaderVerifier,
468-
MockMerkleVerifier, MockGroupVerifier, MockChainLookup,
465+
transitionBlob, split2Params, MockVerifierCtx,
469466
)
470467
require.NoError(t, err)
471468
require.Greater(t, len(split2Blob), len(transitionBlob))
@@ -508,8 +505,7 @@ func runAppendTransitionTest(t *testing.T, assetType asset.Type, amt uint64,
508505
}
509506

510507
split3Blob, split3Proof, err := AppendTransition(
511-
transitionBlob, split3Params, MockHeaderVerifier,
512-
MockMerkleVerifier, MockGroupVerifier, MockChainLookup,
508+
transitionBlob, split3Params, MockVerifierCtx,
513509
)
514510
require.NoError(t, err)
515511
require.Greater(t, len(split3Blob), len(transitionBlob))
@@ -569,10 +565,7 @@ func verifyBlob(t testing.TB, blob Blob) *AssetSnapshot {
569565
f := NewEmptyFile(V0)
570566
require.NoError(t, f.Decode(bytes.NewReader(blob)))
571567

572-
finalSnapshot, err := f.Verify(
573-
context.Background(), MockHeaderVerifier, MockMerkleVerifier,
574-
MockGroupVerifier, MockChainLookup,
575-
)
568+
finalSnapshot, err := f.Verify(context.Background(), MockVerifierCtx)
576569
require.NoError(t, err)
577570

578571
return finalSnapshot

proof/archive.go

+10-24
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,8 @@ type Archiver interface {
167167
// the script key itself. If replace is specified, we expect a proof to
168168
// already be present, and we just update (replace) it with the new
169169
// proof.
170-
ImportProofs(ctx context.Context, headerVerifier HeaderVerifier,
171-
merkleVerifier MerkleVerifier, groupVerifier GroupVerifier,
172-
chainLookupGen ChainLookupGenerator, replace bool,
173-
proofs ...*AnnotatedProof) error
170+
ImportProofs(ctx context.Context, vCtx VerifierCtx,
171+
replace bool, proofs ...*AnnotatedProof) error
174172
}
175173

176174
// NotifyArchiver is an Archiver that also allows callers to subscribe to
@@ -709,9 +707,8 @@ func (f *FileArchiver) FetchProofs(_ context.Context,
709707
// update (replace) it with the new proof.
710708
//
711709
// NOTE: This implements the Archiver interface.
712-
func (f *FileArchiver) ImportProofs(_ context.Context,
713-
_ HeaderVerifier, _ MerkleVerifier, _ GroupVerifier,
714-
_ ChainLookupGenerator, replace bool, proofs ...*AnnotatedProof) error {
710+
func (f *FileArchiver) ImportProofs(_ context.Context, _ VerifierCtx,
711+
replace bool, proofs ...*AnnotatedProof) error {
715712

716713
for _, proof := range proofs {
717714
proofPath, err := genProofFileStoragePath(
@@ -906,9 +903,7 @@ func (m *MultiArchiver) FetchProofs(ctx context.Context,
906903
// ImportProofs attempts to store fully populated proofs on disk. The previous
907904
// outpoint of the first state transition will be used as the Genesis point.
908905
// The final resting place of the asset will be used as the script key itself.
909-
func (m *MultiArchiver) ImportProofs(ctx context.Context,
910-
headerVerifier HeaderVerifier, merkleVerifier MerkleVerifier,
911-
groupVerifier GroupVerifier, chainLookupGen ChainLookupGenerator,
906+
func (m *MultiArchiver) ImportProofs(ctx context.Context, vCtx VerifierCtx,
912907
replace bool, proofs ...*AnnotatedProof) error {
913908

914909
// Before we import the proofs into the archive, we want to make sure
@@ -917,8 +912,7 @@ func (m *MultiArchiver) ImportProofs(ctx context.Context,
917912
f := func(c context.Context, proof *AnnotatedProof) error {
918913
// First, we'll decode and then also verify the proof.
919914
finalStateTransition, err := m.proofVerifier.Verify(
920-
c, bytes.NewReader(proof.Blob), headerVerifier,
921-
merkleVerifier, groupVerifier, chainLookupGen,
915+
c, bytes.NewReader(proof.Blob), vCtx,
922916
)
923917
if err != nil {
924918
return fmt.Errorf("unable to verify proof: %w", err)
@@ -957,10 +951,7 @@ func (m *MultiArchiver) ImportProofs(ctx context.Context,
957951
// additional supplementary information into the locator, we'll attempt
958952
// to import each proof our archive backends.
959953
for _, archive := range m.backends {
960-
err := archive.ImportProofs(
961-
ctx, headerVerifier, merkleVerifier, groupVerifier,
962-
chainLookupGen, replace, proofs...,
963-
)
954+
err := archive.ImportProofs(ctx, vCtx, replace, proofs...)
964955
if err != nil {
965956
return err
966957
}
@@ -1026,9 +1017,7 @@ var _ NotifyArchiver = (*MultiArchiver)(nil)
10261017
// assets of the same ID. This is useful when we want to update the proof with a
10271018
// new one after a re-org.
10281019
func ReplaceProofInBlob(ctx context.Context, p *Proof, archive Archiver,
1029-
headerVerifier HeaderVerifier, merkleVerifier MerkleVerifier,
1030-
groupVerifier GroupVerifier,
1031-
chainLookupGen ChainLookupGenerator) error {
1020+
vCtx VerifierCtx) error {
10321021

10331022
// This is a bit of a hacky part. If we have a chain of transactions
10341023
// that were re-organized, we can't verify the whole chain until all of
@@ -1037,7 +1026,7 @@ func ReplaceProofInBlob(ctx context.Context, p *Proof, archive Archiver,
10371026
// since we don't know if the whole chain has been updated yet (the
10381027
// confirmations might come in out of order).
10391028
// TODO(guggero): Find a better way to do this.
1040-
headerVerifier = func(wire.BlockHeader, uint32) error {
1029+
vCtx.HeaderVerifier = func(wire.BlockHeader, uint32) error {
10411030
return nil
10421031
}
10431032

@@ -1105,10 +1094,7 @@ func ReplaceProofInBlob(ctx context.Context, p *Proof, archive Archiver,
11051094
Locator: existingProof.Locator,
11061095
Blob: buf.Bytes(),
11071096
}
1108-
err = archive.ImportProofs(
1109-
ctx, headerVerifier, merkleVerifier, groupVerifier,
1110-
chainLookupGen, true, directProof,
1111-
)
1097+
err = archive.ImportProofs(ctx, vCtx, true, directProof)
11121098
if err != nil {
11131099
return fmt.Errorf("unable to import updated proof: %w",
11141100
err)

proof/archive_test.go

+4-9
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,14 @@ func TestFileArchiverProofCollision(t *testing.T) {
6262
blob2 = []byte("this is the second blob")
6363
)
6464
err = fileArchive.ImportProofs(
65-
ctx, MockHeaderVerifier, MockMerkleVerifier, MockGroupVerifier,
66-
MockChainLookup, false, &AnnotatedProof{
65+
ctx, MockVerifierCtx, false, &AnnotatedProof{
6766
Locator: locator1,
6867
Blob: blob1,
6968
},
7069
)
7170
require.NoError(t, err)
7271
err = fileArchive.ImportProofs(
73-
ctx, MockHeaderVerifier, MockMerkleVerifier, MockGroupVerifier,
74-
MockChainLookup, false, &AnnotatedProof{
72+
ctx, MockVerifierCtx, false, &AnnotatedProof{
7573
Locator: locator2,
7674
Blob: blob2,
7775
},
@@ -189,10 +187,7 @@ func TestFileArchiver(t *testing.T) {
189187
}
190188

191189
err = archive.ImportProofs(
192-
ctx, MockHeaderVerifier,
193-
MockMerkleVerifier, MockGroupVerifier,
194-
MockChainLookup, false,
195-
proof,
190+
ctx, MockVerifierCtx, false, proof,
196191
)
197192

198193
if testCase.expectedStoreError != nil {
@@ -326,7 +321,7 @@ func TestMigrateOldFileNames(t *testing.T) {
326321
// under the new naming scheme.
327322
proof6 := RandProof(t, genesis2, scriptKey2, oddTxBlock, 2, 1)
328323
err = fileArchive.ImportProofs(
329-
nil, nil, nil, nil, MockChainLookup, false, &AnnotatedProof{
324+
nil, MockVerifierCtx, false, &AnnotatedProof{
330325
Locator: Locator{
331326
AssetID: fn.Ptr(proof6.Asset.ID()),
332327
ScriptKey: *proof6.Asset.ScriptKey.PubKey,

proof/backward_compat_test.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,15 @@ func runBIPTestVectorBackwardCompatible(t *testing.T,
6868
// full proof chain, as it's the first proof in the
6969
// chain.
7070
if decoded.GenesisReveal != nil {
71+
vCtx := VerifierCtx{
72+
HeaderVerifier: MockHeaderVerifier,
73+
MerkleVerifier: DefaultMerkleVerifier,
74+
GroupVerifier: MockGroupVerifier,
75+
ChainLookupGen: MockChainLookup,
76+
}
7177
_, err = decoded.Verify(
7278
context.Background(), nil,
73-
MockHeaderVerifier,
74-
DefaultMerkleVerifier,
75-
MockGroupVerifier, MockChainLookup,
79+
MockChainLookup, vCtx,
7680
)
7781
require.NoError(tt, err)
7882
}

proof/mint.go

+4-9
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,7 @@ func WithSiblingPreimage(
229229
// NewMintingBlobs takes a set of minting parameters, and produces a series of
230230
// serialized proof files, which proves the creation/existence of each of the
231231
// assets within the batch.
232-
func NewMintingBlobs(params *MintParams, headerVerifier HeaderVerifier,
233-
merkleVerifier MerkleVerifier, groupVerifier GroupVerifier,
234-
anchorVerifier GroupAnchorVerifier, chainLookupGen ChainLookupGenerator,
232+
func NewMintingBlobs(params *MintParams, vCtx VerifierCtx,
235233
blobOpts ...MintingBlobOption) (AssetProofs, error) {
236234

237235
opts := defaultMintingBlobOpts()
@@ -245,7 +243,7 @@ func NewMintingBlobs(params *MintParams, headerVerifier HeaderVerifier,
245243
}
246244

247245
proofs, err := committedProofs(
248-
base, params.TaprootAssetRoot, anchorVerifier, opts,
246+
base, params.TaprootAssetRoot, vCtx.GroupAnchorVerifier, opts,
249247
)
250248
if err != nil {
251249
return nil, err
@@ -257,15 +255,12 @@ func NewMintingBlobs(params *MintParams, headerVerifier HeaderVerifier,
257255
for key := range proofs {
258256
proof := proofs[key]
259257

260-
lookup, err := chainLookupGen.GenProofChainLookup(proof)
258+
lookup, err := vCtx.ChainLookupGen.GenProofChainLookup(proof)
261259
if err != nil {
262260
return nil, err
263261
}
264262

265-
_, err = proof.Verify(
266-
ctx, nil, headerVerifier, merkleVerifier, groupVerifier,
267-
lookup,
268-
)
263+
_, err = proof.Verify(ctx, nil, lookup, vCtx)
269264
if err != nil {
270265
return nil, fmt.Errorf("invalid proof file generated: "+
271266
"%w", err)

proof/mint_test.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,6 @@ func TestNewMintingBlobs(t *testing.T) {
128128
}},
129129
},
130130
GenesisPoint: genesisTx.TxIn[0].PreviousOutPoint,
131-
}, MockHeaderVerifier, MockMerkleVerifier, MockGroupVerifier,
132-
MockGroupAnchorVerifier, MockChainLookup,
133-
WithAssetMetaReveals(metaReveals),
134-
)
131+
}, MockVerifierCtx, WithAssetMetaReveals(metaReveals))
135132
require.NoError(t, err)
136133
}

proof/mock.go

+15-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ import (
2727
"github.com/stretchr/testify/require"
2828
)
2929

30+
var (
31+
// MockVerifierCtx is a verifier context that uses mock implementations
32+
// for all the verifier interfaces.
33+
MockVerifierCtx = VerifierCtx{
34+
HeaderVerifier: MockHeaderVerifier,
35+
MerkleVerifier: MockMerkleVerifier,
36+
GroupVerifier: MockGroupVerifier,
37+
GroupAnchorVerifier: MockGroupAnchorVerifier,
38+
ChainLookupGen: MockChainLookup,
39+
}
40+
)
41+
3042
func RandProof(t testing.TB, genesis asset.Genesis,
3143
scriptKey *btcec.PublicKey, block wire.MsgBlock, txIndex int,
3244
outputIndex uint32) Proof {
@@ -161,8 +173,7 @@ func NewMockVerifier(t *testing.T) *MockVerifier {
161173
}
162174

163175
func (m *MockVerifier) Verify(context.Context, io.Reader,
164-
HeaderVerifier, MerkleVerifier, GroupVerifier,
165-
ChainLookupGenerator) (*AssetSnapshot, error) {
176+
VerifierCtx) (*AssetSnapshot, error) {
166177

167178
return &AssetSnapshot{
168179
Asset: &asset.Asset{
@@ -413,9 +424,8 @@ func (m *MockProofArchive) FetchProofs(_ context.Context,
413424
}
414425

415426
// ImportProofs will store the given proofs, without performing any validation.
416-
func (m *MockProofArchive) ImportProofs(_ context.Context, _ HeaderVerifier,
417-
_ MerkleVerifier, _ GroupVerifier, _ ChainLookupGenerator, _ bool,
418-
proofs ...*AnnotatedProof) error {
427+
func (m *MockProofArchive) ImportProofs(_ context.Context, _ VerifierCtx,
428+
_ bool, proofs ...*AnnotatedProof) error {
419429

420430
for _, proof := range proofs {
421431
err := m.storeLocator(proof.Locator)

proof/proof_stitching_test.go

+10-9
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,16 @@ func TestProofStitching(t *testing.T) {
5151
err = f.Decode(bytes.NewReader(tplBytes))
5252
require.NoError(t, err)
5353

54+
vCtx := VerifierCtx{
55+
HeaderVerifier: verifier.VerifyHeader,
56+
MerkleVerifier: MockMerkleVerifier,
57+
GroupVerifier: MockGroupVerifier,
58+
ChainLookupGen: MockChainLookup,
59+
}
60+
5461
// We want the template to valid, otherwise all other steps are
5562
// meaningless.
56-
_, err = f.Verify(
57-
context.Background(), verifier.VerifyHeader, MockMerkleVerifier,
58-
MockGroupVerifier, MockChainLookup,
59-
)
63+
_, err = f.Verify(context.Background(), vCtx)
6064
require.NoError(t, err)
6165

6266
// The template proof is the last proof in the file, that was the only
@@ -110,6 +114,7 @@ func TestProofStitching(t *testing.T) {
110114
brokenProof.TxMerkleProof = *merkleProof
111115
brokenProof.BlockHeight = mindedBlock
112116
brokenProof.BlockHeader = block.Header
117+
vCtx.MerkleVerifier = DefaultMerkleVerifier
113118

114119
// We now should have a fully valid proof that we can write out
115120
// to a file, by replacing the last one in the template.
@@ -120,11 +125,7 @@ func TestProofStitching(t *testing.T) {
120125
// can't be fixed because of the script key usage. So if we
121126
// get an "invalid exclusion proof" error when validating, we
122127
// need to skip this proof.
123-
_, err = f.Verify(
124-
context.Background(), verifier.VerifyHeader,
125-
DefaultMerkleVerifier, MockGroupVerifier,
126-
MockChainLookup,
127-
)
128+
_, err = f.Verify(context.Background(), vCtx)
128129
switch {
129130
case errors.Is(err, commitment.ErrInvalidTaprootProof):
130131
t.Logf("Proof %d is invalid and can't be rescued: %v",

0 commit comments

Comments
 (0)