@@ -1788,6 +1788,73 @@ impl NakamotoChainState {
1788
1788
}
1789
1789
}
1790
1790
1791
+ /// Get the current burnchain view
1792
+ /// This is either:
1793
+ /// (1) set by the tenure change tx if one exists
1794
+ /// (2) the same as parent block id
1795
+ pub fn get_block_burn_view (
1796
+ sort_db : & SortitionDB ,
1797
+ next_ready_block : & NakamotoBlock ,
1798
+ parent_header_info : & StacksHeaderInfo ,
1799
+ ) -> Result < ConsensusHash , ChainstateError > {
1800
+ let burnchain_view = if let Some ( tenure_change) = next_ready_block. get_tenure_tx_payload ( ) {
1801
+ if let Some ( ref parent_burn_view) = parent_header_info. burn_view {
1802
+ // check that the tenure_change's burn view descends from the parent
1803
+ let parent_burn_view_sn = SortitionDB :: get_block_snapshot_consensus (
1804
+ sort_db. conn ( ) ,
1805
+ parent_burn_view,
1806
+ ) ?
1807
+ . ok_or_else ( || {
1808
+ warn ! (
1809
+ "Cannot process Nakamoto block: could not find parent block's burnchain view" ;
1810
+ "consensus_hash" => %next_ready_block. header. consensus_hash,
1811
+ "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1812
+ "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1813
+ "parent_block_id" => %next_ready_block. header. parent_block_id
1814
+ ) ;
1815
+ ChainstateError :: InvalidStacksBlock ( "Failed to load burn view of parent block ID" . into ( ) )
1816
+ } ) ?;
1817
+ let handle = sort_db. index_handle_at_ch ( & tenure_change. burn_view_consensus_hash ) ?;
1818
+ let connected_sort_id = get_ancestor_sort_id ( & handle, parent_burn_view_sn. block_height , & handle. context . chain_tip ) ?
1819
+ . ok_or_else ( || {
1820
+ warn ! (
1821
+ "Cannot process Nakamoto block: could not find parent block's burnchain view" ;
1822
+ "consensus_hash" => %next_ready_block. header. consensus_hash,
1823
+ "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1824
+ "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1825
+ "parent_block_id" => %next_ready_block. header. parent_block_id
1826
+ ) ;
1827
+ ChainstateError :: InvalidStacksBlock ( "Failed to load burn view of parent block ID" . into ( ) )
1828
+ } ) ?;
1829
+ if connected_sort_id != parent_burn_view_sn. sortition_id {
1830
+ warn ! (
1831
+ "Cannot process Nakamoto block: parent block's burnchain view does not connect to own burn view" ;
1832
+ "consensus_hash" => %next_ready_block. header. consensus_hash,
1833
+ "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1834
+ "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1835
+ "parent_block_id" => %next_ready_block. header. parent_block_id
1836
+ ) ;
1837
+ return Err ( ChainstateError :: InvalidStacksBlock (
1838
+ "Does not connect to burn view of parent block ID" . into ( ) ,
1839
+ ) ) ;
1840
+ }
1841
+ }
1842
+ tenure_change. burn_view_consensus_hash
1843
+ } else {
1844
+ parent_header_info. burn_view . clone ( ) . ok_or_else ( || {
1845
+ warn ! (
1846
+ "Cannot process Nakamoto block: parent block does not have a burnchain view and current block has no tenure tx" ;
1847
+ "consensus_hash" => %next_ready_block. header. consensus_hash,
1848
+ "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1849
+ "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1850
+ "parent_block_id" => %next_ready_block. header. parent_block_id
1851
+ ) ;
1852
+ ChainstateError :: InvalidStacksBlock ( "Failed to load burn view of parent block ID" . into ( ) )
1853
+ } ) ?
1854
+ } ;
1855
+ Ok ( burnchain_view)
1856
+ }
1857
+
1791
1858
/// Process the next ready block.
1792
1859
/// If there exists a ready Nakamoto block, then this method returns Ok(Some(..)) with the
1793
1860
/// receipt. Otherwise, it returns Ok(None).
@@ -1920,62 +1987,8 @@ impl NakamotoChainState {
1920
1987
// this is either:
1921
1988
// (1) set by the tenure change tx if one exists
1922
1989
// (2) the same as parent block id
1923
-
1924
- let burnchain_view = if let Some ( tenure_change) = next_ready_block. get_tenure_tx_payload ( ) {
1925
- if let Some ( ref parent_burn_view) = parent_header_info. burn_view {
1926
- // check that the tenure_change's burn view descends from the parent
1927
- let parent_burn_view_sn = SortitionDB :: get_block_snapshot_consensus (
1928
- sort_db. conn ( ) ,
1929
- parent_burn_view,
1930
- ) ?
1931
- . ok_or_else ( || {
1932
- warn ! (
1933
- "Cannot process Nakamoto block: could not find parent block's burnchain view" ;
1934
- "consensus_hash" => %next_ready_block. header. consensus_hash,
1935
- "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1936
- "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1937
- "parent_block_id" => %next_ready_block. header. parent_block_id
1938
- ) ;
1939
- ChainstateError :: InvalidStacksBlock ( "Failed to load burn view of parent block ID" . into ( ) )
1940
- } ) ?;
1941
- let handle = sort_db. index_handle_at_ch ( & tenure_change. burn_view_consensus_hash ) ?;
1942
- let connected_sort_id = get_ancestor_sort_id ( & handle, parent_burn_view_sn. block_height , & handle. context . chain_tip ) ?
1943
- . ok_or_else ( || {
1944
- warn ! (
1945
- "Cannot process Nakamoto block: could not find parent block's burnchain view" ;
1946
- "consensus_hash" => %next_ready_block. header. consensus_hash,
1947
- "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1948
- "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1949
- "parent_block_id" => %next_ready_block. header. parent_block_id
1950
- ) ;
1951
- ChainstateError :: InvalidStacksBlock ( "Failed to load burn view of parent block ID" . into ( ) )
1952
- } ) ?;
1953
- if connected_sort_id != parent_burn_view_sn. sortition_id {
1954
- warn ! (
1955
- "Cannot process Nakamoto block: parent block's burnchain view does not connect to own burn view" ;
1956
- "consensus_hash" => %next_ready_block. header. consensus_hash,
1957
- "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1958
- "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1959
- "parent_block_id" => %next_ready_block. header. parent_block_id
1960
- ) ;
1961
- return Err ( ChainstateError :: InvalidStacksBlock (
1962
- "Does not connect to burn view of parent block ID" . into ( ) ,
1963
- ) ) ;
1964
- }
1965
- }
1966
- tenure_change. burn_view_consensus_hash
1967
- } else {
1968
- parent_header_info. burn_view . clone ( ) . ok_or_else ( || {
1969
- warn ! (
1970
- "Cannot process Nakamoto block: parent block does not have a burnchain view and current block has no tenure tx" ;
1971
- "consensus_hash" => %next_ready_block. header. consensus_hash,
1972
- "stacks_block_hash" => %next_ready_block. header. block_hash( ) ,
1973
- "stacks_block_id" => %next_ready_block. header. block_id( ) ,
1974
- "parent_block_id" => %next_ready_block. header. parent_block_id
1975
- ) ;
1976
- ChainstateError :: InvalidStacksBlock ( "Failed to load burn view of parent block ID" . into ( ) )
1977
- } ) ?
1978
- } ;
1990
+ let burnchain_view =
1991
+ Self :: get_block_burn_view ( sort_db, & next_ready_block, & parent_header_info) ?;
1979
1992
let Some ( burnchain_view_sn) =
1980
1993
SortitionDB :: get_block_snapshot_consensus ( sort_db. conn ( ) , & burnchain_view) ?
1981
1994
else {
0 commit comments