> For the complete documentation index, see [llms.txt](https://docs.bifrostnetwork.com/kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bifrostnetwork.com/kr/developer-documentations/pallet-interfaces/bfcstaking.md).

# BfcStaking

### Description

바이프로스트 노드의 핵심 DPoS (위임 지분 증명) 합의 메커니즘은 `pallet_bfc_staking`에 정의되어 있습니다. `pallet_bfc_staking`은 검증자 (validator)와 지명자 (nominator)의 개념을 정의하고 이들의 자체 스테이킹 (self-bonds) 및 지명 (nominations)을 관리하는 사용자 정의 팔렛입니다. 또한 라운드 (rounds) 개념과 라운드 내의 로직도 정의합니다.

### Extrinsics

**set\_staking\_expectations(expectations: `Range<BalanceOf>`)**

* interface: `api.tx.bfcStaking.setStakingExpectations`
* summary: 총 스테이킹 기대치를 설정합니다. 이 기대치는 해당 라운드의 발행량을 결정합니다. 오리진은 루트 (root)여야 합니다.

**set\_inflation(schedule: `Range<Perbill>`)**

* interface: `api.tx.bfcStaking.setInflation`
* summary: 라운드별 인플레이션을 도출하기 위한 연간 인플레이션율을 설정합니다. 오리진은 루트 (root)여야 합니다.

**set\_max\_full\_selected(new: `u32`)**

* interface: `api.tx.bfcStaking.setMaxFullSelected`
* summary: 라운드당 선택되는 풀 검증자 후보의 최대 수를 설정합니다. 오리진은 루트 (root)여야 합니다.

**set\_basic\_full\_selected(new: `u32`)**

* interface: `api.tx.bfcStaking.setMaxBasicSelected`
* summary: 라운드당 선택되는 기본 검증자 후보의 최대 수를 설정합니다. 오리진은 루트 (root)여야 합니다.

**set\_min\_total\_selected(new: `u32`)**

* interface: `api.tx.bfcStaking.setMinTotalSelected`
* summary: 라운드당 선택되는 검증자 후보의 최소 수를 설정합니다. 오리진은 루트 (root)여야 합니다.

**set\_default\_validator\_commission(new: `Perbill`, tier: `TierType`)**

* interface: `api.tx.bfcStaking.setDefaultValidatorCommission`
* summary: 주어진 티어(tier)의 모든 검증자에 대한 기본 수수료율을 설정합니다. 오리진은 루트 (root)여야 합니다.

**set\_max\_validator\_commission(new: `Perbill`, tier: `TierType`)**

* interface: `api.tx.bfcStaking.setMaxValidatorCommission`
* summary: 주어진 티어(tier)의 모든 검증자에 대한 최대 수수료율을 설정합니다. 오리진은 루트 (root)여야 합니다.

**set\_validator\_commission(new: `Perbill`)**

* interface: `api.tx.bfcStaking.setValidatorCommission`
* summary: 주어진 검증자의 수수료율을 설정합니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**set\_validator\_tier(more: `BalanceOf`, new: `TierType`, relayer?: `AccountId`)**

* interface: `api.tx.bfcStaking.setValidatorTier`
* summary: 검증자 후보 티어(tier)를 수정합니다. 실제 상태 반영은 다음 라운드에 적용됩니다. 오리진은 스태시 계정(stash account)이어야 합니다.

**set\_blocks\_per\_round(new: `u32`)**

* interface: `api.tx.bfcStaking.setBlocksPerRound`
* summary: 라운드당 블록 수를 설정합니다. 새로운 라운드 길이는 다음 블록에서 즉시 업데이트됩니다. 이는 라운드당 인플레이션 설정도 업데이트합니다. 오리진은 루트 (root)여야 합니다.

**set\_storage\_cache\_lifetime(new: `u32`)**

* interface: `api.tx.bfcStaking.setStorageCacheLifetime`
* summary: StorageCacheLifetime 라운드 길이를 설정합니다. 오리진은 루트 (root)여야 합니다.

**join\_candidates(controller: `AccountId`, relayer?: `AccountId`, bond: `BalanceOf`, candidate\_count: `u32`)**

* interface: `api.tx.bfcStaking.joinCandidates`
* summary: 검증자 후보 집합에 합류합니다. 오리진은 스태시 계정 (stash account)이어야 합니다.

**schedule\_leave\_candidates(candidate\_count: `u32`)**

* interface: `api.tx.bfcStaking.scheduleLeaveCandidates`
* summary: 후보 집합을 떠날 것을 요청합니다. 성공 시, 해당 계정은 검증자로 선택되는 것을 방지하기 위해 후보 풀에서 즉시 제거됩니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**execute\_leave\_candidates(candidate\_nomination\_count: `u32`)**

* interface: `api.tx.bfcStaking.executeLeaveCandidates`
* summary: 후보 떠나기 요청을 실행합니다. 오리진은 스태시 계정 (stash account)이어야 합니다.

**cancel\_leave\_candidates(candidate\_count: `u32`)**

* interface: `api.tx.bfcStaking.cancelLeaveCandidates`
* summary: 후보 떠나기 보류 중인 요청을 취소합니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**set\_controller(new: `AccountId`)**

* interface: `api.tx.bfcStaking.setController`
* summary: 본딩된 컨트롤러 계정을 (재)설정합니다. 오리진은 본딩된 스태시 계정 (stash account)이어야 합니다. 실제 변경 사항은 다음 라운드 업데이트에 적용됩니다. 오리진은 스태시 계정 (stash account)이어야 합니다.

**set\_candidate\_reward\_dst(new\_reward\_dst: `RewardDestination`)**

* interface: `api.tx.bfcStaking.setCandidateRewardDst`
* summary: 검증자 후보 보상 목적지를 설정합니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**set\_nominator\_reward\_dst(new\_reward\_dst: `RewardDestination`)**

* interface: `api.tx.bfcStaking.setNominatorRewardDst`
* summary: 지명자 보상 목적지를 설정합니다.

**go\_offline()**

* interface: `api.tx.bfcStaking.goOffline`
* summary: 언본딩 (unbonding) 없이 일시적으로 검증자 후보 집합을 떠납니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**go\_online()**

* interface: `api.tx.bfcStaking.goOnline`
* summary: 이전에 강제 퇴출되거나 오프라인 상태였던 경우 검증자 후보 집합에 다시 합류합니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**candidate\_bond\_more(more: `BalanceOf`)**

* interface: `api.tx.bfcStaking.candidateBondMore`
* summary: 검증자 후보의 자체 본딩을 더 늘립니다. 오리진은 스태시 계정 (stash account)이어야 합니다.

**schedule\_candidate\_bond\_less(less: `BalanceOf`)**

* interface: `api.tx.bfcStaking.scheduleCandidateBondLess`
* summary: 검증자 후보가 자체 본딩을 줄이도록 요청합니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**execute\_candidate\_bond\_less()**

* interface: `api.tx.bfcStaking.executeCandidateBondLess`
* summary: 검증자 후보 자체 본딩 조정을 위한 보류 중인 요청을 실행합니다. 오리진은 스태시 계정 (stash account)이어야 합니다.

**cancel\_candidate\_bond\_less()**

* interface: `api.tx.bfcStaking.cancelCandidateBondLess`
* summary: 검증자 후보 자체 본딩 조정을 위한 보류 중인 요청을 취소합니다. 오리진은 컨트롤러 계정 (controller account)이어야 합니다.

**nominate(candidate: `AccountId`, amount: `BalanceOf`, candidate\_nomination\_count: `u32`, nomination\_count: `u32`)**

* interface: `api.tx.bfcStaking.nominate`
* summary: 주어진 후보자를 지명합니다.

**schedule\_leave\_nominators()**

* interface: `api.tx.bfcStaking.scheduleLeaveNominators`
* summary: 지명자 (nominator) 집합을 떠날 것을 요청합니다.

**execute\_leave\_nominators(nomination\_count: `u32`)**

* interface: `api.tx.bfcStaking.executeLeaveNominators`
* summary: 지명자 집합을 떠나고 진행 중인 모든 지명을 철회할 권한을 실행합니다.

**cancel\_leave\_nominators()**

* interface: `api.tx.bfcStaking.cancelLeaveNominators`
* summary: 지명자 집합을 떠나기 위한 보류 중인 요청을 취소합니다.

**schedule\_revoke\_nomination(validator: `AccountId`)**

* interface: `api.tx.bfcStaking.scheduleRevokeNomination`
* summary: 기존 지명을 철회할 것을 요청합니다.

**nominator\_bond\_more(candidate: `AccountId`, more: `BalanceOf`)**

* interface: `api.tx.bfcStaking.nominatorBondMore`
* summary: 특정 검증자 후보에게 더 많은 본딩을 합니다.

**schedule\_nominator\_bond\_less(candidate: `AccountId`, less: `BalanceOf`)**

* interface: `api.tx.bfcStaking.scheduleNominatorBondLess`
* summary: 특정 검증자 후보에게 더 적은 본딩을 요청합니다.

**execute\_nomination\_request(candidate: `AccountId`)**

* interface: `api.tx.bfcStaking.executeNominationRequest`
* summary: 기존 지명을 변경하기 위한 보류 중인 요청을 실행합니다.

**cancel\_nomination\_request(candidate: `AccountId`)**

* interface: `api.tx.bfcStaking.cancelNominationRequest`
* summary: 기존 지명 변경 요청을 취소합니다.

### Storage Values

**Session(): `SessionIndex`**

* interface: `api.query.bfcStaking.session`
* summary: 현재 라운드의 현재 세션 인덱스.

**Round(): `RoundInfo<T::BlockNumber>`**

* interface: `api.query.bfcStaking.round`
* summary: 현재 라운드 인덱스 및 특정 정보.

**StorageCacheLifetime(): `u32`**

* interface: `api.query.bfcStaking.storageCacheLifetime`
* summary: 스토리지 데이터가 캐시될 수 있는 최대 스토리지 수명.

**DefaultFullValidatorCommission(): `Perbill`**

* interface: `api.query.bfcStaking.defaultFullValidatorCommission`
* summary: 풀 검증자를 위한 기본 수수료율.

**DefaultBasicValidatorCommission(): `Perbill`**

* interface: `api.query.bfcStaking.defaultBasicValidatorCommission`
* summary: 기본 검증자를 위한 기본 수수료율.

**MaxFullValidatorCommission(): `Perbill`**

* interface: `api.query.bfcStaking.maxFullValidatorCommission`
* summary: 풀 검증자를 위한 최대 수수료율.

**MaxBasicValidatorCommission(): `Perbill`**

* interface: `api.query.bfcStaking.maxBasicValidatorCommission`
* summary: 기본 검증자를 위한 최대 수수료율.

**MaxTotalSelected(): `u32`**

* interface: `api.query.bfcStaking.maxTotalSelected`
* summary: 매 라운드마다 선택되는 최대 노드 후보 수.

**MaxFullSelected(): `u32`**

* interface: `api.query.bfcStaking.maxFullSelected`
* summary: 매 라운드마다 선택되는 최대 풀 노드 후보 수.

**MaxBasicSelected(): `u32`**

* interface: `api.query.bfcStaking.maxBasicSelected`
* summary: 매 라운드마다 선택되는 최대 기본 노드 후보 수.

**MinTotalSelected(): `u32`**

* interface: `api.query.bfcStaking.minTotalSelected`
* summary: 매 라운드마다 선택되는 최소 후보 수.

**ProductivityPerBlock(): `Perbill`**

* interface: `api.query.bfcStaking.productivityPerBlock`
* summary: 현재 라운드에서 블록 생산당 생산성 비율.

**NominatorState(`AccountId`): `Option<Nominator<AccountId, BalanceOf>>`**

* interface: `api.query.bfcStaking.nominatorState`
* summary: 계정이 지명자인 경우 해당 계정과 연결된 지명자 상태를 가져오고, 그렇지 않으면 None.

**CandidateInfo(`AccountId`): `Option<CandidateMetadata<AccountId, BalanceOf, BlockNumberOf>>`**

* interface: `api.query.bfcStaking.candidateInfo`
* summary: 계정이 후보자인 경우 해당 계정과 연결된 검증자 후보 정보를 가져오고, 그렇지 않으면 None.

**BondedStash(`AccountId`): `Option<AccountId>`**

* interface: `api.query.bfcStaking.bondedStash`
* summary: 모든 잠긴 "스태시" 계정에서 컨트롤러 계정으로의 매핑.

**TopNominations(`AccountId`): `Option<Nominations<AccountId, BalanceOf>>`**

* interface: `api.query.bfcStaking.topNominations`
* summary: 검증자 후보를 위한 상위 지명.

**BottomNominations(`AccountId`): `Option<Nominations<AccountId, BalanceOf>>`**

* interface: `api.query.bfcStaking.bottomNominations`
* summary: 검증자 후보를 위한 하위 지명.

**SelectedCandidates(): `Vec<AccountId>`**

* interface: `api.query.bfcStaking.selectedCandidates`
* summary: 현재 라운드를 위해 선택된 활성 검증자 세트 (풀 및 기본).

**SelectedFullCandidates(): `Vec<AccountId>`**

* interface: `api.query.bfcStaking.selectedFullCandidates`
* summary: 현재 라운드를 위해 선택된 활성 풀 검증자 세트.

**SelectedBasicCandidates(): `Vec<AccountId>`**

* interface: `api.query.bfcStaking.selectedBasicCandidates`
* summary: 현재 라운드를 위해 선택된 활성 기본 검증자 세트.

**CachedSelectedCandidates(): `Vec<(RoundIndex, Vec<AccountId>)>`**

* interface: `api.query.bfcStaking.cachedSelectedCandidates`
* summary: 전 라운드에서 선택된 캐시된 활성 검증자 세트.

**Majority(): `u32`**

* interface: `api.query.bfcStaking.majority`
* summary: 현재 활성 검증자 세트의 Majority.

**CachedMajority(): `Vec<(RoundIndex, u32)>`**

* interface: `api.query.bfcStaking.cachedMajority`
* summary: 이전 라운드에서 선택된 활성 검증자 세트를 기반으로 캐시된 Majority.

**Total(): `BalanceOf`**

* interface: `api.query.bfcStaking.total`
* summary: 이 스테이킹 팔렛(pallet)에 의해 잠긴 총 자본.

**CandidatePool(): `Vec<Bond<AccountId, BalanceOf>>`**

* interface: `api.query.bfcStaking.candidatePool`
* summary: 검증자 후보 풀, 각 후보는 총 투표력을 가짐.

**AtStake(`RoundIndex`): `ValidatorSnapshot<AccountId, BalanceOf>`**

* interface: `api.query.bfcStaking.atStake`
* summary: 라운드 시작 시 검증자 지명 스테이크 스냅샷.

**TotalAtStake(`RoundIndex`): `Option<TotalSnapshot<BalanceOf>>`**

* interface: `api.query.bfcStaking.totalAtStake`
* summary: 라운드 시작 시 네트워크 상태 스냅샷.

**DelayedPayouts(`RoundIndex`): `Option<DelayedPayout<BalanceOf>>`**

* interface: `api.query.bfcStaking.delayedPayouts`
* summary: 지연된 보상 지급.

**DelayedControllerSets(`RoundIndex`): `Vec<DelayedControllerSet<AccountId>>`**

* interface: `api.query.bfcStaking.delayedControllerSets`
* summary: 지연된 새 컨트롤러 계정 설정 요청.

**Staked(`RoundIndex`): `BalanceOf`**

* interface: `api.query.bfcStaking.staked`
* summary: 라운드에서 선택된 후보자에 대해 집계된 총 스테이크.

**InflationConfig(): `InflationInfo<BalanceOf>`**

* interface: `api.query.bfcStaking.inflationConfig`
* summary: 인플레이션 설정.

**Points(`RoundIndex`): `RewardPoint`**

* interface: `api.query.bfcStaking.points`
* summary: 라운드에서 블록 생산에 대해 검증자에게 부여된 총 점수.

**AwardedPts(`AccountId`): `RewardPoint`**

* interface: `api.query.bfcStaking.awardedPts`
* summary: 라운드당 각 검증자에 대한 점수.

**AwardedTokens(): `BalanceOf`**

* interface: `api.query.bfcStaking.awardedTokens`
* summary: 제네시스(genesis) 이후 검증자와 지명자에게 부여된 토큰.

### Constants

**DefaultBlocksPerSession: `u32`**

* interface: `api.consts.bfcStaking.defaultBlocksPerSession`
* summary: 제네시스 (genesis) 시점의 기본 세션당 블록 수.

**DefaultBlocksPerRound: `u32`**

* interface: `api.consts.bfcStaking.defaultBlocksPerRound`
* summary: 제네시스 (genesis) 시점의 기본 라운드당 블록 수.

**MinBlocksPerRound: `u32`**

* interface: `api.consts.bfcStaking.minBlocksPerRound`
* summary: 제네시스 (genesis) 시점의 기본 최소 라운드당 블록 수.

**StorageCacheLifetimeInRounds: `u32`**

* interface: `api.consts.bfcStaking.storageCacheLifetimeInRounds`
* summary: 특정 스토리지 데이터가 캐시될 수 있는 라운드 기준 최대 수명.

**LeaveCandidatesDelay: `RoundIndex`**

* interface: `api.consts.bfcStaking.leaveCandidatesDelay`
* summary: 후보자가 종료 요청을 실행하기 전에 본딩된 상태로 유지되는 라운드 수.

**CandidateBondLessDelay: `RoundIndex`**

* interface: `api.consts.bfcStaking.candidateBondLessDelay`
* summary: 후보자가 자체 본딩을 줄이도록 요청한 후 실행 가능해지기까지 기다려야 하는 라운드 수.

**LeaveNominatorsDelay: `RoundIndex`**

* interface: `api.consts.bfcStaking.leaveNominatorsDelay`
* summary: 지명자가 종료 요청을 실행하기 전에 본딩된 상태로 유지되는 라운드 수.

**RevokeNominationDelay: `RoundIndex`**

* interface: `api.consts.bfcStaking.revokeNominationDelay`
* summary: 지명 철회 요청을 실행하기 전에 지명이 본딩된 상태로 유지되는 라운드 수.

**NominationBondLessDelay: `RoundIndex`**

* interface: `api.consts.bfcStaking.nominationBondLessDelay`
* summary: 지명 감소 요청이 실행 가능해지기까지 기다려야 하는 라운드 수.

**RewardPaymentDelay: `RoundIndex`**

* interface: `api.consts.bfcStaking.rewardPaymentDelay`
* summary: 블록 저자에게 보상이 지급되는 시점까지의 라운드 수.

**DefaultMaxSelectedFullCandidates: `u32`**

* interface: `api.consts.bfcStaking.defaultMaxSelectedFullCandidates`
* summary: 매 라운드마다 선택되는 기본 최대 풀 노드 후보 수.

**DefaultMaxSelectedBasicCandidates: `u32`**

* interface: `api.consts.bfcStaking.defaultMaxSelectedBasicCandidates`
* summary: 매 라운드마다 선택되는 기본 최대 기본 노드 후보 수.

**DefaultMinSelectedCandidates: `u32`**

* interface: `api.consts.bfcStaking.defaultMinSelectedCandidates`
* summary: 매 라운드마다 선택되는 기본 최소 후보 수 (풀 및 기본).

**MaxTopNominationsPerCandidate: `u32`**

* interface: `api.consts.bfcStaking.maxTopNominationsPerCandidate`
* summary: 후보자당 집계되는 최대 상위 지명 수.

**MaxBottomNominationsPerCandidate: `u32`**

* interface: `api.consts.bfcStaking.maxBottomNominationsPerCandidate`
* summary: 후보자당 집계되는 최대 하위 지명 수.

**MaxNominationsPerNominator: `u32`**

* interface: `api.consts.bfcStaking.maxNominationsPerNominator`
* summary: 지명자당 최대 지명 수.

**DefaultFullValidatorCommission: `Perbill`**

* interface: `api.consts.bfcStaking.defaultFullValidatorCommission`
* summary:풀 검증자를 위한 기본 수수료율.

**DefaultBasicValidatorCommission: `Perbill`**

* interface: `api.consts.bfcStaking.defaultBasicValidatorCommission`
* summary: 기본 검증자를 위한 기본 수수료율.

**MaxFullValidatorCommission: `Perbill`**

* interface: `api.consts.bfcStaking.maxFullValidatorCommission`
* summary: 풀 검증자를 위해 사용 가능한 최대 수수료율.

**MaxBasicValidatorCommission: `Perbill`**

* interface: `api.consts.bfcStaking.maxBasicValidatorCommission`
* summary: 기본 검증자를 위해 사용 가능한 최대 수수료율.

**MinFullValidatorStk: `BalanceOf`**

* interface: `api.consts.bfcStaking.minFullValidatorStk`
* summary: 라운드의 `SelectedCandidates`에 포함되기 위한 모든 풀 노드 후보에게 요구되는 최소 스테이크.

**MinBasicValidatorStk: `BalanceOf`**

* interface: `api.consts.bfcStaking.minBasicValidatorStk`
* summary: 라운드의 `SelectedCandidates`에 포함되기 위한 모든 기본 노드 후보에게 요구되는 최소 스테이크.

**MinFullCandidateStk: `BalanceOf`**

* interface: `api.consts.bfcStaking.minFullCandidateStk`
* summary: 풀 검증자 후보가 되기 위한 모든 계정에게 요구되는 최소 스테이크.

**MinBasicCandidateStk: `BalanceOf`**

* interface: `api.consts.bfcStaking.minBasicCandidateStk`
* summary: 기본 검증자 후보가 되기 위한 모든 계정에게 요구되는 최소 스테이크.

**MinNominatorStk: `BalanceOf`**

* interface: `api.consts.bfcStaking.minNominatorStk`
* summary: 온체인에 등록된 모든 계정이 지명자가 되기 위한 최소 스테이크.
