本文分析BSC验证者退出的各种方式、存在的问题以及实际可行的退出策略。
// StakeHub层面:管理质押和委托
contract StakeHub {
mapping(address => Validator) private _validators;
uint256 public unbondPeriod = 7 days;
}
// BSCValidatorSet层面:管理共识验证者集合
contract BSCValidatorSet {
Validator[] public currentValidatorSet;
ValidatorExtra[] public validatorExtraSet;
}
进入维护模式
function enterMaintenance() external initValidatorExtraSet {
uint256 index = getCurrentValidatorIndex(msg.sender);
require(canEnterMaintenance(index), "can not enter Temporary Maintenance");
_enterMaintenance(msg.sender, index);
}
function _enterMaintenance(address validator, uint256 index) private {
++numOfMaintaining;
validatorExtraSet[index].isMaintaining = true;
validatorExtraSet[index].enterMaintenanceHeight = block.number;
emit validatorEnterMaintenance(validator);
}
2. 减少自委托退出(推荐)
![image]()
委托人解押
function undelegate(address operatorAddress, uint256 shares) external {
uint256 bnbAmount = IStakeCredit(valInfo.creditContract).undelegate(delegator, shares);
// 触发自委托检查
if (delegator == operatorAddress) {
_checkValidatorSelfDelegation(operatorAddress);
}
}
function _checkValidatorSelfDelegation(address operatorAddress) internal {
if (IStakeCredit(valInfo.creditContract).getPooledBNB(operatorAddress) < minSelfDelegationBNB) {
_jailValidator(valInfo, block.timestamp + downtimeJailTime); // 监禁2天
IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(valInfo.consensusAddress); // 永久移除
}
}
// StakeCredit.sol:119-120
function undelegate(address delegator, uint256 shares) external onlyStakeHub returns (uint256 bnbAmount) {
// 设置解锁时间为当前时间 + 7天
uint256 unlockTime = block.timestamp + IStakeHub(STAKE_HUB_ADDR).unbondPeriod();
UnbondRequest memory request = UnbondRequest({
shares: shares,
bnbAmount: bnbAmount,
unlockTime: unlockTime // 7天后才能解锁
});
}
// StakeCredit.sol:161
function claim(address payable delegator, uint256 number) external onlyStakeHub nonReentrant returns (uint256) {
while (number != 0) {
UnbondRequest memory request = _unbondRequests[hash];
// 关键检查:只有到了解锁时间才能提取
if (block.timestamp < request.unlockTime) {
break; // 如果还没到解锁时间,停止处理
}
// 移除队列并转账
_totalBnbAmount += request.bnbAmount;
}
}
| 退出方式 |
验证者成本 |
委托人成本 |
系统影响 |
| 维护模式 |
可能重罪惩罚 |
无 |
更新失效 |
| 减少自委托 |
2天监禁 |
7天等待期 |
正常移除 |
| 直接停止 |
10-200 BNB罚款 |
无 |
系统惩罚 |
推荐退出流程
![image]()
- ✅ 确实能退出:验证者会从BSCValidatorSet中永久移除
- 添加真正的退出函数:允许验证者主动退出,不惩罚
- 修改维护模式逻辑:不要强制退出维护中的验证者
- 添加优雅退出机制:给验证者一定时间逐步退出