@@ -70,10 +70,6 @@ type MetricsRecorder interface {
7070 RecordMetrics (gasPrice float64 , blobSize uint64 , statusCode coreda.StatusCode , numPendingBlocks uint64 , includedBlockHeight uint64 )
7171}
7272
73- func defaultSignaturePayloadProvider (header * types.Header ) ([]byte , error ) {
74- return header .MarshalBinary ()
75- }
76-
7773// NewHeaderEvent is used to pass header and DA height to headerInCh
7874type NewHeaderEvent struct {
7975 Header * types.SignedHeader
@@ -168,14 +164,14 @@ type Manager struct {
168164 // signaturePayloadProvider is used to provide a signature payload for the header.
169165 // It is used to sign the header with the provided signer.
170166 signaturePayloadProvider types.SignaturePayloadProvider
167+
168+ // validatorHasherProvider is used to provide the validator hash for the header.
169+ // It is used to set the validator hash in the header.
170+ validatorHasherProvider types.ValidatorHasherProvider
171171}
172172
173173// getInitialState tries to load lastState from Store, and if it's not available it reads genesis.
174- func getInitialState (ctx context.Context , genesis genesis.Genesis , signer signer.Signer , store storepkg.Store , exec coreexecutor.Executor , logger logging.EventLogger , signaturePayloadProvider types.SignaturePayloadProvider ) (types.State , error ) {
175- if signaturePayloadProvider == nil {
176- signaturePayloadProvider = defaultSignaturePayloadProvider
177- }
178-
174+ func getInitialState (ctx context.Context , genesis genesis.Genesis , signer signer.Signer , store storepkg.Store , exec coreexecutor.Executor , logger logging.EventLogger , managerOpts ManagerOptions ) (types.State , error ) {
179175 // Load the state from store.
180176 s , err := store .GetState (ctx )
181177
@@ -213,7 +209,7 @@ func getInitialState(ctx context.Context, genesis genesis.Genesis, signer signer
213209 return types.State {}, fmt .Errorf ("failed to get public key: %w" , err )
214210 }
215211
216- b , err := signaturePayloadProvider (& header )
212+ b , err := managerOpts . SignaturePayloadProvider (& header )
217213 if err != nil {
218214 return types.State {}, fmt .Errorf ("failed to get signature payload: %w" , err )
219215 }
@@ -234,7 +230,7 @@ func getInitialState(ctx context.Context, genesis genesis.Genesis, signer signer
234230
235231 // Set the same custom verifier used during normal block validation
236232 if err := genesisHeader .SetCustomVerifier (func (h * types.Header ) ([]byte , error ) {
237- return signaturePayloadProvider (h )
233+ return managerOpts . SignaturePayloadProvider (h )
238234 }); err != nil {
239235 return types.State {}, fmt .Errorf ("failed to set custom verifier for genesis header: %w" , err )
240236 }
@@ -269,6 +265,31 @@ func getInitialState(ctx context.Context, genesis genesis.Genesis, signer signer
269265 return s , nil
270266}
271267
268+ // ManagerOptions defines the options for creating a new block Manager.
269+ type ManagerOptions struct {
270+ SignaturePayloadProvider types.SignaturePayloadProvider
271+ ValidatorHasherProvider types.ValidatorHasherProvider
272+ }
273+
274+ func (opts * ManagerOptions ) Validate () error {
275+ if opts .SignaturePayloadProvider == nil {
276+ return fmt .Errorf ("signature payload provider cannot be nil" )
277+ }
278+ if opts .ValidatorHasherProvider == nil {
279+ return fmt .Errorf ("validator hasher provider cannot be nil" )
280+ }
281+
282+ return nil
283+ }
284+
285+ // DefaultManagerOptions returns the default options for creating a new block Manager.
286+ func DefaultManagerOptions () ManagerOptions {
287+ return ManagerOptions {
288+ SignaturePayloadProvider : types .DefaultSignaturePayloadProvider ,
289+ ValidatorHasherProvider : types .DefaultValidatorHasherProvider ,
290+ }
291+ }
292+
272293// NewManager creates new block Manager.
273294func NewManager (
274295 ctx context.Context ,
@@ -287,13 +308,9 @@ func NewManager(
287308 seqMetrics * Metrics ,
288309 gasPrice float64 ,
289310 gasMultiplier float64 ,
290- signaturePayloadProvider types. SignaturePayloadProvider ,
311+ managerOpts ManagerOptions ,
291312) (* Manager , error ) {
292- if signaturePayloadProvider == nil {
293- signaturePayloadProvider = defaultSignaturePayloadProvider
294- }
295-
296- s , err := getInitialState (ctx , genesis , signer , store , exec , logger , signaturePayloadProvider )
313+ s , err := getInitialState (ctx , genesis , signer , store , exec , logger , managerOpts )
297314 if err != nil {
298315 return nil , fmt .Errorf ("failed to get initial state: %w" , err )
299316 }
@@ -384,7 +401,8 @@ func NewManager(
384401 gasPrice : gasPrice ,
385402 gasMultiplier : gasMultiplier ,
386403 txNotifyCh : make (chan struct {}, 1 ), // Non-blocking channel
387- signaturePayloadProvider : signaturePayloadProvider ,
404+ signaturePayloadProvider : managerOpts .SignaturePayloadProvider ,
405+ validatorHasherProvider : managerOpts .ValidatorHasherProvider ,
388406 }
389407
390408 // initialize da included height
@@ -845,9 +863,15 @@ func (m *Manager) execCreateBlock(_ context.Context, height uint64, lastSignatur
845863 return nil , nil , fmt .Errorf ("proposer address is not the same as the genesis proposer address %x != %x" , address , m .genesis .ProposerAddress )
846864 }
847865
848- // Determine if this is an empty block
866+ // determine if this is an empty block
849867 isEmpty := batchData .Batch == nil || len (batchData .Transactions ) == 0
850868
869+ // build validator hash
870+ validatorHash , err := m .validatorHasherProvider (m .genesis .ProposerAddress , key )
871+ if err != nil {
872+ return nil , nil , fmt .Errorf ("failed to get validator hash: %w" , err )
873+ }
874+
851875 header := & types.SignedHeader {
852876 Header : types.Header {
853877 Version : types.Version {
@@ -857,13 +881,14 @@ func (m *Manager) execCreateBlock(_ context.Context, height uint64, lastSignatur
857881 BaseHeader : types.BaseHeader {
858882 ChainID : m .lastState .ChainID ,
859883 Height : height ,
860- Time : uint64 (batchData .UnixNano ()), //nolint:gosec // why is time unix? (tac0turtle)
884+ Time : uint64 (batchData .UnixNano ()),
861885 },
862886 LastHeaderHash : lastHeaderHash ,
863887 // DataHash is set at the end of the function
864888 ConsensusHash : make (types.Hash , 32 ),
865889 AppHash : m .lastState .AppHash ,
866890 ProposerAddress : m .genesis .ProposerAddress ,
891+ ValidatorHash : validatorHash ,
867892 },
868893 Signature : * lastSignature ,
869894 Signer : types.Signer {
0 commit comments