'How do i resolve type annotations needed cannot infer type for type parameter `T` ? What type annotation is needed to compile this code?

The blockchain struct definition, It defines a type and i use the type

pub struct Blockchain<T = SledDb> {
    pub storage: T,
    pub chain: Vec<Block>,
    pub tip: Arc<RwLock<String>>,
    pub height: AtomicUsize,
    pub mempool: Mempool,
    pub wallet: Wallet,
    pub accounts: Account,
    pub stakes: Stake,
    pub validators: Validator,
}

This code is checking if stake is valid.The code for mining a block, the error is immited by is_staking_valid function. I don't know what type its asking for since i already specified one.

impl<T: Storage> Blockchain<T> {
    pub fn is_staking_valid(
            balance: u64,
            difficulty: u32,
            timestamp: i64,
            prev_hash: &String,
            address: &String,
        ) -> bool {
            let base = BigUint::new(vec![2]);
            let balance_diff_mul = base.pow(256) * balance as u32;
            let balance_diff = balance_diff_mul / difficulty as u64;
    
            let data_str = format!("{}{}{}", prev_hash, address, timestamp.to_string());
            let sha256_hash = digest(data_str);
            let staking_hash = BigUint::parse_bytes(&sha256_hash.as_bytes(), 16).expect("msg");
    
            staking_hash <= balance_diff
        }
    pub fn mine_block(&mut self, data: &str) -> Option<Block> {

        if self.mempool.transactions.len() < 2 {
            info!("Skipping mining because no transaction in mempool");
            return None;
        }

        let balance = self
            .stakes
            .get_balance(&self.wallet.get_public_key())
            .clone();

        let difficulty = self.get_difficulty();
        info!("New block mining initialized with difficulty {}", difficulty);

        let timestamp = Utc::now().timestamp();
        let prev_hash = self.chain.last().unwrap().hash.clone();
        let address = self.wallet.get_public_key();


        if Blockchain::is_staking_valid(balance, difficulty, timestamp, &prev_hash, &address){

        let block = self.create_block(&data, timestamp);
        self.storage.update_blocks(&prev_hash, &block, self.height.load(Ordering::Relaxed));
        Some(block)
        } else {
           None
        }
    }
}
 

Please find the compiler error below

error[E0282]: type annotations needed
   --> src/blocks/chain.rs:173:12
    |
173 |         if Blockchain::is_staking_valid(balance, difficulty, timestamp, &prev_hash, &address){
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `T`

For more information about this error, try `rustc --explain E0282`.


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source