@@ -1149,9 +1149,10 @@ impl Engine<EthereumMachine> for AuthorityRound {
1149
1149
1150
1150
// If empty step messages are enabled we will validate the messages in the seal, missing messages are not
1151
1151
// reported as there's no way to tell whether the empty step message was never sent or simply not included.
1152
- if header. number ( ) >= self . empty_steps_transition {
1153
- let validate_empty_steps = || -> Result < ( ) , Error > {
1152
+ let empty_steps_len = if header. number ( ) >= self . empty_steps_transition {
1153
+ let validate_empty_steps = || -> Result < usize , Error > {
1154
1154
let empty_steps = header_empty_steps ( header) ?;
1155
+ let empty_steps_len = empty_steps. len ( ) ;
1155
1156
for empty_step in empty_steps {
1156
1157
if empty_step. step <= parent_step || empty_step. step >= step {
1157
1158
Err ( EngineError :: InsufficientProof (
@@ -1168,16 +1169,27 @@ impl Engine<EthereumMachine> for AuthorityRound {
1168
1169
format ! ( "invalid empty step proof: {:?}" , empty_step) ) ) ?;
1169
1170
}
1170
1171
}
1171
- Ok ( ( ) )
1172
+ Ok ( empty_steps_len )
1172
1173
} ;
1173
1174
1174
- if let err @ Err ( _) = validate_empty_steps ( ) {
1175
- self . validators . report_benign ( header. author ( ) , set_number, header. number ( ) ) ;
1176
- return err;
1175
+ match validate_empty_steps ( ) {
1176
+ Ok ( len) => len,
1177
+ Err ( err) => {
1178
+ self . validators . report_benign ( header. author ( ) , set_number, header. number ( ) ) ;
1179
+ return Err ( err) ;
1180
+ } ,
1177
1181
}
1178
-
1179
1182
} else {
1180
1183
self . report_skipped ( header, step, parent_step, & * validators, set_number) ;
1184
+
1185
+ 0
1186
+ } ;
1187
+
1188
+ if header. number ( ) >= self . validate_score_transition {
1189
+ let expected_difficulty = calculate_score ( parent_step. into ( ) , step. into ( ) , empty_steps_len. into ( ) ) ;
1190
+ if header. difficulty ( ) != & expected_difficulty {
1191
+ return Err ( From :: from ( BlockError :: InvalidDifficulty ( Mismatch { expected : expected_difficulty, found : header. difficulty ( ) . clone ( ) } ) ) ) ;
1192
+ }
1181
1193
}
1182
1194
1183
1195
Ok ( ( ) )
@@ -1412,7 +1424,7 @@ mod tests {
1412
1424
use engines:: { Seal , Engine , EngineError , EthEngine } ;
1413
1425
use engines:: validator_set:: TestSet ;
1414
1426
use error:: { Error , ErrorKind } ;
1415
- use super :: { AuthorityRoundParams , AuthorityRound , EmptyStep , SealedEmptyStep } ;
1427
+ use super :: { AuthorityRoundParams , AuthorityRound , EmptyStep , SealedEmptyStep , calculate_score } ;
1416
1428
1417
1429
#[ test]
1418
1430
fn has_valid_metadata ( ) {
@@ -1518,12 +1530,15 @@ mod tests {
1518
1530
1519
1531
let engine = Spec :: new_test_round ( ) . engine ;
1520
1532
1521
- let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1522
1533
// Two validators.
1523
1534
// Spec starts with step 2.
1535
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 2 ) , U256 :: zero ( ) ) ) ;
1536
+ let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1524
1537
header. set_seal ( vec ! [ encode( & 2usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1525
1538
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1526
1539
assert ! ( engine. verify_block_external( & header) . is_err( ) ) ;
1540
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 1 ) , U256 :: zero ( ) ) ) ;
1541
+ let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1527
1542
header. set_seal ( vec ! [ encode( & 1usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1528
1543
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1529
1544
assert ! ( engine. verify_block_external( & header) . is_ok( ) ) ;
@@ -1544,9 +1559,10 @@ mod tests {
1544
1559
1545
1560
let engine = Spec :: new_test_round ( ) . engine ;
1546
1561
1547
- let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1548
1562
// Two validators.
1549
1563
// Spec starts with step 2.
1564
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 1 ) , U256 :: zero ( ) ) ) ;
1565
+ let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1550
1566
header. set_seal ( vec ! [ encode( & 1usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1551
1567
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1552
1568
assert ! ( engine. verify_block_external( & header) . is_ok( ) ) ;
@@ -1573,8 +1589,10 @@ mod tests {
1573
1589
// Two validators.
1574
1590
// Spec starts with step 2.
1575
1591
header. set_seal ( vec ! [ encode( & 5usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1592
+ header. set_difficulty ( calculate_score ( U256 :: from ( 4 ) , U256 :: from ( 5 ) , U256 :: zero ( ) ) ) ;
1576
1593
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1577
1594
header. set_seal ( vec ! [ encode( & 3usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1595
+ header. set_difficulty ( calculate_score ( U256 :: from ( 4 ) , U256 :: from ( 3 ) , U256 :: zero ( ) ) ) ;
1578
1596
assert ! ( engine. verify_block_family( & header, & parent_header) . is_err( ) ) ;
1579
1597
}
1580
1598
@@ -1608,6 +1626,7 @@ mod tests {
1608
1626
parent_header. set_seal ( vec ! [ encode( & 1usize ) . into_vec( ) ] ) ;
1609
1627
parent_header. set_gas_limit ( "222222" . parse :: < U256 > ( ) . unwrap ( ) ) ;
1610
1628
let mut header: Header = Header :: default ( ) ;
1629
+ header. set_difficulty ( calculate_score ( U256 :: from ( 1 ) , U256 :: from ( 3 ) , U256 :: zero ( ) ) ) ;
1611
1630
header. set_gas_limit ( "222222" . parse :: < U256 > ( ) . unwrap ( ) ) ;
1612
1631
header. set_seal ( vec ! [ encode( & 3usize ) . into_vec( ) ] ) ;
1613
1632
@@ -1967,16 +1986,15 @@ mod tests {
1967
1986
let empty_step3 = sealed_empty_step ( engine, 3 , & parent_header. hash ( ) ) ;
1968
1987
1969
1988
let empty_steps = vec ! [ empty_step2, empty_step3] ;
1989
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 4 ) , U256 :: from ( 2 ) ) ) ;
1990
+ let signature = tap. sign ( addr1, Some ( "1" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1970
1991
header. set_seal ( vec ! [
1971
1992
encode( & 4usize ) . into_vec( ) ,
1972
1993
encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ,
1973
1994
:: rlp:: encode_list( & empty_steps) . into_vec( ) ,
1974
1995
] ) ;
1975
1996
1976
- assert ! ( match engine. verify_block_family( & header, & parent_header) {
1977
- Ok ( _) => true ,
1978
- _ => false ,
1979
- } ) ;
1997
+ assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1980
1998
}
1981
1999
1982
2000
#[ test]
0 commit comments