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 }