github.com/Finschia/finschia-sdk@v0.48.1/types/tx/signing/signature.go (about) 1 package signing 2 3 import ( 4 "fmt" 5 6 codectypes "github.com/Finschia/finschia-sdk/codec/types" 7 cryptotypes "github.com/Finschia/finschia-sdk/crypto/types" 8 ) 9 10 // SignatureV2 is a convenience type that is easier to use in application logic 11 // than the protobuf SignerInfo's and raw signature bytes. It goes beyond the 12 // first sdk.Signature types by supporting sign modes and explicitly nested 13 // multi-signatures. It is intended to be used for both building and verifying 14 // signatures. 15 type SignatureV2 struct { 16 // PubKey is the public key to use for verifying the signature 17 PubKey cryptotypes.PubKey 18 19 // Data is the actual data of the signature which includes SignMode's and 20 // the signatures themselves for either single or multi-signatures. 21 Data SignatureData 22 23 // Sequence is the sequence of this account. Only populated in 24 // SIGN_MODE_DIRECT. 25 Sequence uint64 26 } 27 28 // SignatureDataToProto converts a SignatureData to SignatureDescriptor_Data. 29 // SignatureDescriptor_Data is considered an encoding type whereas SignatureData is used for 30 // business logic. 31 func SignatureDataToProto(data SignatureData) *SignatureDescriptor_Data { 32 switch data := data.(type) { 33 case *SingleSignatureData: 34 return &SignatureDescriptor_Data{ 35 Sum: &SignatureDescriptor_Data_Single_{ 36 Single: &SignatureDescriptor_Data_Single{ 37 Mode: data.SignMode, 38 Signature: data.Signature, 39 }, 40 }, 41 } 42 case *MultiSignatureData: 43 descDatas := make([]*SignatureDescriptor_Data, len(data.Signatures)) 44 45 for j, d := range data.Signatures { 46 descDatas[j] = SignatureDataToProto(d) 47 } 48 49 return &SignatureDescriptor_Data{ 50 Sum: &SignatureDescriptor_Data_Multi_{ 51 Multi: &SignatureDescriptor_Data_Multi{ 52 Bitarray: data.BitArray, 53 Signatures: descDatas, 54 }, 55 }, 56 } 57 default: 58 panic(fmt.Errorf("unexpected case %+v", data)) 59 } 60 } 61 62 // SignatureDataFromProto converts a SignatureDescriptor_Data to SignatureData. 63 // SignatureDescriptor_Data is considered an encoding type whereas SignatureData is used for 64 // business logic. 65 func SignatureDataFromProto(descData *SignatureDescriptor_Data) SignatureData { 66 switch descData := descData.Sum.(type) { 67 case *SignatureDescriptor_Data_Single_: 68 return &SingleSignatureData{ 69 SignMode: descData.Single.Mode, 70 Signature: descData.Single.Signature, 71 } 72 case *SignatureDescriptor_Data_Multi_: 73 multi := descData.Multi 74 datas := make([]SignatureData, len(multi.Signatures)) 75 76 for j, d := range multi.Signatures { 77 datas[j] = SignatureDataFromProto(d) 78 } 79 80 return &MultiSignatureData{ 81 BitArray: multi.Bitarray, 82 Signatures: datas, 83 } 84 default: 85 panic(fmt.Errorf("unexpected case %+v", descData)) 86 } 87 } 88 89 var _, _ codectypes.UnpackInterfacesMessage = &SignatureDescriptors{}, &SignatureDescriptor{} 90 91 // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method 92 func (sds *SignatureDescriptors) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { 93 for _, sig := range sds.Signatures { 94 err := sig.UnpackInterfaces(unpacker) 95 if err != nil { 96 return err 97 } 98 } 99 100 return nil 101 } 102 103 // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method 104 func (sd *SignatureDescriptor) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { 105 return unpacker.UnpackAny(sd.PublicKey, new(cryptotypes.PubKey)) 106 }