@@ -102,7 +102,8 @@ private Block PrepareBlock()
102102 UInt256 number = header . Number ;
103103 // Assemble the voting snapshot to check which votes make sense
104104 Snapshot snapshot = _sealEngine . GetOrCreateSnapshot ( number - 1 , header . ParentHash ) ;
105- if ( ( ulong ) number % _config . Epoch != 0 )
105+ bool isEpochBlock = ( ulong ) number % 30000 == 0 ;
106+ if ( ! isEpochBlock )
106107 {
107108 // Gather all the proposals that make sense voting on
108109 List < Address > addresses = new List < Address > ( ) ;
@@ -137,36 +138,25 @@ private Block PrepareBlock()
137138 header . TotalDifficulty = parent . TotalDifficulty + header . Difficulty ;
138139 if ( _logger . IsDebug ) _logger . Debug ( $ "Setting total difficulty to { parent . TotalDifficulty } + { header . Difficulty } .") ;
139140
140- // Ensure the extra data has all it's components
141- if ( header . ExtraData . Length < CliqueSealEngine . ExtraVanityLength )
142- {
143- for ( int i = 0 ; i < CliqueSealEngine . ExtraVanityLength ; i ++ )
144- {
145- header . ExtraData = header . ExtraData . Append ( ( byte ) 0 ) . ToArray ( ) ;
146- }
147- }
148-
149- header . ExtraData = header . ExtraData . Take ( CliqueSealEngine . ExtraVanityLength ) . ToArray ( ) ;
141+ // Set extra data
142+ int mainBytesLength = CliqueSealEngine . ExtraVanityLength + CliqueSealEngine . ExtraSealLength ;
143+ int signerBytesLength = isEpochBlock ? 20 * snapshot . Signers . Count : 0 ;
144+ int extraDataLength = mainBytesLength + signerBytesLength ;
145+ header . ExtraData = new byte [ extraDataLength ] ;
150146
151147 byte [ ] clientName = Encoding . UTF8 . GetBytes ( "Nethermind" ) ;
152148 Array . Copy ( clientName , header . ExtraData , clientName . Length ) ;
153149
154- if ( ( ulong ) number % _config . Epoch == 0 )
150+ if ( isEpochBlock )
155151 {
156- foreach ( Address signer in snapshot . Signers . Keys )
152+ for ( int i = 0 ; i < snapshot . Signers . Keys . Count ; i ++ )
157153 {
158- foreach ( byte addressByte in signer . Bytes )
159- {
160- header . ExtraData = header . ExtraData . Append ( addressByte ) . ToArray ( ) ;
161- }
154+ Address signer = snapshot . Signers . Keys [ i ] ;
155+ int index = CliqueSealEngine . ExtraVanityLength + 20 * i ;
156+ Array . Copy ( signer . Bytes , 0 , header . ExtraData , index , signer . Bytes . Length ) ;
162157 }
163158 }
164159
165- for ( int i = 0 ; i < CliqueSealEngine . ExtraSealLength ; i ++ )
166- {
167- header . ExtraData = header . ExtraData . Append ( ( byte ) 0 ) . ToArray ( ) ;
168- }
169-
170160 // Mix digest is reserved for now, set to empty
171161 header . MixHash = Keccak . Zero ;
172162 // Ensure the timestamp has the correct delay
0 commit comments