Skip to content

Commit 45ae387

Browse files
committed
tapdb: use embeddings for script key
1 parent d50edff commit 45ae387

File tree

10 files changed

+227
-339
lines changed

10 files changed

+227
-339
lines changed

tapdb/addrs.go

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -404,22 +404,13 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context,
404404
}
405405
}
406406

407-
rawScriptKey, err := btcec.ParsePubKey(
408-
addr.RawScriptKey,
407+
scriptKey, err := parseScriptKey(
408+
addr.InternalKey, addr.ScriptKey,
409409
)
410410
if err != nil {
411411
return fmt.Errorf("unable to decode "+
412412
"script key: %w", err)
413413
}
414-
rawScriptKeyDesc := keychain.KeyDescriptor{
415-
KeyLocator: keychain.KeyLocator{
416-
Family: keychain.KeyFamily(
417-
addr.ScriptKeyFamily,
418-
),
419-
Index: uint32(addr.ScriptKeyIndex),
420-
},
421-
PubKey: rawScriptKey,
422-
}
423414

424415
internalKey, err := btcec.ParsePubKey(addr.RawTaprootKey)
425416
if err != nil {
@@ -436,11 +427,6 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context,
436427
PubKey: internalKey,
437428
}
438429

439-
scriptKey, err := btcec.ParsePubKey(addr.TweakedScriptKey)
440-
if err != nil {
441-
return err
442-
}
443-
444430
taprootOutputKey, err := schnorr.ParsePubKey(
445431
addr.TaprootOutputKey,
446432
)
@@ -467,8 +453,8 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context,
467453

468454
tapAddr, err := address.New(
469455
address.Version(addr.Version), assetGenesis,
470-
groupKey, groupWitness,
471-
*scriptKey, *internalKey, uint64(addr.Amount),
456+
groupKey, groupWitness, *scriptKey.PubKey,
457+
*internalKey, uint64(addr.Amount),
472458
tapscriptSibling, t.params, *proofCourierAddr,
473459
address.WithAssetVersion(
474460
asset.Version(addr.AssetVersion),
@@ -478,16 +464,9 @@ func (t *TapAddressBook) QueryAddrs(ctx context.Context,
478464
return fmt.Errorf("unable to make addr: %w", err)
479465
}
480466

481-
declaredKnown := extractBool(
482-
addr.ScriptKeyDeclaredKnown,
483-
)
484467
addrs = append(addrs, address.AddrWithKeyInfo{
485-
Tap: tapAddr,
486-
ScriptKeyTweak: asset.TweakedScriptKey{
487-
RawKey: rawScriptKeyDesc,
488-
Tweak: addr.ScriptKeyTweak,
489-
DeclaredKnown: declaredKnown,
490-
},
468+
Tap: tapAddr,
469+
ScriptKeyTweak: *scriptKey.TweakedScriptKey,
491470
InternalKeyDesc: internalKeyDesc,
492471
TaprootOutputKey: *taprootOutputKey,
493472
CreationTime: addr.CreationTime.UTC(),
@@ -571,21 +550,7 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams,
571550
}
572551
}
573552

574-
rawScriptKey, err := btcec.ParsePubKey(dbAddr.RawScriptKey)
575-
if err != nil {
576-
return nil, fmt.Errorf("unable to decode script key: %w", err)
577-
}
578-
scriptKeyDesc := keychain.KeyDescriptor{
579-
KeyLocator: keychain.KeyLocator{
580-
Family: keychain.KeyFamily(
581-
dbAddr.ScriptKeyFamily,
582-
),
583-
Index: uint32(dbAddr.ScriptKeyIndex),
584-
},
585-
PubKey: rawScriptKey,
586-
}
587-
588-
scriptKey, err := btcec.ParsePubKey(dbAddr.TweakedScriptKey)
553+
scriptKey, err := parseScriptKey(dbAddr.InternalKey, dbAddr.ScriptKey)
589554
if err != nil {
590555
return nil, fmt.Errorf("unable to decode script key: %w", err)
591556
}
@@ -622,23 +587,18 @@ func fetchAddr(ctx context.Context, db AddrBook, params *address.ChainParams,
622587

623588
tapAddr, err := address.New(
624589
address.Version(dbAddr.Version), genesis, groupKey,
625-
groupWitness, *scriptKey, *internalKey, uint64(dbAddr.Amount),
626-
tapscriptSibling, params, *proofCourierAddr,
590+
groupWitness, *scriptKey.PubKey, *internalKey,
591+
uint64(dbAddr.Amount), tapscriptSibling, params,
592+
*proofCourierAddr,
627593
address.WithAssetVersion(asset.Version(dbAddr.AssetVersion)),
628594
)
629595
if err != nil {
630596
return nil, fmt.Errorf("unable to make addr: %w", err)
631597
}
632598

633599
return &address.AddrWithKeyInfo{
634-
Tap: tapAddr,
635-
ScriptKeyTweak: asset.TweakedScriptKey{
636-
RawKey: scriptKeyDesc,
637-
Tweak: dbAddr.ScriptKeyTweak,
638-
DeclaredKnown: extractBool(
639-
dbAddr.ScriptKeyDeclaredKnown,
640-
),
641-
},
600+
Tap: tapAddr,
601+
ScriptKeyTweak: *scriptKey.TweakedScriptKey,
642602
InternalKeyDesc: internalKeyDesc,
643603
TaprootOutputKey: *taprootOutputKey,
644604
CreationTime: dbAddr.CreationTime.UTC(),

tapdb/asset_minting.go

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -853,35 +853,12 @@ func fetchAssetSprouts(ctx context.Context, q PendingAssetStore,
853853
for i, sprout := range dbSprout {
854854
// First, we'll decode the script key which very asset must
855855
// specify, and populate the key locator information
856-
tweakedScriptKey, err := btcec.ParsePubKey(
857-
sprout.TweakedScriptKey,
856+
scriptKey, err := parseScriptKey(
857+
sprout.InternalKey, sprout.ScriptKey,
858858
)
859859
if err != nil {
860-
return nil, err
861-
}
862-
863-
internalScriptKey, err := btcec.ParsePubKey(
864-
sprout.ScriptKeyRaw,
865-
)
866-
if err != nil {
867-
return nil, err
868-
}
869-
870-
scriptKeyDesc := keychain.KeyDescriptor{
871-
PubKey: internalScriptKey,
872-
KeyLocator: keychain.KeyLocator{
873-
Index: uint32(sprout.ScriptKeyIndex),
874-
Family: keychain.KeyFamily(sprout.ScriptKeyFam),
875-
},
876-
}
877-
declaredKnown := extractBool(sprout.ScriptKeyDeclaredKnown)
878-
scriptKey := asset.ScriptKey{
879-
PubKey: tweakedScriptKey,
880-
TweakedScriptKey: &asset.TweakedScriptKey{
881-
RawKey: scriptKeyDesc,
882-
Tweak: sprout.Tweak,
883-
DeclaredKnown: declaredKnown,
884-
},
860+
return nil, fmt.Errorf("unable to decode script key: "+
861+
"%w", err)
885862
}
886863

887864
// Not all assets have a key group, so we only need to

tapdb/assets_common.go

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -480,26 +480,58 @@ func fetchScriptKey(ctx context.Context, q FetchScriptKeyStore,
480480
return nil, err
481481
}
482482

483-
rawKey, err := btcec.ParsePubKey(dbKey.RawKey)
483+
scriptKey, err := parseScriptKey(dbKey.InternalKey, dbKey.ScriptKey)
484484
if err != nil {
485-
return nil, fmt.Errorf("unable to parse raw key: %w", err)
486-
}
487-
488-
scriptKey := &asset.TweakedScriptKey{
489-
Tweak: dbKey.Tweak,
490-
RawKey: keychain.KeyDescriptor{
491-
PubKey: rawKey,
492-
KeyLocator: keychain.KeyLocator{
493-
Family: keychain.KeyFamily(
494-
dbKey.KeyFamily,
495-
),
496-
Index: uint32(dbKey.KeyIndex),
485+
return nil, err
486+
}
487+
488+
return scriptKey.TweakedScriptKey, nil
489+
}
490+
491+
// parseScriptKey maps a script key and internal key from the database into a
492+
// ScriptKey struct. Both the internal raw public key and the tweaked public key
493+
// must be set and valid.
494+
func parseScriptKey(ik sqlc.InternalKey, sk sqlc.ScriptKey) (asset.ScriptKey,
495+
error) {
496+
497+
var (
498+
locator = keychain.KeyLocator{
499+
Index: uint32(ik.KeyIndex),
500+
Family: keychain.KeyFamily(ik.KeyFamily),
501+
}
502+
result = asset.ScriptKey{
503+
TweakedScriptKey: &asset.TweakedScriptKey{
504+
RawKey: keychain.KeyDescriptor{
505+
KeyLocator: locator,
506+
},
507+
Tweak: sk.Tweak,
508+
DeclaredKnown: extractBool(sk.DeclaredKnown),
497509
},
498-
},
499-
DeclaredKnown: extractBool(dbKey.DeclaredKnown),
510+
}
511+
err error
512+
)
513+
514+
if len(sk.TweakedScriptKey) == 0 {
515+
return result, fmt.Errorf("tweaked script key is empty")
516+
}
517+
518+
if len(ik.RawKey) == 0 {
519+
return result, fmt.Errorf("internal raw key is empty")
520+
}
521+
522+
result.PubKey, err = btcec.ParsePubKey(sk.TweakedScriptKey)
523+
if err != nil {
524+
return result, fmt.Errorf("error parsing tweaked "+
525+
"script key: %w", err)
526+
}
527+
528+
result.RawKey.PubKey, err = btcec.ParsePubKey(ik.RawKey)
529+
if err != nil {
530+
return result, fmt.Errorf("error parsing internal "+
531+
"raw key: %w", err)
500532
}
501533

502-
return scriptKey, nil
534+
return result, nil
503535
}
504536

505537
// FetchGenesisStore houses the methods related to fetching genesis assets.

0 commit comments

Comments
 (0)