@@ -28,22 +28,21 @@ pub struct BlockValidator<'b> {
28
28
header : & ' b babbage:: MintedHeader < ' b > ,
29
29
ledger_state : & ' b dyn LedgerState ,
30
30
epoch_nonce : & ' b Hash < 32 > ,
31
- // c is the ln(1-active_slots_coeff). Usually ln(1-0.05)
32
- c : & ' b FixedDecimal ,
31
+ active_slots_coeff : & ' b FixedDecimal ,
33
32
}
34
33
35
34
impl < ' b > BlockValidator < ' b > {
36
35
pub fn new (
37
36
header : & ' b babbage:: MintedHeader ,
38
37
ledger_state : & ' b dyn LedgerState ,
39
38
epoch_nonce : & ' b Hash < 32 > ,
40
- c : & ' b FixedDecimal ,
39
+ active_slots_coeff : & ' b FixedDecimal ,
41
40
) -> Self {
42
41
Self {
43
42
header,
44
43
ledger_state,
45
44
epoch_nonce,
46
- c ,
45
+ active_slots_coeff ,
47
46
}
48
47
}
49
48
@@ -103,7 +102,7 @@ impl<'b> BlockValidator<'b> {
103
102
& block_vrf_proof,
104
103
)
105
104
} ) ,
106
- Box :: new( || self . validate_operational_certificate( issuer_vkey. as_slice( ) ) ) ,
105
+ Box :: new( || self . validate_operational_certificate( issuer_vkey. as_slice( ) , & pool_id ) ) ,
107
106
Box :: new( || self . validate_kes_signature( absolute_slot, kes_signature) ) ,
108
107
] ;
109
108
@@ -138,10 +137,10 @@ impl<'b> BlockValidator<'b> {
138
137
. operational_cert_kes_period ;
139
138
140
139
if opcert_kes_period > slot_kes_period {
141
- return Err ( ValidationError :: KesVerificationError (
142
- "Operational Certificate KES period is greater than the block slot KES period!"
143
- . to_string ( ) ,
144
- ) ) ;
140
+ return Err ( ValidationError :: OpCertKesPeriodTooLarge {
141
+ opcert_kes_period ,
142
+ slot_kes_period ,
143
+ } ) ;
145
144
}
146
145
if slot_kes_period >= opcert_kes_period + self . ledger_state . max_kes_evolutions ( ) {
147
146
return Err ( ValidationError :: KesVerificationError (
@@ -168,7 +167,7 @@ impl<'b> BlockValidator<'b> {
168
167
} )
169
168
}
170
169
171
- fn validate_operational_certificate ( & self , issuer_vkey : & [ u8 ] ) -> Result < ( ) , ValidationError > {
170
+ fn validate_operational_certificate ( & self , issuer_vkey : & [ u8 ] , pool_id : & PoolId ) -> Result < ( ) , ValidationError > {
172
171
// Verify the Operational Certificate signature
173
172
let opcert_signature = Signature :: try_from (
174
173
self . header
@@ -191,12 +190,12 @@ impl<'b> BlockValidator<'b> {
191
190
192
191
// Check the sequence number of the operational certificate. It should either be the same
193
192
// as the latest known sequence number for the issuer_vkey or one greater.
194
- match self . ledger_state . latest_opcert_sequence_number ( issuer_vkey ) {
193
+ match self . ledger_state . latest_opcert_sequence_number ( pool_id ) {
195
194
Some ( latest_opcert_sequence_number) => {
196
- if ( opcert_sequence_number - latest_opcert_sequence_number) > 1 {
197
- return Err ( ValidationError :: InvalidOpcertSequenceNumber ( "Operational Certificate sequence number is too far ahead of the latest known sequence number!" . to_string ( ) ) ) ;
198
- } else if opcert_sequence_number < latest_opcert_sequence_number {
195
+ if opcert_sequence_number < latest_opcert_sequence_number {
199
196
return Err ( ValidationError :: InvalidOpcertSequenceNumber ( "Operational Certificate sequence number is less than the latest known sequence number!" . to_string ( ) ) ) ;
197
+ } else if ( opcert_sequence_number - latest_opcert_sequence_number) > 1 {
198
+ return Err ( ValidationError :: InvalidOpcertSequenceNumber ( "Operational Certificate sequence number is too far ahead of the latest known sequence number!" . to_string ( ) ) ) ;
200
199
}
201
200
trace ! ( "Operational Certificate sequence number is ok." )
202
201
}
@@ -289,15 +288,22 @@ impl<'b> BlockValidator<'b> {
289
288
absolute_slot : u64 ,
290
289
leader_vrf_output : & [ u8 ] ,
291
290
) -> Result < ( ) , ValidationError > {
291
+ // special case for testing purposes
292
+ if self . active_slots_coeff == & FixedDecimal :: from ( 1u64 ) {
293
+ return Ok ( ( ) ) ;
294
+ }
295
+
292
296
let certified_leader_vrf: FixedDecimal = leader_vrf_output. into ( ) ;
293
297
let denominator = CERTIFIED_NATURAL_MAX . deref ( ) - & certified_leader_vrf;
294
298
let recip_q = CERTIFIED_NATURAL_MAX . deref ( ) / & denominator;
295
- let x = -( sigma * self . c ) ;
299
+ let c = ( FixedDecimal :: from ( 1u64 ) - self . active_slots_coeff . clone ( ) ) . ln ( ) ;
300
+ let x = -( sigma * & c) ;
296
301
302
+ trace ! ( "leader_vrf_output: {}" , hex:: encode( leader_vrf_output) ) ;
297
303
trace ! ( "certified_leader_vrf: {}" , certified_leader_vrf) ;
298
304
trace ! ( "denominator: {}" , denominator) ;
299
305
trace ! ( "recip_q: {}" , recip_q) ;
300
- trace ! ( "c : {}" , self . c ) ;
306
+ trace ! ( "active_slots_coeff : {}" , self . active_slots_coeff ) ;
301
307
trace ! ( "x: {}" , x) ;
302
308
303
309
let ordering = x. exp_cmp ( 1000 , 3 , & recip_q) ;
@@ -333,10 +339,10 @@ impl<'b> BlockValidator<'b> {
333
339
trace ! ( "block vrf_vkey_hash: {}" , hex:: encode( vrf_vkey_hash) ) ;
334
340
let ledger_vrf_vkey_hash = self . ledger_state . vrf_vkey_hash ( pool_id) ?;
335
341
if vrf_vkey_hash != ledger_vrf_vkey_hash {
336
- return Err ( ValidationError :: InvalidVrfKeyForPool (
337
- hex:: encode ( ledger_vrf_vkey_hash) ,
338
- hex:: encode ( vrf_vkey) ,
339
- ) ) ;
342
+ return Err ( ValidationError :: InvalidVrfKeyForPool {
343
+ key_hash_from_ledger : hex:: encode ( ledger_vrf_vkey_hash) ,
344
+ key_hash_from_block : hex:: encode ( vrf_vkey) ,
345
+ } ) ;
340
346
}
341
347
Ok ( ( ) )
342
348
}
@@ -409,7 +415,6 @@ mod tests {
409
415
410
416
let active_slots_coeff: FixedDecimal =
411
417
FixedDecimal :: from ( 5u64 ) / FixedDecimal :: from ( 100u64 ) ;
412
- let c = ( FixedDecimal :: from ( 1u64 ) - active_slots_coeff) . ln ( ) ;
413
418
let conway_block_tag: u8 = 6 ;
414
419
let multi_era_header =
415
420
MultiEraHeader :: decode ( conway_block_tag, None , test_block) . unwrap ( ) ;
@@ -441,7 +446,7 @@ mod tests {
441
446
. returning ( |_| None ) ;
442
447
443
448
let block_validator =
444
- BlockValidator :: new ( babbage_header, & ledger_state, & epoch_nonce, & c ) ;
449
+ BlockValidator :: new ( babbage_header, & ledger_state, & epoch_nonce, & active_slots_coeff ) ;
445
450
assert_eq ! ( block_validator. validate( ) . is_ok( ) , expected) ;
446
451
}
447
452
}
0 commit comments