@@ -140,25 +140,43 @@ type Manager struct {
140140}
141141
142142// getInitialState tries to load lastState from Store, and if it's not available it reads genesis.
143- func getInitialState (ctx context.Context , genesis genesis.Genesis , store store.Store , exec coreexecutor.Executor , logger log.Logger ) (types.State , error ) {
143+ func getInitialState (ctx context.Context , genesis genesis.Genesis , store store.Store , exec coreexecutor.Executor , logger log.Logger , signer signer. Signer ) (types.State , error ) {
144144 // Load the state from store.
145145 s , err := store .GetState (ctx )
146146
147147 if errors .Is (err , ds .ErrNotFound ) {
148148 logger .Info ("No state found in store, initializing new state" )
149149
150+ pubKey , err := signer .GetPublic ()
151+ if err != nil {
152+ return types.State {}, fmt .Errorf ("failed to get public key: %w" , err )
153+ }
154+
150155 // Initialize genesis block explicitly
156+ header := types.Header {
157+ DataHash : new (types.Data ).Hash (),
158+ ProposerAddress : genesis .ProposerAddress ,
159+ BaseHeader : types.BaseHeader {
160+ ChainID : genesis .ChainID ,
161+ Height : genesis .InitialHeight ,
162+ Time : uint64 (genesis .GenesisDAStartHeight .UnixNano ()),
163+ }}
164+ signature , err := getSignature (header , signer )
165+ if err != nil {
166+ return types.State {}, fmt .Errorf ("failed to get header signature: %w" , err )
167+ }
168+
151169 err = store .SaveBlockData (ctx ,
152- & types.SignedHeader {Header : types. Header {
153- DataHash : new (types. Data ). Hash () ,
154- ProposerAddress : genesis . ProposerAddress ,
155- BaseHeader : types. BaseHeader {
156- ChainID : genesis .ChainID ,
157- Height : genesis . InitialHeight ,
158- Time : uint64 ( genesis . GenesisDAStartHeight . UnixNano ()) ,
159- }} },
170+ & types.SignedHeader {
171+ Header : header ,
172+ Signer : types. Signer {
173+ PubKey : pubKey ,
174+ Address : genesis .ProposerAddress ,
175+ } ,
176+ Signature : signature ,
177+ },
160178 & types.Data {},
161- & types. Signature {} ,
179+ & signature ,
162180 )
163181 if err != nil {
164182 return types.State {}, fmt .Errorf ("failed to save genesis block: %w" , err )
@@ -214,7 +232,7 @@ func NewManager(
214232 gasPrice float64 ,
215233 gasMultiplier float64 ,
216234) (* Manager , error ) {
217- s , err := getInitialState (ctx , genesis , store , exec , logger )
235+ s , err := getInitialState (ctx , genesis , store , exec , logger , proposerKey )
218236 if err != nil {
219237 logger .Error ("error while getting initial state" , "error" , err )
220238 return nil , err
@@ -1068,15 +1086,20 @@ func (m *Manager) fetchHeaders(ctx context.Context, daHeight uint64) (coreda.Res
10681086}
10691087
10701088func (m * Manager ) getSignature (header types.Header ) (types.Signature , error ) {
1089+ return getSignature (header , m .proposerKey )
1090+ }
1091+
1092+ func getSignature (header types.Header , proposerKey signer.Signer ) (types.Signature , error ) {
1093+
10711094 b , err := header .Vote ()
10721095 if err != nil {
10731096 return nil , err
10741097 }
1075- sign , err := m . proposerKey .Sign (b )
1098+ sign , err := proposerKey .Sign (b )
10761099 if err != nil {
10771100 return nil , err
10781101 }
1079- pub , err := m . proposerKey .GetPublic ()
1102+ pub , err := proposerKey .GetPublic ()
10801103 if err != nil {
10811104 return nil , err
10821105 }
0 commit comments