(▼ 그때그때 이해가 잘되는 것으로 작성했습니다)
스테이크 == 지분 == 보유한 솔라나
위임 == validator에게 스테이크를 맡기는 것 == validator를 통한 스테이킹
솔라나를 보유한 지갑 계정에서 여러 스테이크 계정을 만들어 각 validator에게 위임할 수 있다.
스테이크 계정(stake account)은 기존의 지갑 주소(system account로 알려져 있다고 함)와 다르게 생성되고 관리된다.
시스템 계정은 네트워크 상의 다른 계정하고만 SOL을 송수신 할 수 있지만,
스테이크 계정은 토큰 위임(≒스테이킹)을 관리하는 데 필요한 더 복잡한 작업을 지원한다.
솔라나의 스테이크 계정은 우리가 아는 다른 지분증명(PoS) 블록체인 네트워크와도 다르게 작동한다.
다음은 스테이크 계정에서 나타나는 차이점과 특징이다.
계정 주소
각 스테이크 계정에는 커맨드라인이나 네트워크 익스플로러 툴에서 계정 정보를 조회할 때 쓰는 고유한 주소가 있다.
하지만 주소의 keypair(공용키+개인키 쌍)를 가지고 있는 주인이 지갑을 제어하는 지갑 주소와 달리,
반드시 스테이크 계정 주소와 연결된 keypair가 계정을 제어할 수 있는 것은 아니다. 실제로 keypair나 개인키가 계정 주소에 존재하지 않을 수도 있다.
스테이크 계정 주소에 keypair 파일이 있는 경우는 커맨드라인(cli) 툴을 이용해 스테이크 계정을 만들었을 때밖에 없다. 이 때는 스테이크 계정 주소가 새롭고 고유한지 확인하기 위해 새 keypair 파일이 먼저 생성된다.
계정 권한 이해하기
특정 유형의 계정은 하나 이상의 서명 권한을 가질 수 있다.
계정 권한은 제어하는 계정의 특정 거래에 서명할 때 사용되는데, 이는 타 블록체인 네트워크에서 계정 주소와 연결된 keypair의 소유자가 그 계정의 모든 활동을 제어하는 것과 차이가 있다.
각 스테이크 계정은 해당 주소로 지정된 두 개의 서명 권한이 있으며, 각 권한은 스테이크 계정에서 특정 작업을 수행할 수 있다.
그 권한은 다음과 같다.
1. 지분 권한(stake authority)
- 지분 위임(스테이킹 맡기기)
- 지분 위임 비활성화
- 스테이크 계정 분할해서 첫번째 계정의 자금 일부로 새 스테이크 계정 생성
- 2개의 스테이크 계정을 하나로 병합
- 새로운 스테이크 권한 설정
2. 인출(출금) 권한(withdraw authority)
- 지갑 주소로 위임되지 않은 지분 인출
- 새로운 출금 권한 설정
- 새로운 스테이크 권한 설정
지분 권한과 인출 권한은 스테이크 계정 생성 시에 설정되고, 언제든 새로운 서명 주소를 승인하도록 변경할 수 있다.
지분 및 인출 권한은 동일한 주소일수도 다른 주소일 수도 있다.
인출 권한 keypair는 스테이크 계정의 토큰을 하는 데에 필요하기 때문에 계정에 대한 더 많은 제어 권한을 가진다. 지분 권한 keypair가 손실되거나 손상됐을 때 지분 권한을 재설정하는 데에 사용할 수도 있다.
스테이크 계정을 관리할 때 가장 중요한 것은 분실이나 도난으로부터 인출 권한을 확보하는 것이다.
다중 위임
각 스테이크 계정은 한번에 하나의 validator에게 위임하는 데만 사용할 수 있다. 계정의 모든 토큰은 위임됐거나 위임되지 않았거나, 위임 중이거나 위임이 해제되는 중이다. 토큰의 일부를 validator에게 위임하거나, 여러명의 validator에게 위임하려면 스테이크 계정을 여러개 만들어야 한다.
이는 토큰이 있는 주소에서 여러 스테이크 계정을 생성하거나 하나의 큰 스테이크 계정을 만들고 지분 권한을 사용해 지정한 양의 토큰 잔액이 있는 여러 계정으로 분할하는 방식으로 수행할 수 있다.
동일한 지분/인출 권한을 여러 스테이크 계정에 할당할 수 있다.
스테이크 계정 병합
동일한 권한과 lockup인 두 개의 스테이크 계정은 하나의 resulting 스테이크 계정이 될 수 있다.
추가 조건 없이 병합 가능한 경우
- 두 개의 비활성화 스테이크 계정
- 활성화 epoch 동안의 비활성화 스테이크 계정과 활성화 스테이크 계정
투표자 pubkey와 관찰된 투표 크레딧이 일치해야 하는 경우
- 두 개의 활성화 스테이크 계정
- 활성화 epoch 동안의 활성화 epoch를 공유하는 두 개의 활성화 스테이크 계정
0이 아닌 유효 스테이크 계정과, 모든 '일시적인' 상태 즉 활성화 또는 비활성화 중인 스테이크 간의 조합을 포함하는 다른 모든 스테이크 계정의 상태의 조합은 병합에 실패한다.
위임의 워밍업과 쿨다운
스테이크 계정을 위임하거나 위임을 비활성화하자마자 그 작업이 즉시 이루어지지는 않는다.
위임이나 위임 비활성화는 instruction을 포함하는 트랜잭션이 클러스터에 제출된 후 각 epoch의 경계에서 활성화/비활성화되는 위임의 일부와 함께 완료되는 데에 여러 epoch가 걸린다.
네트워크 전체에서 한 epoch당 위임되거나 위임 비활성화될 수 있는 총 지분은 제한되어 있다. 스테이크에 갑자기 큰 변화가 일어나는 것을 방지하기 위해서다. 워밍업과 쿨다운은 다른 네트워크 참가자의 행동에 따라 달라지므로 정확한 기간을 예측하기 어렵다.
더 자세한 설명은 공식 문서의 Architecture > Cluster > Stake Delegation and Rewards 에서 확인할 수 있었다.
위임된 지분은 즉시 효력을 발휘하지 않는다. 먼저 워밍업 기간을 거쳐야 한다.
이 기간 동안 지분의 일부는 'effective(유효한, 효과적인)' 상태로 간주되고 나머지는 'activating(활성화 중인)' 상태로 간주된다. 변경은 epoch 경계에서 발생하며, 워밍업이 끝나면 active 상태가 된다.
스테이크 프로그램은 프로그램의 [ config::warmup_rate ] 를 반영해 네트워크의 총 지분에 대한 변경 비율을 제한한다. (현재 구현에서는 epoch당 25%로 설정)
각 epoch당 워밍업될 수 있는 지분의 양은 이전 epoch의 총 effective 지분, 총 activating 지분, 스테이크 프로그램에 설정된 워밍업 비율의 함수다.
쿨다운도 같은 방식으로 작동한다. 지분이 비활성화되면 그 일부가 'effective'이면서 'deactivating(비활성화 중인)' 상태로 간주된다.
보상은 해당 epoch에서 'effective' 부분에 해당되는 지분에 지급된다.
그래서인지 지분이 쿨다운되면 계속 리워드를 받고 슬래싱에도 노출되지만, 인출도 가능해진다고 한다.
쿨다운 후를 말하는건지 쿨다운중일 때를 말하는건지 정확히 알려면 실험해봐야겠다.
bootstrap 지분은 워밍업 대상이 아니다.
(bootstrap stake는 아마 제네시스 블록처럼 처음 만들어진 스테이크일 듯)
워밍업 예제
activating 상태에서 네트워크에 활성화된 지분 = effective
네트워크에 이미 활성화된 지분들 = total effective
네트워크에 활성화하기 위해 올려둔 지분 = activating
네트워크의 워밍업 비율이 20%이고, N번째 epoch에서 네트워크에 있는 (기존의) total effective 지분이 2000개고, N번째 epoch에서 활성화된 단일 지분은 1000개인 상황을 고려해보자.
[ N+1번째 epoch ]
total effective 지분이 2000개이므로 네트워크에 활성화 될 수 있는 양은 400(=2000개의 20%)이다.
이 예제에서는 N번째 epoch의 activating(활성화되고 있는) 지분이 전부이므로 이 지분들은 사용 가능한 모든 워밍업 room에 대한 자격이 있다.
사용 가능한 워밍업 room을 모두 사용해서 activating 지분 1000개 중 400개가 effective 상태가 되고, activating 지분은 600개가 됐다.
[ N+2번째 epoch ]
total effective 지분 : 2400
워밍업 room : 2400 * 0.2 = 480
=> activating 지분 600개 중 480개 활성화
=> effective 지분 880, activating 지분 120
[ N+3번째 epoch ]
total effective 지분 : 2880
워밍업 room : 2880 * 0.2 = 576
=> 남은 activating 지분 120개 전부 effective로 활성화
=> effective 지분 1000, activating 지분 0
2개의 지분(X, Y)을 N번째 epoch에서 활성화하면, 지분 양에 비례하여 20%를 나눠 받게 될 것이다.
각 epoch마다 각 스테이크의 effective, activating은 이전 epoch 상태의 함수다.
표 해석)
N-1 에포크에서 주어진 total effective는 2000개.
N 에포크에서 X 지분 1000개가 activating 되었고 Y 지분 200개가 activating 되었다.
[ N+1 에포크 ]
워밍업 room : 2000 * 0.2 = 400
X:Y = 5:1 이므로 400을 5:1로 나눠 가져야 한다. 즉 X는 333(400 * 5/6 = 333.333...)개, Y는 67(400 * 1/6 = 66.666...)개의 워밍업 room을 사용할 수 있다.
[ N+2 에포크 ]
워밍업 room : 2400 * 0.2 = 480
480 * 667 / 800 = 400.2
480 * 133 / 800 = 79.8
여기서 X는 400개, Y는 80개여야 하는거 아닌가 했는데... 예제에서는 X에 400개, Y에 79개의 워밍업 room을 배분했다. 위에서는 반올림 잘 해놓고 무슨 일인지 잘 모르겠다ㅎ...
[ N+3 에포크 ]
워밍업 room : 2880 * 0.2 = 576
=> 남은 X act와 Y act를 합한 양(=321)이 워밍업 room 보다 적으므로 모두 활성화할 수 있다.
인출(출금; Withdrawl)
effective+activating 지분을 초과한 램포트(= 아주 작은 SOL 단위)들만 언제든지 인출할 수 있다.
이는 워밍업 동안은 사실상 지분을 인출할 수 없다는 뜻이다.
쿨다운 동안 effective 지분을 초과하는 토큰은 철회될 수 있다(activating == 0). 획득한 보상은 자동으로 지분에 추가되므로 일반적으로 비활성화가 된 후에만 인출이 가능하다.
잠금(Lock-up)
스테이크 계정은 지정된 시간까지 스테이크 계정 잔액을 인출할 수 없는 잠금 개념을 지원한다.
잠금 기능은 지정된 관리인에 의해 트랜잭션이 서명되지 않는 한, 스테이크 계정 잔액이 인출되기 전에 네트워크에서 도달해야 하는 최소 에포크 높이로 지정된다.
이 정보는 스테이크 계정이 생성될 때 수집돼 스테이크 계정 상태의 Lockup 필드에 저장된다. 승인된 스테이커나 출금인을 변경하는 것도 사실상 양도이기 때문에 잠금의 대상이 된다.
스테이크 계정 파괴
솔라나 네트워크의 다른 계정들과 마찬가지로, SOL 잔액이 0인 스테이크 계정은 더이상 추적되지 않는다.
스테이크 계정이 위임되지 않고, 포함된 모든 토큰이 지갑 주소로 인출되면 해당 주소의 계정은 사실상 파괴되며 주소를 다시 사용하려면 수동으로 다시 만들어야 한다.
스테이크 계정 조회
스테이크 계정의 세부 정보는 솔라나 익스플로러에서 계정 주소를 복사해 검색창에 붙여넣으면 볼 수 있다.
'Solana > Documentation' 카테고리의 다른 글
[Solana] 1. 솔라나 설치 및 종이 지갑 생성 - CLI 사용을 위한 세팅 (0) | 2021.10.13 |
---|---|
[Solana] 솔라나 CLI 사용법 메모 (0) | 2021.10.13 |
[Solana] 스테이킹하기 위한 지갑과 validator 선택 (0) | 2021.10.12 |
[Solana] Terminology 해석; 문서에서 사용되는 용어 (0) | 2021.10.08 |
[Solana] 배경지식 - 지갑(wallet), epoch, voting fee (0) | 2021.10.08 |