github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/privval/signer_requestHandler.go (about)

     1  package privval
     2  
     3  import (
     4  	"fmt"
     5  
     6  	cryptoproto "github.com/tendermint/tendermint/proto/tendermint/crypto"
     7  	privvalproto "github.com/tendermint/tendermint/proto/tendermint/privval"
     8  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
     9  
    10  	"github.com/line/ostracon/crypto"
    11  	cryptoenc "github.com/line/ostracon/crypto/encoding"
    12  	ocprivvalproto "github.com/line/ostracon/proto/ostracon/privval"
    13  	"github.com/line/ostracon/types"
    14  )
    15  
    16  func DefaultValidationRequestHandler(
    17  	privVal types.PrivValidator,
    18  	req ocprivvalproto.Message,
    19  	chainID string,
    20  ) (ocprivvalproto.Message, error) {
    21  	var (
    22  		res ocprivvalproto.Message
    23  		err error
    24  	)
    25  
    26  	switch r := req.Sum.(type) {
    27  	case *ocprivvalproto.Message_PubKeyRequest:
    28  		if r.PubKeyRequest.GetChainId() != chainID {
    29  			res = mustWrapMsg(&privvalproto.PubKeyResponse{
    30  				PubKey: cryptoproto.PublicKey{}, Error: &privvalproto.RemoteSignerError{
    31  					Code: 0, Description: "unable to provide pubkey"}})
    32  			return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.PubKeyRequest.GetChainId(), chainID)
    33  		}
    34  
    35  		var pubKey crypto.PubKey
    36  		pubKey, err = privVal.GetPubKey()
    37  		if err != nil {
    38  			return res, err
    39  		}
    40  		pk, err := cryptoenc.PubKeyToProto(pubKey)
    41  		if err != nil {
    42  			return res, err
    43  		}
    44  
    45  		if err != nil {
    46  			res = mustWrapMsg(&privvalproto.PubKeyResponse{
    47  				PubKey: cryptoproto.PublicKey{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}})
    48  		} else {
    49  			res = mustWrapMsg(&privvalproto.PubKeyResponse{PubKey: pk, Error: nil})
    50  		}
    51  
    52  	case *ocprivvalproto.Message_SignVoteRequest:
    53  		if r.SignVoteRequest.ChainId != chainID {
    54  			res = mustWrapMsg(&privvalproto.SignedVoteResponse{
    55  				Vote: tmproto.Vote{}, Error: &privvalproto.RemoteSignerError{
    56  					Code: 0, Description: "unable to sign vote"}})
    57  			return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.SignVoteRequest.GetChainId(), chainID)
    58  		}
    59  
    60  		vote := r.SignVoteRequest.Vote
    61  
    62  		err = privVal.SignVote(chainID, vote)
    63  		if err != nil {
    64  			res = mustWrapMsg(&privvalproto.SignedVoteResponse{
    65  				Vote: tmproto.Vote{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}})
    66  		} else {
    67  			res = mustWrapMsg(&privvalproto.SignedVoteResponse{Vote: *vote, Error: nil})
    68  		}
    69  
    70  	case *ocprivvalproto.Message_SignProposalRequest:
    71  		if r.SignProposalRequest.GetChainId() != chainID {
    72  			res = mustWrapMsg(&privvalproto.SignedProposalResponse{
    73  				Proposal: tmproto.Proposal{}, Error: &privvalproto.RemoteSignerError{
    74  					Code:        0,
    75  					Description: "unable to sign proposal"}})
    76  			return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.SignProposalRequest.GetChainId(), chainID)
    77  		}
    78  
    79  		proposal := r.SignProposalRequest.Proposal
    80  
    81  		err = privVal.SignProposal(chainID, proposal)
    82  		if err != nil {
    83  			res = mustWrapMsg(&privvalproto.SignedProposalResponse{
    84  				Proposal: tmproto.Proposal{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}})
    85  		} else {
    86  			res = mustWrapMsg(&privvalproto.SignedProposalResponse{Proposal: *proposal, Error: nil})
    87  		}
    88  	case *ocprivvalproto.Message_PingRequest:
    89  		err, res = nil, mustWrapMsg(&privvalproto.PingResponse{})
    90  
    91  	case *ocprivvalproto.Message_VrfProofRequest:
    92  		proof, err := privVal.GenerateVRFProof(r.VrfProofRequest.Message)
    93  		if err != nil {
    94  			err := privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}
    95  			res = mustWrapMsg(&ocprivvalproto.VRFProofResponse{Proof: nil, Error: &err})
    96  		} else {
    97  			res = mustWrapMsg(&ocprivvalproto.VRFProofResponse{Proof: proof[:], Error: nil})
    98  		}
    99  
   100  	default:
   101  		err = fmt.Errorf("unknown msg: %v", r)
   102  	}
   103  
   104  	return res, err
   105  }