|
package grpc
|
|
|
|
import (
|
|
context "context"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
"github.com/tendermint/tendermint/crypto/encoding"
|
|
"github.com/tendermint/tendermint/libs/log"
|
|
privvalproto "github.com/tendermint/tendermint/proto/tendermint/privval"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
// SignerServer implements PrivValidatorAPIServer 9generated via protobuf services)
|
|
// Handles remote validator connections that provide signing services
|
|
type SignerServer struct {
|
|
logger log.Logger
|
|
chainID string
|
|
privVal types.PrivValidator
|
|
}
|
|
|
|
func NewSignerServer(chainID string,
|
|
privVal types.PrivValidator, log log.Logger) *SignerServer {
|
|
|
|
return &SignerServer{
|
|
logger: log,
|
|
chainID: chainID,
|
|
privVal: privVal,
|
|
}
|
|
}
|
|
|
|
var _ privvalproto.PrivValidatorAPIServer = (*SignerServer)(nil)
|
|
|
|
// PubKey receives a request for the pubkey
|
|
// returns the pubkey on success and error on failure
|
|
func (ss *SignerServer) GetPubKey(ctx context.Context, req *privvalproto.PubKeyRequest) (
|
|
*privvalproto.PubKeyResponse, error) {
|
|
var pubKey crypto.PubKey
|
|
|
|
pubKey, err := ss.privVal.GetPubKey(ctx)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.NotFound, "error getting pubkey: %v", err)
|
|
}
|
|
|
|
pk, err := encoding.PubKeyToProto(pubKey)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.Internal, "error transitioning pubkey to proto: %v", err)
|
|
}
|
|
|
|
ss.logger.Info("SignerServer: GetPubKey Success")
|
|
|
|
return &privvalproto.PubKeyResponse{PubKey: pk}, nil
|
|
}
|
|
|
|
// SignVote receives a vote sign requests, attempts to sign it
|
|
// returns SignedVoteResponse on success and error on failure
|
|
func (ss *SignerServer) SignVote(ctx context.Context, req *privvalproto.SignVoteRequest) (
|
|
*privvalproto.SignedVoteResponse, error) {
|
|
vote := req.Vote
|
|
|
|
err := ss.privVal.SignVote(ctx, req.ChainId, vote)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.InvalidArgument, "error signing vote: %v", err)
|
|
}
|
|
|
|
ss.logger.Info("SignerServer: SignVote Success", "height", req.Vote.Height)
|
|
|
|
return &privvalproto.SignedVoteResponse{Vote: *vote}, nil
|
|
}
|
|
|
|
// SignProposal receives a proposal sign requests, attempts to sign it
|
|
// returns SignedProposalResponse on success and error on failure
|
|
func (ss *SignerServer) SignProposal(ctx context.Context, req *privvalproto.SignProposalRequest) (
|
|
*privvalproto.SignedProposalResponse, error) {
|
|
proposal := req.Proposal
|
|
|
|
err := ss.privVal.SignProposal(ctx, req.ChainId, proposal)
|
|
if err != nil {
|
|
return nil, status.Errorf(codes.InvalidArgument, "error signing proposal: %v", err)
|
|
}
|
|
|
|
ss.logger.Info("SignerServer: SignProposal Success", "height", req.Proposal.Height)
|
|
|
|
return &privvalproto.SignedProposalResponse{Proposal: *proposal}, nil
|
|
}
|