safety_rules/
configurable_validator_signer.rs1use serde::Serialize;
9
10use diem_crypto::hash::CryptoHash;
11use diem_global_constants::CONSENSUS_KEY;
12use diem_types::{
13 account_address::AccountAddress,
14 validator_config::{
15 ConsensusPrivateKey, ConsensusPublicKey, ConsensusSignature,
16 ConsensusVRFPrivateKey,
17 },
18 validator_signer::ValidatorSigner,
19};
20
21use crate::{Error, PersistentSafetyStorage};
22
23pub enum ConfigurableValidatorSigner {
28 Signer(ValidatorSigner),
29 Handle(ValidatorHandle),
30}
31
32impl ConfigurableValidatorSigner {
33 pub fn new_signer(
35 author: AccountAddress, consensus_key: ConsensusPrivateKey,
36 vrf_private_key: Option<ConsensusVRFPrivateKey>,
37 ) -> Self {
38 let signer =
39 ValidatorSigner::new(author, consensus_key, vrf_private_key);
40 ConfigurableValidatorSigner::Signer(signer)
41 }
42
43 pub fn new_handle(
45 author: AccountAddress, key_version: ConsensusPublicKey,
46 ) -> Self {
47 let handle = ValidatorHandle::new(author, key_version);
48 ConfigurableValidatorSigner::Handle(handle)
49 }
50
51 pub fn author(&self) -> AccountAddress {
53 match self {
54 ConfigurableValidatorSigner::Signer(signer) => signer.author(),
55 ConfigurableValidatorSigner::Handle(handle) => handle.author(),
56 }
57 }
58
59 pub fn public_key(&self) -> ConsensusPublicKey {
61 match self {
62 ConfigurableValidatorSigner::Signer(signer) => signer.public_key(),
63 ConfigurableValidatorSigner::Handle(handle) => handle.key_version(),
64 }
65 }
66
67 pub fn sign<T: Serialize + CryptoHash>(
69 &self, message: &T, storage: &PersistentSafetyStorage,
70 ) -> Result<ConsensusSignature, Error> {
71 match self {
72 ConfigurableValidatorSigner::Signer(signer) => {
73 Ok(signer.sign(message))
74 }
75 ConfigurableValidatorSigner::Handle(handle) => {
76 handle.sign(message, storage)
77 }
78 }
79 }
80}
81
82pub struct ValidatorHandle {
87 author: AccountAddress,
88 key_version: ConsensusPublicKey,
89}
90
91impl ValidatorHandle {
92 pub fn new(
93 author: AccountAddress, key_version: ConsensusPublicKey,
94 ) -> Self {
95 ValidatorHandle {
96 author,
97 key_version,
98 }
99 }
100
101 pub fn author(&self) -> AccountAddress { self.author }
103
104 pub fn key_version(&self) -> ConsensusPublicKey { self.key_version.clone() }
106
107 pub fn sign<T: Serialize + CryptoHash>(
110 &self, message: &T, storage: &PersistentSafetyStorage,
111 ) -> Result<ConsensusSignature, Error> {
112 storage.sign(CONSENSUS_KEY.into(), self.key_version(), message)
113 }
114}