EOS의 전송 비용과 RAM사용

in #kr-dev6 years ago



들어가며....


글을 쓰다보니 다소 복잡한 부분들이 있지만, 하나의 flow로 보고 따라와 주시면 좋겠습니다.
오늘은 글이 복잡하여 미리 요약하면..

  1. EOS에서 transfer는 공짜다. 하지만 최소한의 CPU에 staking이 있어야 한다.
  2. EOS에서 stake, unstake, voting은 RAM을 필요로 한다.
  3. 계정을 탈탈 털어서 RAM, CPU, Bandwidth모두 0이 되는 상황을 만들수 있는지는 고민이 필요하다.
  4. Steem처럼 refresh가될 것 같은데 아직 찾지 못했다.

입니다.



송금에 대한 실험


A에서 B로 0.0001 EOS를 송금했습니다. A의 unstaked가 0.0001만큼 줄어든 것 보이시죠?

맞습니다. Transfer, 즉 송금은 RAM을 점유하지 않습니다. 정확히는, RAM은 system과 거래할때만 줄어들게 되어 있습니다. 사실 이렇게 메모리(RAM)가 가득찬 상태는 stake, unstake, vote아무것도 되지 않습니다. 유일하게 인출만 가능하죠.
조금 더 고 난이도로 들어가면, transfer는 eosio.token contract이므로, 여기에서 RAM이 사용되지는 않습니다. 이로서 우리는 적어도 송금은 마음껏 무료로 할수 있다는 걸 확인할수 있습니다. (최소한의 CPU가 있다면)

조금 더 들어가보면,
https://github.com/EOSIO/eos/tree/master/contracts/eosio.token
에서 transfer를 찾아보실수 있습니다.

  "actions": [{
      "name": "transfer",
      "type": "transfer",
      "ricardian_contract": ""
    },{
      "name": "issue",
      "type": "issue",
      "ricardian_contract": ""
    }, {
      "name": "create",
      "type": "create",
      "ricardian_contract": ""
    }

즉 위의 contract에 있는 action들은 모두 RAM을 쓰지 않습니다.



Stake & Unstake

자 그 다음은 stake와 unstake입니다.

이 2가지는 eosio.system 에 속해있고, 여기에는 system과의 거래가 정의되어 있습니다. 자세히는 stake는 delegatebw으로, unstake는 undelegatebw으로 정의되어 있습니다.

https://github.com/EOSIO/eos/blob/master/contracts/eosio.system/eosio.system.abi

 },{
      "name": "delegatebw",
      "base": "",
      "fields": [
         {"name":"from", "type":"account_name"},
         {"name":"receiver", "type":"account_name"},
         {"name":"stake_net_quantity", "type":"asset"},
         {"name":"stake_cpu_quantity", "type":"asset"},
         {"name":"transfer", "type":"bool"}
      ]
    },{
      "name": "undelegatebw",
      "base": "",
      "fields": [
         {"name":"from", "type":"account_name"},
         {"name":"receiver", "type":"account_name"},
         {"name":"unstake_net_quantity", "type":"asset"},
         {"name":"unstake_cpu_quantity", "type":"asset"}

자 그럼 voting은? 네 맞습니다. 이것도 system과의 거래이죠. RAM이 부족하면 voting을 할수도, 철회할수도 없습니다.

    },{
      "name": "voteproducer",
      "base": "",
      "fields": [
        {"name":"voter",     "type":"account_name"},
        {"name":"proxy",     "type":"account_name"},
        {"name":"producers", "type":"account_name[]"}
      ]
    },

요기까지는 고 난이도이니, 살짝 스킵하셔도 되구요, 다음부터 보시겠습니다.

staking, unstaking에 따라서 얼마나 소모 되는지 볼까요?


3번 0.0001씩 (송금의 최소 단위) transfer하면서 찍은 snapshot입니다. 네 이미 보신 것 처럼 transfer에는 아주 소량의 bandwidth만 있으면 됩니다. CPU는 0.1이면 충분하고, Bandwidth는 940이면 충분한것이죠. 그리고 또 하나 CPU는 순간 사용량이 문제이고, bandwidth는 누적이 됩니다. 아마도 bandwidth도 일정주기로 다시 감소하는 refresh rate가 있을 것입니다. 이건 코드를 찾아보고 다시 말씀드릴게요.

이번에는 실제 staking에 따른 변화를 보겠습니다.

최초에 0.01EOS만으로 생성을 했더니 CPU가 0이고, 그래서 transaction자체가 실패합니다. 이 경우에는 다른 계정에서 staking을 CPU로 해주어야지만, 무언가를 할수 있게 됩니다.

일단 이런 계정도 있나보다..하고 보아 주세요. 참고로 eoscafekorea라는 계정입니다.
다시 부계정으로 돌아가서 우선 RAM을 1EOS만큼 샀습니다. 63KB가 생겼네요.

이제 위의 eoscafekorea 계정에 CPU를 할당해 주겠습니다.

할당할때마다 memory의 크기가 증가하는 것을 볼 수 있습니다. 그런데 잘 보시면 남에게 staking을 해주면, 해당 계정, 즉 staking을 받는 계정의 memory가 증가합니다. 보통은 자기 자신에게 할 터이니 자기 자신의 메모리가 증가하지만, 남에게 staking을 해주면 그 "남"의 메모리 사용량이 증가하게 됩니다.

이제 부터는 다시 부계정에서 진행한 값입니다. 이건 어느 계정이나 동일합니다.
이건 부계정의 초기값입니다. 아까 램을 사서 램의 최대치가 늘었습니다.

voting에는 0.2KB의 메모리가 필요합니다.

Unstaking에는 0.8KB가 필요하구요..

반대로 staking에는

0.32Kbyte의 메모리가 필요합니다.



마치며..


앞에서도 정리를 하긴 했지만, staking, unstaking, voting에는 RAM이 사용된다. 처음에 주어진 8K기준이라면 unstaking몇번 하면 꽉 차게 되니, 꼭 필요할때만 사용하시는 것이 좋겠습니다.

Refresh가 되는지, 혹은 계속해서 점유하는지는 각각의 자원이 RAM, Bandwidth, CPU에 대해서 다시 알아보고 글을 남기겠습니다.

그리고 계정을 깡통으로 만드는 것도 가능한지도 역시 확인하고 말씀드리겠습니다.

그럼 오늘의 실험을 마칩니다.

Sort:  

와~ 감사합니다~ 다음글도 기대 됩니다.

감사합니다!!!

실험정신이 아주 필요한 시기입니다. 감사합니다. ^^

감사합니다. 조만간 이런 실험과 기본 지식을 모아서 책으로 내볼까 합니다. 관심 감사하고, 감사의 의미로 풀봇 찍었습니다.

다음 테스트도 기대되네요 👍

감사합니다. 종종 새로운 실험으로 찾아뵙겠습니다.

리스팀 팔로우 했습니다 ㅎㅎㅎ 처음부터 차근차근 다시 읽어봐야겠어요 !!

감사합니다. 저도 팔로우 & 풀봇 했습니다. "방향만 맞다면"..이라는 문구가 강하게 와닿습니다. 좋은 금요일 보내세요.

좋은 실험 감사합니다 :)
리스팀 완료 !!!

와핫..크리머님...리스팀 감사합니다.

@nado6miri님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@creamer7님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@louispark님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@dragonticketer님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@krexchange님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@kwonjs77님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@cheolwoo-kim님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@goodnewworld님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@cdy1002님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@yoowonsuk님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@skazhaclazlo님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@neogia님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@stonecone님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!

@mike0427님께서 이 포스팅에 많은 관심을 가지고 있어요. 리스팀을 해주셨군요~!