Skip to content

Commit acfb20a

Browse files
committed
address+universe: allow syncing of specific group key
We'll want to be able to query the asset leaves for a group key to map them to one or more asset IDs.
1 parent 36866b5 commit acfb20a

File tree

3 files changed

+55
-20
lines changed

3 files changed

+55
-20
lines changed

address/book.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ type QueryParams struct {
8282
// known to universe servers in our federation.
8383
type AssetSyncer interface {
8484
// SyncAssetInfo queries the universes in our federation for genesis
85-
// and asset group information about the given asset ID.
86-
SyncAssetInfo(ctx context.Context, assetID *asset.ID) error
85+
// and asset group information about the given asset.
86+
SyncAssetInfo(ctx context.Context, specifier asset.Specifier) error
8787

8888
// EnableAssetSync updates the sync config for the given asset so that
8989
// we sync future issuance proofs.
@@ -232,7 +232,7 @@ func (b *Book) QueryAssetInfo(ctx context.Context,
232232
log.Debugf("Asset %v is unknown, attempting to bootstrap", id.String())
233233

234234
// Use the AssetSyncer to query our universe federation for the asset.
235-
err = b.cfg.Syncer.SyncAssetInfo(ctx, &id)
235+
err = b.cfg.Syncer.SyncAssetInfo(ctx, asset.NewSpecifierFromId(id))
236236
if err != nil {
237237
return nil, err
238238
}
@@ -264,6 +264,27 @@ func (b *Book) QueryAssetInfo(ctx context.Context,
264264
return assetGroup, nil
265265
}
266266

267+
// SyncAssetGroup attempts to enable asset sync for the given asset group, then
268+
// perform an initial sync with the federation for that group.
269+
func (b *Book) SyncAssetGroup(ctx context.Context,
270+
groupKey btcec.PublicKey) error {
271+
272+
groupInfo := &asset.AssetGroup{
273+
GroupKey: &asset.GroupKey{
274+
GroupPubKey: groupKey,
275+
},
276+
}
277+
err := b.cfg.Syncer.EnableAssetSync(ctx, groupInfo)
278+
if err != nil {
279+
return fmt.Errorf("unable to enable asset sync: %w", err)
280+
}
281+
282+
// Use the AssetSyncer to query our universe federation for the asset.
283+
return b.cfg.Syncer.SyncAssetInfo(
284+
ctx, asset.NewSpecifierFromGroupKey(groupKey),
285+
)
286+
}
287+
267288
// FetchAssetMetaByHash attempts to fetch an asset meta based on an asset hash.
268289
func (b *Book) FetchAssetMetaByHash(ctx context.Context,
269290
metaHash [asset.MetaHashLen]byte) (*proof.MetaReveal, error) {
@@ -296,7 +317,7 @@ func (b *Book) FetchAssetMetaForAsset(ctx context.Context,
296317
assetID.String())
297318

298319
// Use the AssetSyncer to query our universe federation for the asset.
299-
err = b.cfg.Syncer.SyncAssetInfo(ctx, &assetID)
320+
err = b.cfg.Syncer.SyncAssetInfo(ctx, asset.NewSpecifierFromId(assetID))
300321
if err != nil {
301322
return nil, err
302323
}

tapgarden/mock.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -823,8 +823,8 @@ func (m *MockAssetSyncer) FetchAsset(id asset.ID) (*asset.AssetGroup, error) {
823823
}
824824
}
825825

826-
func (m *MockAssetSyncer) SyncAssetInfo(_ context.Context,
827-
id *asset.ID) error {
826+
func (m *MockAssetSyncer) SyncAssetInfo(_ context.Context, id *asset.ID,
827+
_ *btcec.PublicKey) error {
828828

829829
if id == nil {
830830
return fmt.Errorf("no asset ID provided")

universe/auto_syncer.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"sync"
88
"time"
99

10+
"github.com/btcsuite/btcd/btcec/v2"
1011
"github.com/davecgh/go-spew/spew"
1112
"github.com/lightninglabs/taproot-assets/address"
1213
"github.com/lightninglabs/taproot-assets/asset"
@@ -807,29 +808,43 @@ func (f *FederationEnvoy) tryFetchServers() ([]ServerAddr, error) {
807808
// SyncAssetInfo queries the universes in our federation for genesis and asset
808809
// group information about the given asset ID.
809810
func (f *FederationEnvoy) SyncAssetInfo(ctx context.Context,
810-
assetID *asset.ID) error {
811+
specifier asset.Specifier) error {
811812

812-
if assetID == nil {
813-
return fmt.Errorf("no asset ID provided")
813+
uniID := Identifier{
814+
ProofType: ProofTypeIssuance,
814815
}
815816

817+
switch {
818+
case specifier.HasId() && specifier.HasGroupPubKey():
819+
return fmt.Errorf("must set either asset ID or group key for " +
820+
"asset sync")
821+
822+
case !specifier.HasId() && !specifier.HasGroupPubKey():
823+
return fmt.Errorf("no asset ID or group key provided")
824+
}
825+
826+
specifier.WhenId(func(id asset.ID) {
827+
uniID.AssetID = id
828+
})
829+
specifier.WhenGroupPubKey(func(groupKey btcec.PublicKey) {
830+
uniID.GroupKey = &groupKey
831+
})
832+
816833
// Fetch the set of universe servers in our federation.
817834
fedServers, err := f.tryFetchServers()
818835
if err != nil {
819836
return err
820837
}
821838

822839
assetConfig := FedUniSyncConfig{
823-
UniverseID: Identifier{
824-
AssetID: *assetID,
825-
ProofType: ProofTypeIssuance,
826-
},
840+
UniverseID: uniID,
827841
AllowSyncInsert: true,
828842
AllowSyncExport: false,
829843
}
830844
fullConfig := SyncConfigs{
831845
UniSyncConfigs: []*FedUniSyncConfig{&assetConfig},
832846
}
847+
833848
// We'll sync with Universe servers in parallel and collect the diffs
834849
// from any successful syncs. There can only be one diff per server, as
835850
// we're only syncing one universe root.
@@ -846,8 +861,8 @@ func (f *FederationEnvoy) SyncAssetInfo(ctx context.Context,
846861
// Sync failures are expected from Universe servers that do not
847862
// have a relevant universe root.
848863
if err != nil {
849-
log.Warnf("Asset lookup failed: asset_id=%v, "+
850-
"remote_server=%v: %v", assetID.String(),
864+
log.Warnf("Asset lookup failed: id=%v, "+
865+
"remote_server=%v: %v", uniID.String(),
851866
addr.HostStr(), err)
852867

853868
// We don't want to abort syncing here, as this might
@@ -863,8 +878,8 @@ func (f *FederationEnvoy) SyncAssetInfo(ctx context.Context,
863878
if len(syncDiff) != 1 {
864879
log.Warnf("Unexpected number of sync diffs "+
865880
"when looking up asset: num_diffs=%d, "+
866-
"asset_id=%v, remote_server=%v",
867-
len(syncDiff), assetID.String(),
881+
"id=%v, remote_server=%v",
882+
len(syncDiff), uniID.String(),
868883
addr.HostStr())
869884

870885
// We don't want to abort syncing here, as this
@@ -891,12 +906,11 @@ func (f *FederationEnvoy) SyncAssetInfo(ctx context.Context,
891906

892907
syncDiffs := fn.Collect(returnedSyncDiffs)
893908
log.Infof("Synced new Universe leaves for asset %v, diff_size=%v",
894-
assetID.String(), len(syncDiffs))
909+
uniID.String(), len(syncDiffs))
895910

896-
// TODO(jhb): Log successful syncs?
897911
if len(syncDiffs) == 0 {
898912
return fmt.Errorf("asset lookup failed for asset: %v",
899-
assetID.String())
913+
uniID.String())
900914
}
901915

902916
return nil

0 commit comments

Comments
 (0)