@@ -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 ( ( ) )
@@ -1408,7 +1420,7 @@ mod tests {
1408
1420
use engines:: { Seal , Engine , EngineError , EthEngine } ;
1409
1421
use engines:: validator_set:: TestSet ;
1410
1422
use error:: { Error , ErrorKind } ;
1411
- use super :: { AuthorityRoundParams , AuthorityRound , EmptyStep , SealedEmptyStep } ;
1423
+ use super :: { AuthorityRoundParams , AuthorityRound , EmptyStep , SealedEmptyStep , calculate_score } ;
1412
1424
1413
1425
#[ test]
1414
1426
fn has_valid_metadata ( ) {
@@ -1514,12 +1526,15 @@ mod tests {
1514
1526
1515
1527
let engine = Spec :: new_test_round ( ) . engine ;
1516
1528
1517
- let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1518
1529
// Two validators.
1519
1530
// Spec starts with step 2.
1531
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 2 ) , U256 :: zero ( ) ) ) ;
1532
+ let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1520
1533
header. set_seal ( vec ! [ encode( & 2usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1521
1534
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1522
1535
assert ! ( engine. verify_block_external( & header) . is_err( ) ) ;
1536
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 1 ) , U256 :: zero ( ) ) ) ;
1537
+ let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1523
1538
header. set_seal ( vec ! [ encode( & 1usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1524
1539
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1525
1540
assert ! ( engine. verify_block_external( & header) . is_ok( ) ) ;
@@ -1540,9 +1555,10 @@ mod tests {
1540
1555
1541
1556
let engine = Spec :: new_test_round ( ) . engine ;
1542
1557
1543
- let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1544
1558
// Two validators.
1545
1559
// Spec starts with step 2.
1560
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 1 ) , U256 :: zero ( ) ) ) ;
1561
+ let signature = tap. sign ( addr, Some ( "0" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1546
1562
header. set_seal ( vec ! [ encode( & 1usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1547
1563
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1548
1564
assert ! ( engine. verify_block_external( & header) . is_ok( ) ) ;
@@ -1569,8 +1585,10 @@ mod tests {
1569
1585
// Two validators.
1570
1586
// Spec starts with step 2.
1571
1587
header. set_seal ( vec ! [ encode( & 5usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1588
+ header. set_difficulty ( calculate_score ( U256 :: from ( 4 ) , U256 :: from ( 5 ) , U256 :: zero ( ) ) ) ;
1572
1589
assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1573
1590
header. set_seal ( vec ! [ encode( & 3usize ) . into_vec( ) , encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ] ) ;
1591
+ header. set_difficulty ( calculate_score ( U256 :: from ( 4 ) , U256 :: from ( 3 ) , U256 :: zero ( ) ) ) ;
1574
1592
assert ! ( engine. verify_block_family( & header, & parent_header) . is_err( ) ) ;
1575
1593
}
1576
1594
@@ -1604,6 +1622,7 @@ mod tests {
1604
1622
parent_header. set_seal ( vec ! [ encode( & 1usize ) . into_vec( ) ] ) ;
1605
1623
parent_header. set_gas_limit ( "222222" . parse :: < U256 > ( ) . unwrap ( ) ) ;
1606
1624
let mut header: Header = Header :: default ( ) ;
1625
+ header. set_difficulty ( calculate_score ( U256 :: from ( 1 ) , U256 :: from ( 3 ) , U256 :: zero ( ) ) ) ;
1607
1626
header. set_gas_limit ( "222222" . parse :: < U256 > ( ) . unwrap ( ) ) ;
1608
1627
header. set_seal ( vec ! [ encode( & 3usize ) . into_vec( ) ] ) ;
1609
1628
@@ -1963,16 +1982,15 @@ mod tests {
1963
1982
let empty_step3 = sealed_empty_step ( engine, 3 , & parent_header. hash ( ) ) ;
1964
1983
1965
1984
let empty_steps = vec ! [ empty_step2, empty_step3] ;
1985
+ header. set_difficulty ( calculate_score ( U256 :: from ( 0 ) , U256 :: from ( 4 ) , U256 :: from ( 2 ) ) ) ;
1986
+ let signature = tap. sign ( addr1, Some ( "1" . into ( ) ) , header. bare_hash ( ) ) . unwrap ( ) ;
1966
1987
header. set_seal ( vec ! [
1967
1988
encode( & 4usize ) . into_vec( ) ,
1968
1989
encode( & ( & * signature as & [ u8 ] ) ) . into_vec( ) ,
1969
1990
:: rlp:: encode_list( & empty_steps) . into_vec( ) ,
1970
1991
] ) ;
1971
1992
1972
- assert ! ( match engine. verify_block_family( & header, & parent_header) {
1973
- Ok ( _) => true ,
1974
- _ => false ,
1975
- } ) ;
1993
+ assert ! ( engine. verify_block_family( & header, & parent_header) . is_ok( ) ) ;
1976
1994
}
1977
1995
1978
1996
#[ test]
0 commit comments