안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다.
이번 게시글에서 소개해드릴 지분증명에 의한 스테이킹(Staking) 리워드(Reward) Smart Contract입니다.
스테이킹 리워드 컨트랙트는 유저에게 추가적인 수익과 더불어 토큰 가격을 상승시켜주는 컨텐츠입니다. 또한, 프로젝트 주최자는 상장 초기에 가격을 방어할 수 있으므로 양쪽 모두에게 이익을 가져다 주는 컨텐츠입니다. 이러한 이유로 프로젝트 초기에 많은 DApp에서 활용됩니다.
스테이킹을 진행하는 이유?
스테이킹이란, 특정 코인 또는 토큰을 일정 기간 동안 스마트 컨트랙트에 예치(Deposit)하여 락업(Lock Up)을 하는 것으로, 보상이 주어지는 탈중앙화된 금융 프로토콜(DeFi)입니다. 이때 보상(Reward)은 예치된 지분(stake)에 따라 결정됩니다.
ICO를 통해 토큰을 상장하면, dApp에서 구현된 토큰노믹스에 따라 물량이 분배됩니다. 초기에 상장된 토큰이 거래소에서 거래되면, 가격이 자연스럽게 하락할 수 있습니다. 따라서 프로젝트 초기에 홀더들이 토큰을 보유하도록 유도해야 합니다. 이를 위해 스테이킹을 도입하여 홀더들의 토큰을 보유하도록 하고, 보유한 지분에 따라 보상이 지급되는 Staking Reward Smart Contract를 활용할 수 있습니다.
스테이킹 리워드(Staking Reward) 계산 방법 :
Staking Reward Example (1)
- Staking Period : 100 days
- Total amount of reward during the period : 10000 token
Staking 컨텐츠를 진행하게 되면 Staking Smart Contract를 개발한 컨트렉트 주인은 스테이킹 기간(period)과 기간동안 지급되는 보상의 양(Total amount of reward during the period)을 정합니다.
- Amount of reward per day : 10000/100 = 100 token
그러면 하루동안 스테이킹 컨트렉트에 토큰을 예치한 사람들에게 지급되는 보상은 100 token이 됩니다.
위 그래프를 예시로, Steve,Bob,Alice가 모두 스테이킹 컨트렉트에 토큰을 예치한지 하루가 지났습니다. 현재 스테이킹 컨트렉트에 하루 동안 예치된 스테이킹 총 물량은 1000개 입니다. 말씀드렸던것 처럼 스테이킹의 보상은 지분에 의해 분배됩니다.
하루동안 지급되는 보상이 총 100 token이면, Alice가 가져가는 지분은 100*1/10 = 10 token가 됩니다.
Steve는 100 * 5/10 = 50 token, Bob은 100 * 4/10 = 40 token이 되겠네요.
스테이킹 컨트렉트에 토큰을 예치한지 6일이 지났습니다.
Alice : 100 * 1/10 * 6 = 60 token
Bob : 100 * 4/10 * 6 = 240 token
Steve : 100 * 5/10 * 6 = 300 token
3명은 6일동안 토큰을 예치하여 토큰을 락업함으로써, 위와 같은 보상을 얻게됩니다.
- User`s staking amount / Total staking amount * Amount of reward per day * deposited period= Reward amount
이처럼 스테이킹 컨트렉트에 하루동안 스테이킹 된 총 물량(Total staking amount)에 유저가 스테이킹한 물량(User`s staking amount)를 나누면, 해당 유저가 컨트렉트에 락업한 지분(stake)이 결정됩니다. 그 지분에 하루동안 지급되는 보상(Amount of reward per day)을 곱하면 해당 유저가 하루동안 받게되는 리워드의 양(Reward amount)이 결정되고, 유저가 락업한 총 기간을 곱하면 최종적으로 유저가 받게되는 리워드의 양(Reward amount)이 결정됩니다.
스테이킹 리워드 공식 기본 편:
Staking Reward Example을 통해 리워드 양을 구하는 방법을 이론적으로 배웠습니다. 그 이론을 통해 이해한 스테이킹 리워드 개념을 일반화하여 수식으로 간단하게 나타내보겠습니다.
🧐 지금부터 다루는 수학 공식은 수열의 합 시그마를 사용하여 정의됩니다.
먼저 공식에 사용되는 변수를 정의하겠습니다.
- Si : i일에 유저가 예치한 토큰의 양
- Ti : i일에 컨트렉트에 총 예치된 토큰의 양
- R : 하루에 지급되는 보상률(Total amount of reward during the period / Staking Period)
- r(u,k,n) : 유저u가 k일 부터 n일 까지 예치하여 받는 보상 금액
위 공식을 간단하게 설명하자면, 유저가 예치한 토큰의 지분(Si/Ti)에 따라 k~n기간 동안 받는 리워드를 모두 더한 r을 구하는 공식입니다.
공식을 다시 예시에 대입하여 설명하겠습니다.
Staking Reward Example (2)
r(u,k,n)의 유저는 Alice라는 가정하에 진행해보겠습니다.
- R : 100
- Alice(Si) : 100
- Bob : 400
- Steve : 500
- Ti : 100+400+500 = 1000
- k,n : 0~6
위 예시를 일반화했던 공식에 대입하면, Alice(Si)는 0~6일 동안 스테이킹 보상으로 60토큰을 받을 수 있습니다.
그러나 Bob, Steve 또는 다른 사람이 중간에 스테이킹 토큰을 추가하면, 총 예치된 토큰(Ti)의 양이 증가하고 Alice의 지분이 줄어들어 보상의 양이 달라질 수 있습니다.
Staking Reward Example (3)
Staking 시나리오 :
r(u,k,n)의 유저는 Alice라는 가정하에 진행해보겠습니다.
0 : Alice가 100 token을 예치(deposit)함
4 : Bob이 400 token을 예치(deposit)함
7 : Steve가 500 token을 예치(deposit)함
9 : Alice가 100 token을 인출(withdrawal)함
위 그래프는 staking 시나리오에 따라 0~10일 동안 staking contract에 락업된 토큰의 물량을 나타내는 그래프입니다.
- 0~4일까지 Alice 혼자 100 토큰을 예치하여 총 스테이킹 물량은 100이며, Alice의 지분이 100/100이 되며,
4일 동안의 (100/100) * 4의 보상을 혼자 받게 됩니다. - 4일부터 Bob이 400토큰을 예치하면 총 스테이킹 물량은 500이 되며, Alice의 지분이 100/500이 되어
4~7일 동안 100/500*3의 보상을 받게 됩니다. - 7일부터 Steve가 500토큰을 예치하면 총 스테이킹 물량은 1000이 되며, Alice의 지분이 100/1000이 되어
7~9일 동안 100/1000*2의 보상을 받게 됩니다. - 9일이 되면서 Alice는 예치한 토큰을 인출(withdrawal)하며, 더이상 스테이킹 컨트랙트에 지분이 없게 됩니다. Alice는 0~9일동안 변동하는 지분에 따라 r(Alice,0,9) = ((100/100 * 4) + (100/500 * 3) + (100/1000 * 2)) * R 만큼의 보상을 받게 됩니다.
수학에서 함수 y=f(x)는 x값이 일관성있게 변하지 않는다면, y=f(x)의 값은 변함이 없습니다. 하지만, x의 값이 계산 중간에 변하게 되면,
y = f(x1) + f(x2)라는 새로운 공식이 만들어집니다.
EVN기반의 Smart Contract 구조로 봤을때, f(x1)를 저장해 둬야지만 y=f(x1) + f(x2)를 y에 저장할 수 있습니다. 때문에, 굉장히 비효율적입니다.
Alice의 r(Alice,0,9) = ((100/100 * 4) + (100/500 * 3) + (100/1000 * 2)) * R 라는 공식을 봤을때, 총 스테이킹 수량에 변동이 있을때마가 이를 반영하여 기존에 스테이킹했던 유저들의 보상을 저장해야한다는 것입니다.
이는 새로운 사용자가 스테이킹 컨트랙트에 토큰을 예치할 때마다, 기존에 예치한 모든 사용자의 보상 순회(for문)하며 보상을 계속 업데이트하고, 변동된 총 스테이킹 수량에 따라 새로운 보상 공식을 적용하는 것을 의미합니다.
이 과정에서, EVM 기반의 스마트 컨트랙트는 데이터를 컨트랙트에 저장하거나 변경하는 기능을 수행할 때, 가스비라는 수수료가 발생하며, 이는 사용자가 부담해야 하는 구조입니다. 따라서 일반적인 지분에 따른 보상 계산은 스마트 컨트랙트 관점에서는 사용할 수 없는 수준의 알고리즘 공식입니다.
개선된 Staking Contract Reward 공식 알고리즘 :
이더리움 초창기 Synthetix dApp에서 스테이킹 기능을 개선하기 위해, 기존의 공식에서 파생된 새로운 공식을 Solidity로 구현하여 문제를 해결했습니다. 현재는 SushiSwap의 MasterChef 컨트랙트에서 같은 개념으로 사용되며, 스테이킹 로직을 활용하는 DeFi 프로젝트들의 대부분은 이를 활용하여 개발하고 있습니다.
이를 통해 스테이킹 컨트랙트에 예치한 유저들의 보상을 주기적으로 업데이트하지 않으면서도 모든 스테이킹 보상을 정확하게 계산할 수 있게 되어, 기존의 스테이킹 리워드 컨트랙트의 치명적인 단점을 완전히 해소할 수 있게 되었습니다.
해당 공식은 수학적으로 많은 내용을 다루며, Solidity로 다루기에 많은 설명이 필요합니다. 다음 게시글에서는 "스테이킹 리워드 공식 심화 편"으로 다뤄보겠습니다.
댓글