@@ -11,14 +11,11 @@ import (
11
11
"github.com/btcsuite/btcd/btcec/v2"
12
12
"github.com/btcsuite/btcd/btcec/v2/schnorr"
13
13
"github.com/btcsuite/btcd/btcutil/hdkeychain"
14
- "github.com/btcsuite/btcd/chaincfg/chainhash"
15
14
"github.com/btcsuite/btcd/txscript"
16
15
"github.com/btcsuite/btcd/wire"
17
16
"github.com/lightninglabs/taproot-assets/fn"
18
17
"github.com/lightninglabs/taproot-assets/internal/test"
19
18
"github.com/lightninglabs/taproot-assets/mssmt"
20
- "github.com/lightningnetwork/lnd/input"
21
- "github.com/lightningnetwork/lnd/keychain"
22
19
"github.com/lightningnetwork/lnd/tlv"
23
20
"github.com/stretchr/testify/require"
24
21
"pgregory.net/rapid"
@@ -111,134 +108,6 @@ var (
111
108
}
112
109
)
113
110
114
- // TestGroupKeyIsEqual tests that GroupKey.IsEqual is correct.
115
- func TestGroupKeyIsEqual (t * testing.T ) {
116
- t .Parallel ()
117
-
118
- testKey := & GroupKey {
119
- RawKey : keychain.KeyDescriptor {
120
- // Fill in some non-defaults.
121
- KeyLocator : keychain.KeyLocator {
122
- Family : keychain .KeyFamilyMultiSig ,
123
- Index : 1 ,
124
- },
125
- PubKey : pubKey ,
126
- },
127
- GroupPubKey : * pubKey ,
128
- Witness : sigWitness ,
129
- }
130
-
131
- pubKeyCopy := * pubKey
132
-
133
- tests := []struct {
134
- a , b * GroupKey
135
- equal bool
136
- }{
137
- {
138
- a : nil ,
139
- b : nil ,
140
- equal : true ,
141
- },
142
- {
143
- a : & GroupKey {},
144
- b : & GroupKey {},
145
- equal : true ,
146
- },
147
- {
148
- a : nil ,
149
- b : & GroupKey {},
150
- equal : false ,
151
- },
152
- {
153
- a : testKey ,
154
- b : & GroupKey {
155
- GroupPubKey : * pubKey ,
156
- },
157
- equal : false ,
158
- },
159
- {
160
- a : testKey ,
161
- b : & GroupKey {
162
- GroupPubKey : testKey .GroupPubKey ,
163
- Witness : testKey .Witness ,
164
- },
165
- equal : false ,
166
- },
167
- {
168
- a : testKey ,
169
- b : & GroupKey {
170
- RawKey : keychain.KeyDescriptor {
171
- KeyLocator : testKey .RawKey .KeyLocator ,
172
- PubKey : nil ,
173
- },
174
-
175
- GroupPubKey : testKey .GroupPubKey ,
176
- Witness : testKey .Witness ,
177
- },
178
- equal : false ,
179
- },
180
- {
181
- a : testKey ,
182
- b : & GroupKey {
183
- RawKey : keychain.KeyDescriptor {
184
- PubKey : & pubKeyCopy ,
185
- },
186
-
187
- GroupPubKey : testKey .GroupPubKey ,
188
- Witness : testKey .Witness ,
189
- },
190
- equal : false ,
191
- },
192
- {
193
- a : testKey ,
194
- b : & GroupKey {
195
- RawKey : keychain.KeyDescriptor {
196
- KeyLocator : testKey .RawKey .KeyLocator ,
197
- PubKey : & pubKeyCopy ,
198
- },
199
-
200
- GroupPubKey : testKey .GroupPubKey ,
201
- Witness : testKey .Witness ,
202
- },
203
- equal : true ,
204
- },
205
- {
206
- a : & GroupKey {
207
- GroupPubKey : testKey .GroupPubKey ,
208
- Witness : testKey .Witness ,
209
- },
210
- b : & GroupKey {
211
- GroupPubKey : testKey .GroupPubKey ,
212
- Witness : testKey .Witness ,
213
- },
214
- equal : true ,
215
- },
216
- {
217
- a : & GroupKey {
218
- RawKey : keychain.KeyDescriptor {
219
- KeyLocator : testKey .RawKey .KeyLocator ,
220
- },
221
- GroupPubKey : testKey .GroupPubKey ,
222
- Witness : testKey .Witness ,
223
- },
224
- b : & GroupKey {
225
- RawKey : keychain.KeyDescriptor {
226
- KeyLocator : testKey .RawKey .KeyLocator ,
227
- },
228
- GroupPubKey : testKey .GroupPubKey ,
229
- Witness : testKey .Witness ,
230
- },
231
- equal : true ,
232
- },
233
- }
234
-
235
- for _ , testCase := range tests {
236
- testCase := testCase
237
- require .Equal (t , testCase .equal , testCase .a .IsEqual (testCase .b ))
238
- require .Equal (t , testCase .equal , testCase .b .IsEqual (testCase .a ))
239
- }
240
- }
241
-
242
111
// TestGenesisAssetClassification tests that the multiple forms of genesis asset
243
112
// are recognized correctly.
244
113
func TestGenesisAssetClassification (t * testing.T ) {
@@ -858,161 +727,6 @@ func TestAssetID(t *testing.T) {
858
727
require .NotEqual (t , id [:], differentID [:])
859
728
}
860
729
861
- // TestAssetGroupKey tests that the asset key group is derived correctly.
862
- func TestAssetGroupKey (t * testing.T ) {
863
- t .Parallel ()
864
-
865
- privKey , err := btcec .NewPrivateKey ()
866
- groupPub := privKey .PubKey ()
867
- require .NoError (t , err )
868
- privKeyCopy := btcec .PrivKeyFromScalar (& privKey .Key )
869
- genSigner := NewMockGenesisSigner (privKeyCopy )
870
- genBuilder := MockGroupTxBuilder {}
871
- fakeKeyDesc := test .PubToKeyDesc (groupPub )
872
- fakeScriptKey := NewScriptKeyBip86 (fakeKeyDesc )
873
-
874
- g := Genesis {
875
- FirstPrevOut : wire.OutPoint {
876
- Hash : hashBytes1 ,
877
- Index : 99 ,
878
- },
879
- Tag : "normal asset 1" ,
880
- MetaHash : [MetaHashLen ]byte {1 , 2 , 3 },
881
- OutputIndex : 21 ,
882
- Type : Collectible ,
883
- }
884
- groupTweak := g .ID ()
885
-
886
- internalKey := input .TweakPrivKey (privKeyCopy , groupTweak [:])
887
- tweakedKey := txscript .TweakTaprootPrivKey (* internalKey , nil )
888
-
889
- // TweakTaprootPrivKey modifies the private key that is passed in! We
890
- // need to provide a copy to arrive at the same result.
891
- protoAsset := NewAssetNoErr (t , g , 1 , 0 , 0 , fakeScriptKey , nil )
892
- groupReq := NewGroupKeyRequestNoErr (
893
- t , fakeKeyDesc , fn .None [ExternalKey ](), g , protoAsset , nil ,
894
- fn .None [chainhash.Hash ](),
895
- )
896
- genTx , err := groupReq .BuildGroupVirtualTx (& genBuilder )
897
- require .NoError (t , err )
898
-
899
- keyGroup , err := DeriveGroupKey (genSigner , * genTx , * groupReq , nil )
900
- require .NoError (t , err )
901
-
902
- require .Equal (
903
- t , schnorr .SerializePubKey (tweakedKey .PubKey ()),
904
- schnorr .SerializePubKey (& keyGroup .GroupPubKey ),
905
- )
906
-
907
- // We should also be able to reproduce the correct tweak with a non-nil
908
- // tapscript root.
909
- tapTweak := test .RandBytes (32 )
910
- tweakedKey = txscript .TweakTaprootPrivKey (* internalKey , tapTweak )
911
-
912
- groupReq = NewGroupKeyRequestNoErr (
913
- t , test .PubToKeyDesc (privKey .PubKey ()), fn .None [ExternalKey ](),
914
- g , protoAsset , tapTweak , fn .None [chainhash.Hash ](),
915
- )
916
- genTx , err = groupReq .BuildGroupVirtualTx (& genBuilder )
917
- require .NoError (t , err )
918
-
919
- keyGroup , err = DeriveGroupKey (genSigner , * genTx , * groupReq , nil )
920
- require .NoError (t , err )
921
-
922
- require .Equal (
923
- t , schnorr .SerializePubKey (tweakedKey .PubKey ()),
924
- schnorr .SerializePubKey (& keyGroup .GroupPubKey ),
925
- )
926
-
927
- // Group key tweaking should fail when given invalid tweaks.
928
- badTweak := test .RandBytes (33 )
929
- _ , err = GroupPubKeyV0 (groupPub , badTweak , badTweak )
930
- require .Error (t , err )
931
-
932
- _ , err = GroupPubKeyV0 (groupPub , groupTweak [:], badTweak )
933
- require .Error (t , err )
934
- }
935
-
936
- // TestDeriveGroupKey tests that group key derivation fails for assets that are
937
- // not eligible to be group anchors.
938
- func TestDeriveGroupKey (t * testing.T ) {
939
- t .Parallel ()
940
-
941
- groupPriv := test .RandPrivKey ()
942
- groupPub := groupPriv .PubKey ()
943
- groupKeyDesc := test .PubToKeyDesc (groupPub )
944
- genSigner := NewMockGenesisSigner (groupPriv )
945
- genBuilder := MockGroupTxBuilder {}
946
-
947
- baseGen := RandGenesis (t , Normal )
948
- collectGen := RandGenesis (t , Collectible )
949
- baseScriptKey := RandScriptKey (t )
950
- protoAsset := RandAssetWithValues (t , baseGen , nil , baseScriptKey )
951
- nonGenProtoAsset := protoAsset .Copy ()
952
- nonGenProtoAsset .PrevWitnesses = []Witness {{
953
- PrevID : & PrevID {
954
- OutPoint : wire.OutPoint {
955
- Hash : hashBytes1 ,
956
- Index : 1 ,
957
- },
958
- ID : hashBytes1 ,
959
- ScriptKey : ToSerialized (pubKey ),
960
- },
961
- TxWitness : sigWitness ,
962
- SplitCommitment : nil ,
963
- }}
964
- groupedProtoAsset := protoAsset .Copy ()
965
- groupedProtoAsset .GroupKey = & GroupKey {
966
- GroupPubKey : * groupPub ,
967
- }
968
- groupReq := GroupKeyRequest {
969
- RawKey : groupKeyDesc ,
970
- AnchorGen : baseGen ,
971
- }
972
-
973
- // A prototype asset is required for building the genesis virtual TX.
974
- _ , err := groupReq .BuildGroupVirtualTx (& genBuilder )
975
- require .ErrorContains (t , err , "grouped asset cannot be nil" )
976
-
977
- // The prototype asset must have a genesis witness.
978
- groupReq .NewAsset = nonGenProtoAsset
979
- _ , err = groupReq .BuildGroupVirtualTx (& genBuilder )
980
- require .ErrorContains (t , err , "asset is not a genesis asset" )
981
-
982
- // The prototype asset must not have a group key set.
983
- groupReq .NewAsset = groupedProtoAsset
984
- _ , err = groupReq .BuildGroupVirtualTx (& genBuilder )
985
- require .ErrorContains (t , err , "asset already has group key" )
986
-
987
- // The anchor genesis used for signing must have the same asset type
988
- // as the prototype asset being signed.
989
- groupReq .AnchorGen = collectGen
990
- groupReq .NewAsset = protoAsset
991
- _ , err = groupReq .BuildGroupVirtualTx (& genBuilder )
992
- require .ErrorContains (t , err , "asset group type mismatch" )
993
-
994
- // The group key request must include an internal key.
995
- groupReq .AnchorGen = baseGen
996
- groupReq .RawKey .PubKey = nil
997
- _ , err = groupReq .BuildGroupVirtualTx (& genBuilder )
998
- require .ErrorContains (t , err , "missing group internal key" )
999
-
1000
- // The tapscript root in the group key request must be exactly 32 bytes
1001
- // if present.
1002
- groupReq .RawKey = groupKeyDesc
1003
- groupReq .TapscriptRoot = test .RandBytes (33 )
1004
- _ , err = groupReq .BuildGroupVirtualTx (& genBuilder )
1005
- require .ErrorContains (t , err , "tapscript root must be 32 bytes" )
1006
-
1007
- groupReq .TapscriptRoot = test .RandBytes (32 )
1008
- genTx , err := groupReq .BuildGroupVirtualTx (& genBuilder )
1009
- require .NoError (t , err )
1010
-
1011
- groupKey , err := DeriveGroupKey (genSigner , * genTx , groupReq , nil )
1012
- require .NoError (t , err )
1013
- require .NotNil (t , groupKey )
1014
- }
1015
-
1016
730
// TestAssetWitnesses tests that the asset group witness can be serialized and
1017
731
// parsed correctly, and that signature detection works correctly.
1018
732
func TestAssetWitnesses (t * testing.T ) {
0 commit comments