HdacHdac

Menu Open

search result

Frequently Searched Words
Menu Close

NEWS

Latest News

Stay updated with the latest news and event on RIZON

Developers’ Journal

토큰 이코노미가 코드로 되기까지

Apr 17th, 2020

코드와 같이 보는 수식적 설계도

이전 포스팅들(EcosystemPoP)에서는 우리의 토큰 이코노미 설계 철학에 대하여 다뤘습니다. 이번 섹션에서는 위에 나온 철학이 구체적으로 어떻게 구현되어 있는지 알아보도록 하겠습니다.

새로운 메인넷의 System용 Smart contract는(이하 system contract) Rust로 짜여져 있습니다. 그리고 Rust의 binary를 바로 실행하는 것이 아니라, WebAssembly로 컴파일하여 사용하고, 이는 Casperlabs의 Contract SDK를 사용합니다. 현재 저희의 코드는 깃헙에 업로드되어 있습니다. 혹시 코드가 저희의 설계와 맞지 않거나, 철학이 제대로 반영되어있지 않거나, 혹은 철학을 발전시킬 수 있는 더욱 좋은 의견이 있으시다면, 언제든지 저희 Discord나 Forum에 의견을 개진해주시기를 부탁드리겠습니다. 많은 관심과 토론은 프로젝트의 발전에 큰 도움이 됩니다.


 

Holder가 stake 후 할 수 있는 행동: delegation, dApp vote

 

Holder가 stake 후 행사할 수 있는 액션은 delegation과 dApp vote 입니다.

 

if amount.is_zero() {
    return Err(Error::BondTooSmall);
}
let source = PurseId::new(source_purse);
let pos_purse = get_purse_id::(uref_names::POS_BONDING_PURSE)
    .map_err(PurseLookupError::bonding)?;

ContractMint::transfer_from_purse_to_purse(source, pos_purse, amount)
    .map_err(|_| Error::BondTransferFailed)?;

 

 

먼저 Delegation code입니다. Delegation이 실행되면 먼저, 시스템의 staking한 토큰을 모아놓은 지갑을 찾아 staking할 토큰을 전송합니다. (Bonding이라는 말이 보이는데, 이는 staking과 똑같은 뜻입니다)


let mut stakes: Stakes = ContractStakes::read()?;
let mut delegations = ContractDelegations::read()?;

for request in requests {
    let DelegateRequestKey {
        delegator,
        validator,
    } = request.request_key;

    stakes.bond(&validator, request.amount);
    delegations.delegate(&delegator, &validator, request.amount);
}

ContractStakes::write(&stakes);
ContractDelegations::write(&delegations);

 

 

 

 

 

 

바로 전 snippet의 로직에서 stake신청한 부분이 반영되는 부분입니다.

  1. Staking과 Delegation 테이블을 불러오고
  2. 업데이트할 것이 있으면 업데이트한 후,
  3. 업데이트 완료된 테이블을 시스템에 다시 기록하는 로직입니다.

 

Vote도 이와 비슷합니다.

 

pub fn vote(&self, user: PublicKey, dapp: Key, amount: U512) -> Result<()> {
    // staked balance check
    if amount.is_zero() {
        return Err(Error::BondTooSmall);
    }

    // check validator's staked token amount
    let delegation_user_stat = ContractDelegations::read_user_stat()?;
    // if an user has no staked amount, he cannot do anything
    let delegated_balance: U512 = match delegation_user_stat.0.get(&user) {
        Some(balance) => *balance,
        None => return Err(Error::DelegationsNotFound),
    };

    // check user's vote stat
    let vote_stat: VoteStat = ContractVotes::read_stat()?;
    let vote_stat_per_user: U512 = vote_stat
        .0
        .get(&user)
        .cloned()
        .unwrap_or_else(|| U512::from(0));

    if delegated_balance < vote_stat_per_user + amount {
        return Err(Error::VoteTooLarge);
    }

    // check vote table
    let mut votes: Votes = ContractVotes::read()?; // <- here
    votes.vote(&user, &dapp, amount);
    ContractVotes::write(&votes);

    Ok(())
}

 

Smart contract를 짜 보셨으면 아시겠지만, 실질적으로 vote()를 수행하는 부분은

// check vote table
let mut votes: Votes = ContractVotes::read()?; // <- here
votes.vote(&user, &dapp, amount);
ContractVotes::write(&votes);

이 부분이 전부입니다. 하지만 본 로직 실행 전, 몇 개의 조건을 검사와 그에 필요한 전처리 부분 때문에 코드가 길어집니다. 

 

1. 0 토큰으로 투표하는가?

2. Staking한 양 이상으로 투표하는가? (현 로직은 delegation한 validator를 정하고 delegation을 걸면, 그만큼 staking되는 형태이기 때문에 delegation 정보를 보면 현 유저의 staking양을 알 수 있습니다.)

 


 

Delegation을 통한 validator 선정: PoP 점수 산정방법과 그에 따른 보상

Holder는 validator에게 delegation을 하고, delegation을 많이 받은 순으로 상위 100개의 validator를 선정합니다. 선정된 validator는 네트워크 유지를 통해 매 블록마다 보상을 받습니다. 이 때,

  • 연 5%의 인플레이션에 따라 블록당 보상량을 결정합니다.
  • 보상을 받는 비율은 상위 100개의 validator PoP 점수에서 해당 validator PoP 점수의 비율에 따라 결정됩니다.
  • PoP 점수 = (Profession score) X (PoS factor) 로 결정합니다.
  • Profession score는 네트워크의 안정성과 생태계의 발전을 위해 validator가 얼마나 기여하였는가로 결정되는 점수입니다. 법안 발의, 법안투표 참여, 장애 없는 네트워크 유지, Ecosystem dApp 개발 등으로 결정할 수 있습니다. 다만, 이 점수의 항목, 비율, 인정방법을 섣불리 정할 수 없기에 Genesis validator의 의견을 수렴한 후 구현하는 방향이 맞다고 판단되어, 현재는 이 부분은 일괄적으로 1로 놓았습니다.
  • PoS factor는 다음과 같습니다.

x: [ (해당 validator의 delegation 받은 량) / (상위 100 validator의 delegation 받은 량) ] X 100

여기에서 PoS factor 식이 바로 저희가 자본을 인정하면서도, 독점에 맞서는 방법입니다. Delegation받는 대로 인정해주되, 독점 포인트에 도달 시, Delegation power의 증가 속도를 급격하게 둔화시켰습니다. 이리하여 표가 한 쪽으로 몰리지 않고, 여러 validator에게 표가 퍼지면서, 해당 포인트에 도달한 validator는 불필요한 마케팅 비용을 소진하지 않고, 생태계의 다른 활동에 집중할 수있게 만들자는 의도였습니다.

먼저, ‘독점’의 정의는 “전체 staking 물량의 15% 이상 delegation받은 상태”로 하였습니다. 너무 높게 잡으면 우리의 의도가 반영되지 않는 세계가 되며, 너무 낮게 잡으면 여러 validator 계정을 동원하여 물량전을 펼칠 수 있기 때문에 복제 계정만큼 다른 validator의 기회가 줄어들게 됩니다. (Sybil attack) 이 때, 최소 6~7개의 validator면 네트워크를 신뢰할 수 있다 생각하여 15% 지점을 잡았습니다.

Delegation 파워를 약화시키는 방법으로는 처음에는 자연 로그를 사용하였습니다. 계속 증가 추세는 주되, 속도를 획기적으로 감소시키는 방법으로 널리 알려진 식입니다. 그래서 처음 저희의 공식은 아래와 같았습니다.

 

식 2개의 숫자가 복잡하여 혹시나 복잡한 사상을 넣었을 까 생각할 수 있지만, 절대 복잡한 의미가 아닙니다. x = 15 지점에서 자연로그 식이 연속되며, 기울기도 변곡점 없이 연속하도록 (도함수도 연속하도록) 만들려 할 때, 나온 식으로 도출한 것입니다. 원리는 간단하지만 결과는 복잡합니다. 그리고 이 식을 실제 System contract에 적용하려 했습니다. 그런데, Smart contract에서는 ln()과 같은 부동소수점 연산을 바로 사용할수는 없습니다. 어떻게 된 일일까요?

이는 어느 환경에서도 같은 결과를 보장해야 하는 블록체인의 특성 때문에 그렇습니다. 어떤 노드는 Ubunbtu 64비트 운영체제에서 운영하고, 다른 노드는 CentOS에서 운영하는데, 두 환경에서 나오는 결과가 다르다면, 블록체인의 정신에 위배됩니다. 하지만, Float를 사용하게 되면, 환경에 따라 소수점의 미세한 부분이 다르게 나올 수 있고, 이로 인해 결과가 달라질 수 있습니다. 이를 위해 Smart contract에서는 부동소수점을(Float) 사용하지 않도록 막게 됩니다. Data type on blockchain 포스팅에 설명되어 있고, 후에 또 다른 포스팅에서도 언급할 계획입니다.) Rust 개발 환경에서는 #![no_std] attribute 를 이용하여 제약을 부여합니다. 이 attribute는 Embedded system에 구현할 때, 구조상 특징으로 실행이 안 될 리스크를 제거하기 위해 Standard library 사용에 제약을 부여합니다. (추후, 이 제약에서 벗어날 수 있도록 정수 연산을 이용한 소수점 연산 라이브러리를 개발할 계획입니다.)

이런 일련의 문제를 우회하는 방법으로 ln()을 유사하게나마 구현하기 위해 테일러 정리도 찾아보았지만, 0 < x < 1 정도 범위에서나 유효하지, 15 < x <= 100같은 범위에서는 최고차항의 부호가 무엇이냐에 따라 어느 방향으로 발산하냐가 결정되어 버렸습니다. 결국은 고민 끝에 식을 바꾸기로 하였습니다. ln()대신 sqrt()(흔히들 제곱근이라고 하죠)를 사용합니다. 보통의 제곱근은 소수기 때문에 Float를 사용할 수밖에 없지만, 여기서는 Integer square root를 구현하여 사용하였습니다. 이 때문에 소수점을 활용할 수 없는 문제는, 결과를 1000배 하여 소수점 3째자리까지 사용하는 효과를 주었습니다. 이 대안으로 사용한 식을 원 식과 대조해보았는데, 거의 비슷했습니다.

 

 

 

이를 코드로 어떻게 옮겼는지 알아보도록 하겠습니다. 먼저 PoP 스코어를 계산하는 부분입니다.

 

pub fn pop_score_calculation(total_delegated: &U512, validator_delegated_amount: &U512) -> U512 {
    // Currenrly running in PoS.
    // Profession factor will be added soon
    let profession_factor = U512::from(1);

    let x = *validator_delegated_amount * U512::from(100) / *total_delegated;

    let score = if x <= U512::from(15) {
        // y = 1000x
        *validator_delegated_amount * U512::from(100_000) / *total_delegated
    } else {
        // y = 1000 * sqrt(30x - 225)
        //   = sqrt(1_000_000 * 30 * 100 * val_delegation / total_delegated - 225_000_000)
        sqrt_for_u512(
            *validator_delegated_amount * U512::from(3_000_000_000_u64) / *total_delegated
                - U512::from(225_000_000),
        )
    };

    score * profession_factor
}

여기서 x를 위에서 선언해놓고 아래에서는 왜 x를 활용하지 않고, 복잡하게 구현했냐는 의문이 드실 수 있습니다. 그 이유는 정수 환경에서는 나눗셈을 하는 순간 소수점 성분들이 없어지기 때문입니다. 가령, 7 / 2를 하면 3.5가 아니라 3이 나오게 되는 것이죠. 이 때문에, 최대한 나눗셈은 모든 곱셈이 다 끝나고 수행해야 숫자를 최대한 담아낼 수 있습니다.

 

let inflation_pool_per_block = total_supply.0 * U512::from(5)
    / U512::from(
        100 * consts::DAYS_OF_YEAR * consts::HOURS_OF_DAY * consts::SECONDS_OF_HOUR
            / consts::BLOCK_TIME_IN_SEC,
    );
total_supply.add(&inflation_pool_per_block);

 

블록 보상 인플레이션은 5%입니다. 현재 발행량에서 5%를 계산한다음 블록당 보상을 계산하고, System contract 내 변수에 기록합니다.

 

// Pick 100 validators + Summize it to derive total PoP
let mut total_pop_score = U512::zero();
let mut pop_score_table: BTreeMap = BTreeMap::new();
for (idx, unit_data) in delegation_sorted_stat.into_iter().enumerate() {
    // ...
    total_pop_score += unit_pop_score;
    // ...
}

for (validator, unit_pop_score) in pop_score_table.iter() {
    let unit_commission = unit_pop_score
        * consts::VALIDATOR_COMMISSION_RATE_IN_PERCENTAGE
        * inflation_pool_per_block
        / (total_pop_score * U512::from(100));
    commissions.insert_commission(validator, &unit_commission);
}
ContractClaim::write_commission(&commissions);

 

 

 

 

 

Delegation 상위 100 validator의 점수 합을 계산한 다음, 각자가 점유한 비율을 계산하여 Validator 보상량을 결정합니다. 이 보상량 중 30%를 Validator가 갖고, 나머지 70%는 Delegation해준 유저에게 나눠줍니다. 유저에게 나눠주는 부분은 아래와 같습니다.

 

 

for (delegation_key, user_delegation_amount) in delegations.0.iter() {
    // ...
    let pop_score_of_validator = pop_score_table
        .get(&delegation_key.validator)
        .unwrap_or_revert_with(Error::DelegationsKeyDeserializationFailed);
    let user_reward = user_delegation_amount
        * pop_score_of_validator
        * U512::from(100 - consts::VALIDATOR_COMMISSION_RATE_IN_PERCENTAGE)
        * inflation_pool_per_block
        / (total_pop_score * U512::from(100) * total_delegation_per_validator);
    
    // ...
}

 

 

 

dApp vote 많이 받을 때의 이득: Gas fee 할인

dApp vote로 인한 Gas fee 할인 공식을 들고 와 보겠습니다. Validator delegation과 마찬가지로, 이 곳에서도 할인최적점을 적용하였습니다.

할인률 연구 사례

할인률의 최적점은 어디인가를 리서치하다가 코즈 마케팅 (Cause marketing)에서 할인률 연구 사례를 접하게 되었습니다. 그것은 바로 할인이 50% 이상이면 마케팅 초점이 할인에만 맞춰져 오히려 비효율적이라는 것이었습니다. 이를 적용하여 할인률의 최적점을 30%으로 정하고, 최대는 50%가 되도록 설계하였습니다.

유효한 득표는 얼마인가?

최적점 30%에 도달하기 위해서는 얼마나 득표해야 할지에 대한 고민이 남았습니다. 이 때, 저희는 2800만 토큰 투표로 잡고 Log 함수를 활용하였습니다. 저희의 의도는 일정량의 지지 이상이여야 할인이 유효하며, 입력이 무한으로 가도 일정 값 이상으로는 할인율이 올라가지 않는 로직입니다. 연구 끝에 저희가 도출한 식은 다음과 같습니다.

x = 득표 토큰수
m = 87,000,000

위 식에 대한 그래프는 아래와 같습니다.

이 부분은, Log가 Smart contract에서 구현을 할 수 없는 관계로, Integer를 통하여 Decimal point를 구현할 수 있는 workaround를 마련한 후 코드로 선보이도록 하겠습니다.

이 밖에도, Staking 비율대로 변하는 Unstaking period도 있지만, 이는 실제 구현하신 분께서 설명해주실 영역으로 남겨 놓겠습니다.


 

맺으며…

비 개발자 혹은 숫자에 약하신 분들과 이야기를 하면 아무리 짧은 수식이나 코드라고 해도 매우 힘들어하시는 분들이 있었습니다. 하지만 이코노미는 수식 없이는 설명이 불가능한 부분입니다. 이를 위해 최대한 의미 위주로 설명드리고, 그 뒤에 식으로 설명을 해 드렸습니다. 의도가 잘 전달되었기를 희망합니다. (그리고 뒤로 가기 누르지 않고 여길 읽고 계셨으니 사실상 성공)

위에서도 말씀드렸지만, 토론이 필요하시면 언제든지 Discord / Forum에 오셔서 의견을 개진해주시면 프로젝트를 개선하는 데 매우 큰 도움이 될 것입니다.

다음 포스팅도 기대해주세요. :)

 

Links

References

[1] The economics of Money, Banking, and Financial method, Frederic. S. Mishkin (2017)

[2] https://en.wikipedia.org/wiki/Integer_square_root

[3] https://rust-embedded.github.io/book/intro/no-std.html

 

Image for post

PRIVACY POLICY

1. Introduction.

Hdac Technology AG respects the privacy of its Members, Contributors, Users or Clients and is dedicated to controlling the use and disclosure of information provided by Members, Contributors, Users or Clients using the Site. This Privacy Policy (the “Privacy Policy”) sets forth Hdac Technology AG’s policies regarding collection, storage, access, use and disclosure of information relating to a Member’s, Contributor’s, User’s or Client’s registration and use of the Site. Any terms not defined herein shall have the meaning set forth in the Terms & Conditions, the Transaction Terms & Conditions or the User Agreement.

2. Information Collection, Use And Disclosure Activities.

2.1 Registration Information.

To ensure that only legitimate entities and individuals are able to access the non-public areas of the Site and enter into transactions, we require each potential Member, Contributor, User or Client to, by using the Registration Page on the Site, provide (i) information regarding themselves (including name, e-mail address, job title, work address and work phone number), and (ii) information regarding their Company (including Company name and parent Company’s name and address). Upon receipt of Your registration data, Hdac Technology AG may contact You or Your Company to obtain other background information used by Hdac Technology AG to evaluate an applicant's qualifications for Membership, Contribution and/or Participation. Other than as specified in this Privacy Policy, the registration information will be used only internally by Hdac Technology AG and will not be disclosed to third parties without the applicable Member’s, User’s or Client's prior written consent. Notwithstanding of the before mentioned, Hdac Technology AG is obliged to report suspicious transactions and facts about individuals including Contributors to the relevant authorities without further notification and without becoming liable for any damage such action may cause.

2.2 References.

In addition to the information specified in Section 2.1, Hdac Technology AG may require Members, Contributores, Users or Clients or prospective Members, Contributors, Users or Clients to provide Hdac Technology AG with Company references to allow Hdac Technology AG to verify a Company’s capacity, legitimacy and reputability. Hdac Technology AG may provide such references to parties with which a Member, User or Client enters into a Negotiation to assure such parties that Company can meet its prospective obligations thereunder.

2.3 Member, Contributors, User or Client Profile.

Each Member, User or Client will create a Member, Contributor, User or Client profile that includes, among other things, information about this Member, Contributor, User or Client. Information in a Member, Contributor, User or Client profile are accessible only by the applicable Member, Contributor, User or Client, the Member, User or Client’s Group Administrator and Hdac Technology AG. Certain Member, Contributor, User or Client profile information will be provided to the parties engaged in a Negotiation in accordance with Section 2.5. Other than as permitted under this Privacy Policy, Member, Contributor, User or Client profile information will not be disclosed to third parties without the applicable Member, Contributor, User or Client's prior written consent.

2.4 Member, Contributor, User or Client Information.

(a) Hdac Technology AG may collect, use and disclose both on and off the Site, for marketing and other purposes, certain general, demographic and statistical information regarding Site usage and transactions. (b) To assist Member, User or Clients in selecting companies they may do business with through the Site, Hdac Technology AG may make available to Member, Contributor, User or Clients and non-Member, Contributor, User or Clients certain performance statistics of all Companies, provided that such statistics shall not include any Company-identifiable pricing information.

2.5 Technical and Usage Information.

To operate the Site, enhance its functionality, and ensure that Members, Contributors, Users or Clients Negotiations and communications are convenient, dependable and secure, Hdac Technology AG may collect, store and use technical and Site usage information relating to a Member, Contributor, User or Client's activities on the Site. Such information includes the Internet Protocol (“IP”) address from which a Member, Contributor, User or Client accesses the Site, which is used only internally by Hdac Technology AG as required for server operation and other technical uses, and is not disclosed to Members, Contributors, Users or Clients or other persons. Hdac Technology AG may also track the pages of the Site accessed by Members, Users or Clients.

2.6 Member, Contributor, User or Client Communications.

Hdac Technology AG may use Member, Contributor, User or Client contact information, such as e-mail addresses, to communicate with Members, Users or Clients regarding registration and transactions, to notify Members, Contributors, Users or Clients of changes in Site functionality and features, product and service updates, policy changes, billing and other activities relating to a Members, Contributors, Users or Client's use of the Site, and for marketing purposes.

2.7 Legal Compliance.

In addition to the disclosures permitted pursuant to this Privacy Policy, Hdac Technology AG may provide Member, Contributor, User or Client information in connection with legal, administrative or judicial inquiries, claims or orders to the extent necessary to comply therewith or to enforce a User Agreement.

3. Collection And Use Of Information Using Cookies.

As with many state-of-the-art Internet sites, the Site uses “cookies” to enhance the functionality of the Site and to make transactions and other activities more convenient and efficient for Members, Contributors, Users or Clients. A “cookie” is a file stored locally on computers used to access the Member, Contributor, User or Client account that contains information relating to a Member, Contributor, User or Client's past use of the Site. For example, a cookie may contain information previously entered on a Site form, which may be recalled as default information when that form is accessed at a later time. This prevents re-entry of frequently used information each time a Member, Contributor, User or Client account is accessed. Cookies are also useful in streamlining log-in and in preserving transactional information between sessions. Cookies will likely play an increasingly important role as we enhance the ability of Members, Contributors, Users or Clients to customize the functionality of the Site to better meet their needs and preferences. Most Internet browsers include preference settings that allow users to be notified and control whether cookies are transferred to their computers. Please review Your browser's documentation or “help” feature for more information on that functionality. Although disabling cookies will not affect a Member, User or Client's ability to transact business on the Site, it may make such activities more time consuming.

4. Linked Sites.

The Site may contain hyperlinks through which other Internet websites may be accessed by Members, Contributors, Users or Clients. Hdac Technology AG is not responsible for and cannot make any assurances regarding privacy, or other policies or practices of the operators of such websites. Such links are provided only for the convenience of our Members, Contributors, Users or Clients, and the presence of any link does not imply that Hdac Technology AG endorses, approves or is responsible for such websites.

5. Security.

Hdac Technology AG is very concerned with the security of information relating to our Members, Contributors, Users or Clients' use of the Site and has implemented systems and procedures to prevent unauthorized access to that information including the use of Secure Sockets Layer (SSL) connection and password protection. Each Member, Contributor, User or Client will create its own username and password, the secrecy of which is the sole responsibility of the Member, Contributor, User or Client. In the event the integrity of a Member, Contributor, User or Client’s password is compromised, the Member, Contributor, User or Client shall immediately change its password.

6. Updates To The Privacy Policy.

Hdac Technology AG may update this Privacy Policy from time to time as new features and services become available on the Site and to keep pace with technological developments. The new terms shall be effective ten (10) days after they are initially posted on the Site. It is the responsibility of the Member, Contributor, User or Client to review the latest terms. If You do not agree with updated Privacy Policy, You should immediately cease use of the Site and the Services.