- package privval
-
- import (
- "context"
- "fmt"
-
- "github.com/tendermint/tendermint/crypto"
- cryptoenc "github.com/tendermint/tendermint/crypto/encoding"
- cryptoproto "github.com/tendermint/tendermint/proto/tendermint/crypto"
- privvalproto "github.com/tendermint/tendermint/proto/tendermint/privval"
- tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
- "github.com/tendermint/tendermint/types"
- )
-
- func DefaultValidationRequestHandler(
- ctx context.Context,
- privVal types.PrivValidator,
- req privvalproto.Message,
- chainID string,
- ) (privvalproto.Message, error) {
- var (
- res privvalproto.Message
- err error
- )
-
- switch r := req.Sum.(type) {
- case *privvalproto.Message_PubKeyRequest:
- if r.PubKeyRequest.GetChainId() != chainID {
- res = mustWrapMsg(&privvalproto.PubKeyResponse{
- PubKey: cryptoproto.PublicKey{}, Error: &privvalproto.RemoteSignerError{
- Code: 0, Description: "unable to provide pubkey"}})
- return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.PubKeyRequest.GetChainId(), chainID)
- }
-
- var pubKey crypto.PubKey
- pubKey, err = privVal.GetPubKey(ctx)
- if err != nil {
- return res, err
- }
- pk, err := cryptoenc.PubKeyToProto(pubKey)
- if err != nil {
- return res, err
- }
-
- if err != nil {
- res = mustWrapMsg(&privvalproto.PubKeyResponse{
- PubKey: cryptoproto.PublicKey{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}})
- } else {
- res = mustWrapMsg(&privvalproto.PubKeyResponse{PubKey: pk, Error: nil})
- }
-
- case *privvalproto.Message_SignVoteRequest:
- if r.SignVoteRequest.ChainId != chainID {
- res = mustWrapMsg(&privvalproto.SignedVoteResponse{
- Vote: tmproto.Vote{}, Error: &privvalproto.RemoteSignerError{
- Code: 0, Description: "unable to sign vote"}})
- return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.SignVoteRequest.GetChainId(), chainID)
- }
-
- vote := r.SignVoteRequest.Vote
-
- err = privVal.SignVote(ctx, chainID, vote)
- if err != nil {
- res = mustWrapMsg(&privvalproto.SignedVoteResponse{
- Vote: tmproto.Vote{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}})
- } else {
- res = mustWrapMsg(&privvalproto.SignedVoteResponse{Vote: *vote, Error: nil})
- }
-
- case *privvalproto.Message_SignProposalRequest:
- if r.SignProposalRequest.GetChainId() != chainID {
- res = mustWrapMsg(&privvalproto.SignedProposalResponse{
- Proposal: tmproto.Proposal{}, Error: &privvalproto.RemoteSignerError{
- Code: 0,
- Description: "unable to sign proposal"}})
- return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.SignProposalRequest.GetChainId(), chainID)
- }
-
- proposal := r.SignProposalRequest.Proposal
-
- err = privVal.SignProposal(ctx, chainID, proposal)
- if err != nil {
- res = mustWrapMsg(&privvalproto.SignedProposalResponse{
- Proposal: tmproto.Proposal{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}})
- } else {
- res = mustWrapMsg(&privvalproto.SignedProposalResponse{Proposal: *proposal, Error: nil})
- }
- case *privvalproto.Message_PingRequest:
- err, res = nil, mustWrapMsg(&privvalproto.PingResponse{})
-
- default:
- err = fmt.Errorf("unknown msg: %v", r)
- }
-
- return res, err
- }
|