|
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
|
|
}
|