• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tari-project / tari / 18279939245

06 Oct 2025 11:53AM UTC coverage: 58.602% (-1.0%) from 59.56%
18279939245

push

github

web-flow
feat: track ConsensusConstants to detect network changes and notify user (#7533)

## Problem

The minotari_node currently has no mechanism to detect when
ConsensusConstants have changed between restarts. This creates a risk
where a node operator might unknowingly run an incompatible version
after consensus rule changes have already taken effect, potentially
leading to network fork issues or sync problems.

## Solution

This PR implements a lightweight ConsensusConstants tracking system
that:

1. **Stores consensus constants** on each startup in
`{data_dir}/consensus_constants.json`
2. **Compares constants** between restarts to detect changes
3. **Validates timing** - only raises errors when new constants are
already active at current blockchain height
4. **Provides clear feedback** to users about potential network
compatibility issues

## Implementation Details

### New Components

- **ConsensusConstantsTracker**: A new module that handles persistence
and comparison of consensus constants
- **Integration point**: Added to node startup flow in `builder.rs`
after database initialization but before node start
- **Minimal storage**: Only tracks essential fields needed for
compatibility detection

### User Experience

The implementation provides different behaviors based on the situation:

- **First startup**: Silent operation, creates tracking file
- **No changes**: Silent operation, continues normally  
- **Constants changed, not yet active**: Info log message, continues
normally
- **Constants changed, already active**: **Critical error with clear
message and exit**

Example error message:
```
CRITICAL: Consensus constants have changed and the new constants are already active!
Current height: 15000
Active consensus constants changed from effective height 0 to 15000  
This indicates a potential network fork or version mismatch.
Please verify you are running the correct version of the node for this network.
```

### Files Changed

- `base_layer/core/src/ch... (continued)

67 of 70 new or added lines in 7 files covered. (95.71%)

1118 existing lines in 28 files now uncovered.

66535 of 113537 relevant lines covered (58.6%)

550271.13 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/base_layer/core/src/base_node/proto/rpc.rs
1
//  Copyright 2020, The Tari Project
2
//
3
//  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
4
//  following conditions are met:
5
//
6
//  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
7
//  disclaimer.
8
//
9
//  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
10
//  following disclaimer in the documentation and/or other materials provided with the distribution.
11
//
12
//  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
13
//  products derived from this software without specific prior written permission.
14
//
15
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
16
//  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
//  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
18
//  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19
//  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
20
//  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
21
//  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22

23
use std::convert::{TryFrom, TryInto};
24

25
use tari_node_components::blocks::Block;
26
use tari_transaction_components::rpc::models::FeePerGramStat;
27
use tari_utilities::ByteArray;
28

29
use crate::proto::base_node as proto;
30

31
impl TryFrom<Block> for proto::BlockBodyResponse {
32
    type Error = String;
33

UNCOV
34
    fn try_from(block: Block) -> Result<Self, Self::Error> {
×
35
        Ok(Self {
UNCOV
36
            hash: block.hash().to_vec(),
×
UNCOV
37
            body: Some(block.body.try_into()?),
×
38
        })
UNCOV
39
    }
×
40
}
41

42
impl From<Vec<FeePerGramStat>> for proto::GetMempoolFeePerGramStatsResponse {
43
    fn from(stats: Vec<FeePerGramStat>) -> Self {
×
44
        Self {
×
45
            stats: stats.into_iter().map(Into::into).collect(),
×
46
        }
×
47
    }
×
48
}
49

50
impl From<FeePerGramStat> for proto::MempoolFeePerGramStat {
51
    fn from(stat: FeePerGramStat) -> Self {
×
52
        Self {
×
53
            order: stat.order,
×
54
            min_fee_per_gram: stat.min_fee_per_gram.as_u64(),
×
55
            avg_fee_per_gram: stat.avg_fee_per_gram.as_u64(),
×
56
            max_fee_per_gram: stat.max_fee_per_gram.as_u64(),
×
57
        }
×
58
    }
×
59
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc