@@ -15,6 +15,18 @@ namespace eosio { namespace chain {
15
15
return active_schedule.producers [index ];
16
16
}
17
17
18
+ uint32_t block_header_state::calc_dpos_last_irreversible ()const {
19
+ vector<uint32_t > blocknums; blocknums.reserve ( producer_to_last_implied_irb.size () );
20
+ for ( auto & i : producer_to_last_implied_irb ) {
21
+ blocknums.push_back (i.second );
22
+ }
23
+ // / 2/3 must be greater, so if I go 1/3 into the list sorted from low to high, then 2/3 are greater
24
+
25
+ if ( blocknums.size () == 0 ) return 0 ;
26
+ // / TODO: update to nth_element
27
+ std::sort ( blocknums.begin (), blocknums.end () );
28
+ return blocknums[ (blocknums.size ()-1 ) / 3 ];
29
+ }
18
30
19
31
/* *
20
32
* Generate a template block header state for a given block time, it will not
@@ -29,28 +41,32 @@ namespace eosio { namespace chain {
29
41
} else {
30
42
(when = header.timestamp ).slot ++;
31
43
}
32
- result.header .timestamp = when;
33
- result.header .previous = id;
34
- result.header .schedule_version = active_schedule.version ;
35
-
36
- auto prokey = get_scheduled_producer (when);
37
- result.block_signing_key = prokey.block_signing_key ;
38
- result.header .producer = prokey.producer_name ;
39
-
40
- result.pending_schedule_lib_num = pending_schedule_lib_num;
41
- result.pending_schedule_hash = pending_schedule_hash;
42
- result.block_num = block_num + 1 ;
43
- result.producer_to_last_produced = producer_to_last_produced;
44
+ result.header .timestamp = when;
45
+ result.header .previous = id;
46
+ result.header .schedule_version = active_schedule.version ;
47
+
48
+ auto prokey = get_scheduled_producer (when);
49
+ result.block_signing_key = prokey.block_signing_key ;
50
+ result.header .producer = prokey.producer_name ;
51
+
52
+ result.pending_schedule_lib_num = pending_schedule_lib_num;
53
+ result.pending_schedule_hash = pending_schedule_hash;
54
+ result.block_num = block_num + 1 ;
55
+ result.producer_to_last_produced = producer_to_last_produced;
56
+ result.producer_to_last_implied_irb = producer_to_last_implied_irb;
44
57
result.producer_to_last_produced [prokey.producer_name ] = result.block_num ;
45
58
result.blockroot_merkle = blockroot_merkle;
46
59
result.blockroot_merkle .append ( id );
47
60
48
61
auto block_mroot = result.blockroot_merkle .get_root ();
49
62
50
- result.active_schedule = active_schedule;
51
- result.pending_schedule = pending_schedule;
52
- result.dpos_irreversible_blocknum = dpos_irreversible_blocknum;
53
- result.bft_irreversible_blocknum = bft_irreversible_blocknum;
63
+ result.active_schedule = active_schedule;
64
+ result.pending_schedule = pending_schedule;
65
+ result.dpos_proposed_irreversible_blocknum = dpos_proposed_irreversible_blocknum;
66
+ result.bft_irreversible_blocknum = bft_irreversible_blocknum;
67
+
68
+ result.producer_to_last_implied_irb [prokey.producer_name ] = result.dpos_proposed_irreversible_blocknum ;
69
+ result.dpos_irreversible_blocknum = result.calc_dpos_last_irreversible ();
54
70
55
71
// / grow the confirmed count
56
72
static_assert (std::numeric_limits<uint8_t >::max () >= (config::max_producers * 2 / 3 ) + 1 , " 8bit confirmations may not be able to hold all of the needed confirmations" );
@@ -88,7 +104,19 @@ namespace eosio { namespace chain {
88
104
new_producer_to_last_produced[pro.producer_name ] = dpos_irreversible_blocknum;
89
105
}
90
106
}
107
+
108
+ flat_map<account_name,uint32_t > new_producer_to_last_implied_irb;
109
+ for ( const auto & pro : active_schedule.producers ) {
110
+ auto existing = producer_to_last_implied_irb.find ( pro.producer_name );
111
+ if ( existing != producer_to_last_implied_irb.end () ) {
112
+ new_producer_to_last_implied_irb[pro.producer_name ] = existing->second ;
113
+ } else {
114
+ new_producer_to_last_implied_irb[pro.producer_name ] = dpos_irreversible_blocknum;
115
+ }
116
+ }
117
+
91
118
producer_to_last_produced = move ( new_producer_to_last_produced );
119
+ producer_to_last_implied_irb = move ( new_producer_to_last_implied_irb);
92
120
producer_to_last_produced[header.producer ] = block_num;
93
121
94
122
return true ;
@@ -175,7 +203,7 @@ namespace eosio { namespace chain {
175
203
if ( confirm_count[i] == 0 )
176
204
{
177
205
uint32_t block_num_for_i = block_num - (uint32_t )(confirm_count.size () - 1 - i);
178
- dpos_irreversible_blocknum = block_num_for_i;
206
+ dpos_proposed_irreversible_blocknum = block_num_for_i;
179
207
// idump((dpos2_lib)(block_num)(dpos_irreversible_blocknum));
180
208
181
209
if (i == confirm_count.size () - 1 ) {
0 commit comments