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  }