* 아래 글에서 커맨드라인과 웹지갑에서 각각 스테이크 계정을 생성하고 스테이킹한 후 쓰는 글입니다.
1. 커맨드라인에서 스테이크 권한과 인출 권한 설정
스테이크 권한과 인출 권한은
① 스테이크 계정을 생성할 때 --stake-authority와 --withdraw-authority 옵션으로 설정할 수 있고
② 이후에 solana stake-authorize 커맨드로 설정할 수도 있다 :
solana stake-authorize <STAKE_ACCOUNT_ADDRESS> \
--stake-authority <KEYPAIR> --new-stake-authority <PUBKEY> \
--fee-payer <KEYPAIR>
--stake-authority 뒤에 기존에 스테이크 권한을 가지고 있던 계정의 키페어를 입력하고,
--new-stake-authority 뒤에 새롭게 스테이크 권한을 가질 계정의 pubkey를 입력하면 된다.
2. 스테이크 계정 주소 파생
고급 : 스테이크 계정 주소 파생시키기
스테이크를 위임할 때 스테이크 계정에 있는 모든 토큰을 하나의 validator에게 위임해야한다.
때문에 여러 validator에게 위임을 하려면 여러개의 스테이크 계정을 만들어야 한다.
이때 각 계정에 대한 새 키페어를 만들고 그 주소를 또 관리하기는 번거로우므로, --seed 옵션으로 스테이크 주소를 파생시킬 수 있다.
solana create-stake-account --from <KEYPAIR> <STAKE_ACCOUNT_KEYPAIR> --seed <STRING> <AMOUNT> \
--stake-authority <PUBKEY> --withdraw-authority <PUBKEY> --fee-payer <KEYPAIR>
<KEYPAIR> : 내 계정의 파일경로나 prompt:// 를 넣는다. 나는 생성해둔 스테이크 계정의 권한을 갖고 있는 계정과 동일한 계정을 사용했고, 종이지갑 계정은 prompt://를 넣으면 시드와 암호를 입력해야하므로 그냥 파일시스템지갑으로 만든 계정을 사용하고 있다.
<PUBKEY> : 내 계정의 pubkey를 넣는다.
--seed 뒤의 <STRING> : 최대 32바이트의 임의 문자열이지만, 일반적으로 파생된 계정의 순번을 넣는다.
고로 첫번째 계정은 0, 1 등을 넣으면 되겠다. "1" 과 1 을 둘다 넣어봤는데 동일한 입력으로 처리된다. (이미 생성된 계정이라고 나옴)
스테이크 계정의 공개키를 base address라고 할 때, 이 명령은 base address와 시드 문자열을 이용해 새로운 주소를 파생시킬 것이다.
파생된 스테이크 주소를 보고 싶으면 :
solana create-address-with-seed --from <PUBKEY> <SEED_STRING> STAKE
<PUBKEY> : solana create-stake-account로 전달된 스테이크 계정 키페어(내 경우엔 stake-account.json)의 pubkey를 넣는다.
<SEED_STRING> : 아까 스테이크 주소 파생시킬 때 썼던 시드 문자열을 넣는다.
이 커맨드는 스테이킹 작업의 <STAKE_ACCOUNT_ADDRESS> 인수에 사용될 수 있는 파생주소를 출력한다.
이 주소가 방금 시드 1과 기존 스테이크 계정의 pubkey에서 파생시켜 만든 스테이크 계정의 공개키다.
잘 만들어졌는지 확인하기 위해서는 다음 커맨드를 입력해보면 된다.
solana stake-account <시드와 스테이크 계정으로 만든 스테이크 계정의 pubkey>
잘 나오면 시드1 스테이크 계정의 공개키로 잘 저장해놓자.
* 나는 처음에 이 커맨드로 얻은 주소가 스테이크 계정이 아니라는 에러를 받았었다.
그래서 몇가지 시도해보다가 위에서 했던 solana create~ 문을 똑같이 다시 치면 스테이크 계정이 이미 존재한다는 에러와 함께 주소를 출력해주더라. 안 된다면 이렇게 해서 얻은 주소로 stake-account 가 맞는지 커맨드로 확인해보고, 맞으면 이 주소를 제대로 저장해놓자.
3. 스테이킹 분할
위임한 스테이크를 분할하면 같은 validator에게 지정한 양을 위임하는 계정을 하나 더 만들 수 있다.
3-1. 커맨드라인에서 스테이크 분할하기
저번 게시글에서 스테이크 계정을 생성하기 위한 키페어를 생성했었다. 여기서도 new_stake_account_keypair가 필요하다고 하므로 분할할 스테이크 계정을 만들 용도로 키페어를 하나 생성해서 써보겠다.
solana-keygen new --no-passphrase -o stake-account-split1.json
이제 새로 만든 키페어로 계정을 분할해보자. 나는 전 게시글에서 위임해둔 스테이크 계정을 분할해보겠다.
solana split-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <NEW_STAKE_ACCOUNT_KEYPAIR> <AMOUNT> \
--fee-payer <KEYPAIR>
스테이크 권한과 수수료 지불자로 내 계정 키페어, 분할할 계정 주소, 새 스테이크 계정용 키페어, 분할할 토큰 양(분할하는 계정의 총 양보다 적어야 함)을 넣으면 계정이 분할된다.
solana stake-account <PUBKEY> 로 각 스테이크 계정의 상태를 살펴보자.
절반인 0.25토큰으로 분할했더니 상태가 완전히 똑같은 것을 볼 수 있다.
스테이크 계정을 생성하고 나면 사용한 키페어 파일은 삭제해도 된다. (공개키랑 시드구문은 따로 적어두었다)
※ 파생과 분할의 차이점
파생
- 기존에 있던 스테이크 계정의 pubkey와 새로운 시드를 기반으로 새로운 스테이크 계정을 파생시키는 것이다.
=> 기존의 스테이크 계정에 영향을 끼치거나 영향을 받지 않는다. - 내 계정에서 토큰을 위임한 스테이크 계정을 바로 파생시켰으므로 스테이크 어카운트를 만들 때 키페어를 필요로 하지 않는다.
분할
- 기존에 있던 스테이크 계정의 토큰을 분할해 새로운 계정에 넣는다.
=> 기존의 스테이크 계정(토큰 양)에 영향을 끼치며 영향을 받는다. - 토큰의 상태가 고스란히 유지된다. 만약 validator에게 위임 중이었다면 동일하게 해당 validator에게 위임 중인 계정이 생성된다.
3-2. 웹 지갑에서 스테이크 분할하기
분할하고 싶은 양을 적어 스플릿한다.
같은 validator에게 위임 중인 다른 스테이크 계정이 생겨났다. active 상태인 계정을 쪼갠 것이기 때문에 둘 다 active 상태다.
4. 스테이크 위임 비활성화
4-1. 커맨드라인에서 위임 비활성화
위에서 분할한 계정 중 하나의 위임을 해제하고 스테이크 계정을 조회해보겠다.
solana deactivate-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> \
--fee-payer <KEYPAIR>
delegated와 active stake 양이 그대로고, 비활성화가 어떤 에포크부터 시작되는지가 추가되었다.
이처럼 위임 비활성화를 눌러도 바로 적용되지 않는 것을 쿨다운이라고 한다.
이와 같은 워밍업, 쿨다운은 여러 에포크가 소요될 수 있다.
4-2. 웹 지갑에서 위임 비활성화
스테이킹 페이지에서 undelegate를 눌러서 비활성화를 할 수 있다.
현재 deactivating 이지만 active stake가 있는 것을 확인할 수 있다.
마찬가지로 위임을 비활성화해도 바로 반영되지 않고 deactivating 단계에 들어가 active stake를 가지고 있는 쿨다운 상태다.
5. 스테이크 인출
스테이크가 위임된 상태라면 위임을 비활성화한 후 출금이 가능하다.
5-1. 커맨드라인에서 스테이크 인출하기
solana withdraw-stake --withdraw-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <RECIPIENT_ADDRESS> <AMOUNT> \
--fee-payer <KEYPAIR>
인출권한이 있는 계정의 키페어를 넣고, 기존 스테이크 계정주소를 넣고, 수신 주소와 인출하려는 양을 넣고 수수료를 지불할 키페어를 넣으면 스테이크를 원하는 계정으로 인출할 수 있다.
Error: RPC response error -32002: Transaction simulation failed:
Error processing Instruction 0: insufficient funds for instruction [2 log messages]
아직 비활성화가 진행중인 스테이크 계정의 인출을 시도하니 위의 에러 메시지가 떴다.
# Command
solana stake-account 38vfvaiBs7YndWMqqTyn9GSN91bxdnW4gUsPC2fKrC7R
# Return
Balance: 0.25 SOL
Rent Exempt Reserve: 0.00228288 SOL
Stake account is undelegated
Stake Authority: 3FwXPWtrwfhpQP1eZV1pQGdUo6a6xqZzRujX557rDKeY
Withdraw Authority: 3FwXPWtrwfhpQP1eZV1pQGdUo6a6xqZzRujX557rDKeY
# Command
solana balance 3FwXPWtrwfhpQP1eZV1pQGdUo6a6xqZzRujX557rDKeY
# Return
6.49993 SOL
그래서 비활성화가 완료된 후 0.25 SOL을 가지고 있던 스테이크 계정에서 6.49993 SOL을 가지고 있는 계정으로 전액(0.25 SOL) 인출을 시도해봤다.
출력으로 서명 해시만 나오고 별다른 내용이 출력되지는 않았다.
그래서 잔액을 모두 인출한 스테이크 계정을 조회해보려고 했다.
# Command
solana stake-account 38vfvaiBs7YndWMqqTyn9GSN91bxdnW4gUsPC2fKrC7R
# Return
Error: AccountNotFound: pubkey=38vfvaiBs7YndWMqqTyn9GSN91bxdnW4gUsPC2fKrC7R
스테이크 계정의 pubkey로 된 계정을 찾지 못했다. 즉 스테이크 계정은 잔액이 0이 되면 자동으로 폐기되는 것을 확인할 수 있었다.
# Command
solana balance 3FwXPWtrwfhpQP1eZV1pQGdUo6a6xqZzRujX557rDKeY
# Return
6.749925 SOL
0.25 SOL을 인출했더니, 수수료인 0.000005 SOL이 빠져서 0.249995 SOL이 인출되어 계정 잔액에 더해진 것을 볼 수 있다.
5-2. 웹 지갑에서 스테이크 인출하기
deactivating 상태에서는 인출 버튼이 뜨지 않는다.
deactivating 상태에서 inactive 상태로 전환이 되자 withdraw 버튼이 활성화됐다.
적은 양을 짧게 넣어놔서인지 rewards는 없었다.
각각 withdraw 버튼과 close account 버튼을 눌렀을 때다.
우선 일부만 인출해보겠다.
일부만 인출하려고 했더니(왼쪽) 블록을 못 찾는다고 실패해서 디폴트로 입력되어있는 양만큼 인출해봤다.
stake balance가 인출한 금액만큼 빠져있는 것을 확인할 수 있다.
이제 스테이크 계정을 닫아보겠다.
오른쪽 상단에 트랜잭션이 confirmed 됐다는 알림바와 함께 스테이크 계정 하나가 사라졌다.
방금 일어난 트랜잭션을 조회하기 위해 계정을 솔라나 익스플로러에서 조회해보자.
익스플로러로 연결된 페이지의 하단에서 방금 일어난 트랜잭션들을 볼 수 있다.
각 트랜잭션을 눌러 조회해보자.
제일 상단의 계정이 토큰이 들어있는 내 계정이다. change 와 post balance로 잔액이 어떻게 변했는지 확인할 수 있다.
두번의 작업으로 스테이크 계정의 잔액을 내 계정으로 인출하면서, 수수료로 0.000005 SOL 이 두번 빠졌으므로
스테이킹 계정을 통해 스테이킹했던 0.5 SOL에서 0.00001 SOL이 빠진 0.49999 SOL이 내 계정으로 인출되었다.
'Solana > Documentation' 카테고리의 다른 글
[Solana] 3. 솔라나 데브넷 토큰 에어드랍 받아서 전송, 스테이킹 (0) | 2021.10.18 |
---|---|
[Solana] 2. 팬텀, 솔플레어 지갑 만들기 (0) | 2021.10.14 |
[Solana] 1. 솔라나 설치 및 종이 지갑 생성 - CLI 사용을 위한 세팅 (0) | 2021.10.13 |
[Solana] 솔라나 CLI 사용법 메모 (0) | 2021.10.13 |
[Solana] 스테이킹 계정 구조 + 워밍업 예제 (0) | 2021.10.13 |