Skip to content

Commit 8b2965f

Browse files
authored
Merge pull request #1400 from Roasbeef/ignore-proof-checker
proof: add new IgnoreChecker proof rejection cache
2 parents 04d0996 + 1cfbe7c commit 8b2965f

28 files changed

+429
-273
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

+33-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)
@@ -1018,3 +1028,21 @@ func (tmr *TestMetaReveal) ToMetaReveal(t testing.TB) *MetaReveal {
10181028
UnknownOddTypes: tmr.UnknownOddTypes,
10191029
}
10201030
}
1031+
1032+
type mockIgnoreChecker struct {
1033+
ignoredAssetPoints fn.Set[AssetPoint]
1034+
ignoreAll bool
1035+
}
1036+
1037+
func newMockIgnoreChecker(ignoreAll bool,
1038+
ignorePoints ...AssetPoint) *mockIgnoreChecker {
1039+
1040+
return &mockIgnoreChecker{
1041+
ignoredAssetPoints: fn.NewSet(ignorePoints...),
1042+
ignoreAll: ignoreAll,
1043+
}
1044+
}
1045+
1046+
func (m *mockIgnoreChecker) IsIgnored(assetPoint AssetPoint) bool {
1047+
return m.ignoreAll || m.ignoredAssetPoints.Contains(assetPoint)
1048+
}

0 commit comments

Comments
 (0)