Skip to content

Commit

Permalink
Add ProtecingKeymanager interface and calls (#4982)
Browse files Browse the repository at this point in the history
* Add ProtectedKeymanager interface and calls

* Rename interface

Co-authored-by: Raul Jordan <raul@prysmaticlabs.com>
  • Loading branch information
mcdee and rauljordan committed Mar 3, 2020
1 parent 59575bc commit 4c43616
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 2 deletions.
1 change: 1 addition & 0 deletions validator/client/BUILD.bazel
Expand Up @@ -19,6 +19,7 @@ go_library(
"//beacon-chain/core/helpers:go_default_library",
"//proto/beacon/rpc/v1:go_default_library",
"//proto/slashing:go_default_library",
"//shared/bls:go_default_library",
"//shared/bytesutil:go_default_library",
"//shared/featureconfig:go_default_library",
"//shared/hashutil:go_default_library",
Expand Down
9 changes: 8 additions & 1 deletion validator/client/validator_attest.go
Expand Up @@ -12,10 +12,12 @@ import (
"github.com/prysmaticlabs/go-bitfield"
"github.com/prysmaticlabs/go-ssz"
slashpb "github.com/prysmaticlabs/prysm/proto/slashing"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/sirupsen/logrus"
"go.opencensus.io/trace"
)
Expand Down Expand Up @@ -209,7 +211,12 @@ func (v *validator) signAtt(ctx context.Context, pubKey [48]byte, data *ethpb.At
return nil, err
}

sig, err := v.keyManager.Sign(pubKey, root, domain.SignatureDomain)
var sig *bls.Signature
if protectingKeymanager, supported := v.keyManager.(keymanager.ProtectingKeyManager); supported {
sig, err = protectingKeymanager.SignAttestation(pubKey, domain.SignatureDomain, data)
} else {
sig, err = v.keyManager.Sign(pubKey, root, domain.SignatureDomain)
}
if err != nil {
return nil, err
}
Expand Down
9 changes: 8 additions & 1 deletion validator/client/validator_propose.go
Expand Up @@ -12,9 +12,11 @@ import (
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/go-ssz"
slashpb "github.com/prysmaticlabs/prysm/proto/slashing"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/validator/keymanager"
"github.com/sirupsen/logrus"
"go.opencensus.io/trace"
)
Expand Down Expand Up @@ -196,7 +198,12 @@ func (v *validator) signBlock(ctx context.Context, pubKey [48]byte, epoch uint64
if err != nil {
return nil, errors.Wrap(err, "could not get signing root")
}
sig, err := v.keyManager.Sign(pubKey, root, domain.SignatureDomain)
var sig *bls.Signature
if protectingKeymanager, supported := v.keyManager.(keymanager.ProtectingKeyManager); supported {
sig, err = protectingKeymanager.SignProposal(pubKey, domain.SignatureDomain, b)
} else {
sig, err = v.keyManager.Sign(pubKey, root, domain.SignatureDomain)
}
if err != nil {
return nil, errors.Wrap(err, "could not get signing root")
}
Expand Down
1 change: 1 addition & 0 deletions validator/keymanager/BUILD.bazel
Expand Up @@ -19,6 +19,7 @@ go_library(
"//shared/bytesutil:go_default_library",
"//shared/interop:go_default_library",
"//validator/accounts:go_default_library",
"@com_github_prysmaticlabs_ethereumapis//eth/v1alpha1:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
"@com_github_wealdtech_go_eth2_wallet//:go_default_library",
"@com_github_wealdtech_go_eth2_wallet_store_filesystem//:go_default_library",
Expand Down
13 changes: 13 additions & 0 deletions validator/keymanager/keymanager.go
Expand Up @@ -3,6 +3,7 @@ package keymanager
import (
"errors"

ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/shared/bls"
)

Expand All @@ -12,10 +13,22 @@ var ErrNoSuchKey = errors.New("no such key")
// ErrCannotSign is returned whenever a signing attempt fails.
var ErrCannotSign = errors.New("cannot sign")

// ErrCouldSlash is returned whenever a signing attempt is refused due to a potential slashing event.
var ErrCouldSlash = errors.New("could result in a slashing event")

// KeyManager controls access to private keys by the validator.
type KeyManager interface {
// FetchValidatingKeys fetches the list of public keys that should be used to validate with.
FetchValidatingKeys() ([][48]byte, error)
// Sign signs a message for the validator to broadcast.
Sign(pubKey [48]byte, root [32]byte, domain uint64) (*bls.Signature, error)
}

// ProtectingKeyManager provides access to a keymanager that protects its clients from slashing events.
type ProtectingKeyManager interface {
// SignProposal signs a block proposal for the validator to broadcast.
SignProposal(pubKey [48]byte, domain uint64, data *ethpb.BeaconBlock) (*bls.Signature, error)

// SignAttestation signs an attestation for the validator to broadcast.
SignAttestation(pubKey [48]byte, domain uint64, data *ethpb.AttestationData) (*bls.Signature, error)
}

0 comments on commit 4c43616

Please sign in to comment.