需求

自定义最小的质押量,限制外部的加入门槛

代码分析

sdk/program/src/stake/instruction.rs

#[error("delegation amount is less than the minimum")]
InsufficientDelegation,

programs/stake/src/stake_state.rs

fn validate_delegated_amount(
    account: &BorrowedAccount,
    meta: &Meta,
    feature_set: &FeatureSet,
) -> Result<ValidatedDelegatedInfo, InstructionError> {
    let stake_amount = account
        .get_lamports()
        .saturating_sub(meta.rent_exempt_reserve); // 确保委托的质押金额有效。这将检查帐户是否满足委托质押的最低余额要求。如果不满足,则返回错误。

    // 质押账户可能会以低于最低委托额的质押额进行初始化,因此请在委托前检查是否满足最低要求。
    if stake_amount < crate::get_minimum_delegation(feature_set) {
        return Err(StakeError::InsufficientDelegation.into());
    }
    Ok(ValidatedDelegatedInfo { stake_amount })
}
/// 可以委托的最低股权金额,以 lampors 为单位。
/// 注意:这也用于计算股权账户的最低余额,即租金豁免储备加上最低股权委托。
#[inline(always)]
pub fn get_minimum_delegation(feature_set: &FeatureSet) -> u64 {
    if feature_set.is_active(&feature_set::stake_raise_minimum_delegation_to_1_sol::id()) {
        const MINIMUM_DELEGATION_SOL: u64 = 1;
        MINIMUM_DELEGATION_SOL * LAMPORTS_PER_SOL
    } else {
        #[allow(deprecated)]
        solana_sdk::stake::MINIMUM_STAKE_DELEGATION
    }
}

总结

目前测试验证节点,直接硬编码,设置一个较大值来限制外部加入,修改测试代码如下


/// 可以委托的最低股权金额,以 lampors 为单位。
/// 注意:这也用于计算股权账户的最低余额,即租金豁免储备加上最低股权委托。
#[inline(always)]
pub fn get_minimum_delegation(feature_set: &FeatureSet) -> u64 {
    const MINIMUM_DELEGATION_SOL: u64 = 1000000000000;
    MINIMUM_DELEGATION_SOL * LAMPORTS_PER_SOL
}