코스모스 허브의 트랜잭션 수수료에 대해서 알아보자
코스모스 허브가 아직 초기라 사용자들이 트랜잭션의 수수료 방식에 대해서 혼란을 겪고 있는 것 같습니다. 이 글을 통해서 사용자 분들이 트랜잭션 수수료에 대해서 이해하고 더 안전하고 합리적인 가격으로 트랜잭션을 보낼 수 있게 되길 바랍니다.
과도하게 수수료를 소모한 트랜잭션
https://github.com/b-harvest/rescue-fatfinger
위의 사용자는 무려 29,959만큼의 아톰을 트랜잭션 수수료로 사용했습니다. 현재(2019년 5월 17일) 기준으로 한화 약 1억 6천만원의 금액입니다.
현재 위의 사용자를 위해 기부를 받고 있습니다. 저희 노드 A 검증인 팀은 위의 실수로 인한 트랜잭션의 수수료로 얻은 수익을 모두 본인에게 돌려드렸습니다.
트랜잭션 수수료 시스템
코스모스 허브의 수수료 시스템은 비교적 간단합니다. 블록체인에 관심이 있는 많은 분들이 이더리움의 가스에 대해서 들어보셨을 것입니다. 코스모스 허브에도 이더리움의 것과 비슷한 가스 시스템이 있습니다. 가스는 블록체인에서의 상태 읽기, 쓰기 그리고 로직 수행을 할 때 차감되며 사용자는 트랜잭션을 보낼때 사용할 가스의 최대값을 설정하게 됩니다. 즉, 가스는 이 트랜잭션이 블록체인에 얼마나 부담을 줬는지를 나타냅니다. 그리고 또한 1 가스당의 가격을 나타내는 가스 프라이스가 있습니다. 총 수수료는 가스 * 가스 프라이스가 됩니다. 여기서 최소한의 가스 프라이스는 각 검증인들이 설정하게 됩니다. 검증인은 자신의 수익과 블록체인의 안정성 등을 종합적으로 판단해서 최소한의 가스 프라이스를 설정하고 그 이상의 가스 프라이스를 가진 트랜잭션만을 블록에 포함시킵니다.
*실제 가스 프라이스는 트랜잭션에 존재하지않고 검증인이 트랜잭션을 검증할 때 (수수료 / 가스)를 계산하고 설정한 최소 가스 프라이스보다 높은 값일 경우 메모리풀에 저장하고 이후 블록을 만들 때 블록에 포함시키게 됩니다.
가스는 수수료를 결정짓는데 아주 중요한 변수입니다. 가스가 부족하게 되면 트랜잭션이 실패하게되며 사용한 가스는 환불되지 않습니다. 그렇기 때문에 이 경우엔 수수료를 그냥 낭비한 것이 됩니다. 만약 가스가 과도하다면 트랜잭션은 성공하지만 남은 가스는 환불되지 않기 때문에 필요 이상의 가스는 낭비하게 됩니다. 가스는 트랜잭션이 실제 수행된 로직에 따라 달라지기 때문에 이 값을 스스로 미리 계산하기는 어렵습니다. 지갑에서 가스 값을 설정하기 위해서 트랜잭션을 시뮬레이션하거나 트랜잭션 종류에 따라 필요한 가스 값을 통계적으로 설정하게 됩니다.
이론을 살펴봤으니 이젠 실제 지갑들의 사용법을 알아보겠습니다.
Gaiacli 사용법
가이아 cli를 통해서 토큰을 전송하는 예시를 보시겠습니다.
먼저 가이아 cli의 config를 설정합니다.
gaiacli config chain-id cosmoshub-2
gaiacli config node {your_rpc_node}
가장 간단한 커맨드로 트랜잭션을 보내보겠습니다.
gaiacli tx send cosmos15vztx5tw4np99favm9gat9tj0hd9x26ucrf8vl 1uatom — from test — fees 1uatom
Response:
Height: 372015
TxHash: 8C874A6FFF8B2F76CFCD1CCF3471FF2C34EDC2E7786B9DDA3D1C963C16BD4E0A
Raw Log: [{“msg_index”:”0",”success”:true,”log”:””}]
Logs: [{“msg_index”:0,”success”:true,”log”:””}]
GasWanted: 200000
GasUsed: 27561
Tags:
- action = send
- sender = cosmos15vztx5tw4np99favm9gat9tj0hd9x26ucrf8vl
- recipient = cosmos15vztx5tw4np99favm9gat9tj0hd9x26ucrf8vl
트랜잭션의 결과를 보시면 가스가 20만으로 설정되어 있는 것을 알 수 있습니다. 하지만 실제 사용된 가스는 2만 7천 뿐입니다. 현재는 검증인이 매우 낮은 수수료도 받아주기 때문에 큰 문제가 안되지만 이후 실질적인 수수료를 소모하게 된다면 남은 가스는 모두 낭비한 것이 됩니다. 그렇기 때문에 가스를 더 정밀하게 설정할 필요가 있습니다.
gaiacli tx send cosmos15vztx5tw4np99favm9gat9tj0hd9x26ucrf8vl 1uatom — from test — gas=”auto” — gas-adjustment=1.15 — gas-prices=0.000001uatom
Response:
Height: 372095
TxHash: 31EE7C77D6D1BC31E892B763F7BCFC9237DB6B95C14B15252B4E7319A8DE4E94
Raw Log: [{“msg_index”:”0",”success”:true,”log”:””}]
Logs: [{“msg_index”:0,”success”:true,”log”:””}]
GasWanted: 30265
GasUsed: 27585
Tags:
- action = send
- sender = cosmos15vztx5tw4np99favm9gat9tj0hd9x26ucrf8vl
- recipient = cosmos15vztx5tw4np99favm9gat9tj0hd9x26ucrf8vl
gas와 gas-adjustment 플래그를 통해서 가스를 시뮬레이션해서 설정할 수 있습니다. 가스는 시뮬레이션한 가스 소모량 * gas_adjustment로 설정되게 됩니다. 시뮬레이션 결과가 블록에 트랜잭션이 포함됐을 때와 완전히 일치하지 않을 수 있기 때문에 gas_adjustment를 +10~25% 정도로 설정한다면 가스를 최적화할 수 있습니다.
루니(Lunie)
이 글의 주제와는 다르기 때문에 루니의 사용법에 대해서는 다루지 않겠습니다. 루니의 사용법을 모르신다면 아래의 글을 참조해주세요.
루니에서 여러번의 트랜잭션을 실험해본 결과 루니는 먼저 트랜잭션을 시뮬레이션하고 가스 프라이스를 약 0.03 uatom으로 수수료를 책정하는 것으로 보입니다. 따로 수수료를 설정하는 방법이 없는 것이 아쉽지만 가스 프라이스가 충분히 낮기 때문에 합리적인 방식으로 보입니다.
Lunagram
https://play.google.com/store/apps/details?id=com.lunamint.lunagram
루나그램은 텔레그램 계정과 연동된 편리한 코스모스 생태계 지갑입니다. 현재는 수수료 설정에서 가스 값을 설정할 수 없고 가스가 20만으로 고정되어 있는 것으로 보입니다. 수수료만 크고 작게 설정할 수 있는데 코스모스 허브가 더 발전하고 트랜잭션을 보내기 위해 유의미한 수수료를 소모하고 블록에 담기는 트랜잭션이 더 많아진다면 20만의 가스는 과도하기 때문에 낭비가 있을 것으로 보입니다.
Cosmostation 지갑
https://play.google.com/store/apps/details?id=wannabit.io.cosmostaion
코스모스테이션 지갑 또한 위의 루나그램과 마찬가지로 가스를 20만으로 고정하고 수수료를 조절하는 기능만 있는 것으로 보입니다.
결론
아직 코스모스 생태계가 초기라 각 지갑들마다 수수료 책정에서 아쉬운 부분이 있습니다. 현재는 수수료가 매우 작고 트랜잭션이 별로 많지 않아 문제가 되진 않지만 곧 개선될 것이라 믿습니다. 생태계의 발전을 위해 힘쓰시는 지갑 개발자 분들에게 감사드립니다.
Node A-Team (노드명: ATEAM)은 Cosmos, IRISnet, Terra를 포함한 Cosmos-SDK, 텐더민트 기반 블록체인의 검증인입니다. Node A-Team은 풍부한 경험을 바탕으로 코스모스 생태계에 기여하고 최고의 보안으로 노드를 운영하고 있습니다.
> ATEAM History
— Cosmos: “Game of Stakes” — Never Jailed
— IRISnet: “FUXI Betanet” — Reward Winner
— Terra-project: “Genesis Drill” — Top Tier
[ATEAM 검증인 주소: cosmosvaloper14l0fp639yudfl46zauvv8rkzjgd4u0zk2aseys]