[오픈소스 contribution 도전기] IBC Query

[오픈소스 contribution 도전기] IBC Query
Photo by Francesco Califano / Unsplash

[요약]

디사이퍼, a41에서 팀을 꾸려 오픈 소스 컨트리뷰션을 진행했고, 머지가 되는 성과를 얻었다(22.06 ~ 22.12)

  1. 코스모스 IBC는 현재 체인 간 쿼리하는 기능이 없다.
  2. 디사이퍼에서 이를 구현하여 contribution을 하려는 팀이 구성되었다.
  3. 아키텍처를 설계하였고, 체인 모듈과 릴레이어를 구현하는 소규모 팀으로 다시 나누어졌다.
  4. 체인 모듈은 구현 완료하였으나 안타깝게도 받아들여질 가능성이 거의 없어졌다(결과적으로 내가 담당한 부분은 contribution에 실패하였다😢)
  5. 릴레이어는 재단에서 Stride 팀이 구현한 모듈에 스펙을 맞추면 좋을 것 같다라는 피드백을 받았다.
  6. 릴레이어는 머지가 되었다!

코스모스 IBC에서 쿼리의 필요성을 느끼다

IBC의 자세한 동작이 궁금하면 내가 예전에 작성했던 미디엄을 참고하는 것을 추천한다.

[코스모스 간단 설명]

코스모스는 IBC(Inter-Blockchain Communication Protocol) 프로토콜을 통해 여러 앱체인간 토큰과 데이터를 전송할 수 있도록 지원해준다. IBC의 스펙은 ICS(Interchain Standard)로 표준화되어 있고, 이를 cosmos-sdk에 반영하여 코스모스 생태계에 참여하는 체인 개발자들이 사용할 수 있도록 도와주고 있다. 예를 들어 ICS-20은 Fungible 토큰 전송에 대한 표준이고, ICS-721은 NFT 토큰 전송에 대한 표준이다.

[코스모스 표준 ICS란?]

토큰 전송 말고도 ICS는 체인간 모든 상호작용에 대한 표준을 정하고자 한다. 대표적인 재미있는 표준은 ICS-27 (Interchain Account)과 ICS-28(Interchain Security, cross chain validation)이다. ICS-27은 A체인의 account가 B체인의 account가 트랜잭션을 수행하도록 허용한다(자세한 설명은 미디엄 참고). ICS-28은 타 체인에게 보안을 공유해주는 것으로, 자신의 체인 검증인들이 타 체인의 검증도 같이 해주는 것이다.

[코스모스에서 체인 간 쿼리 기능의 필요성을 느끼다]

이러한 다양한 기능이 존재하지만, 빌더 입장에서 필요한 기능인 타 체인에 대한 쿼리 기능이 구현이 되어 있지 않았었다. 당시 IBC-query에 대한 draft는 올라온 상태였지만 제대로 해당 기능을 구현하고 있는 팀은 없었다. IBC-query가 구현된다면 빌더들은 다음과 같은 use-case를 쉽게 구현할 수 있었다.

  • Dex, 랜딩 프로토콜: 다른 체인의 토큰 가격을 사용할 수 있게됨
  • Liquid staking: 지분은 전체 스테이킹된 물량 대비 본인이 스테이킹한 물량으로 계산이 된다. 코스모스 생태계에서 liquid staking을 구현하면 타 체인의 스테이킹량을 알아야 지분을 계산할 수 있다.

IBC-query를 cosmos-sdk에서 지원하지 않았기에 빌더들은 스스로 이 문제를 해결해야 했다. 따로 봇을 사용해 다른 체인의 토큰 가격을 쿼리하고 데이터를 트랜잭션에 담아 자신의 체인에 제출해야 했고, 여기서 취약 지점도 생길 수 있었다.

디사이퍼, a41에서 팀을 꾸리다

[개발 팀을 꾸리다]

디사이퍼에서 활동했었고 현재 a41에서 liquid staking 서비스인 supernova를 개발하시는 현식님이 이 문제를 학회에 소개하고 해결할 팀을 모집하였다.

이 얘기를 듣자마자 바로 하고싶었다. 풀고자 하는 문제가 명확하였고 오픈 소스에 내 코드를 반영하는 것 자체가 재미있을 것 같았다. 또한 한 학기동안 cosmos-sdk 및 ibc 코드를 봤고 회사에서 Go를 사용하고 있어 개발에도 자신이 있었다.

팀에 디사이퍼 학회원들 외에 a41 개발자분들도 합류하여 프로젝트를 진행할 때 큰 도움이 되었다. 특히 a41이 코스모스 서비스를 개발하고 있기 때문에 일이 더 잘 진행될 수 있었다.

[IBC 쿼리 아키텍처 설계]

구상했던 IBC-query 모듈 아키텍처

우리가 구상한 아키텍처에서 구현할 부분은 두 가지였다. 하나는 체인간 쿼리를 전송하고 받을 모듈이다. 이 모듈은 ibc-go 레포지토리에 반영이 되는 것이 목표였다. 다른 하나는 쿼리를 전달해줄 릴레이어이다. 릴레이어는 rust로 구현된 hermes에 반영되는 것이 목표였다.

[모듈 팀의 리드를 맡다]

나는 모듈 팀의 리드 역할을 하게 되었고 매 주 task를 할당 및 배분하여 프로젝트를 진행했다.

초기에는 IBC의 정확한 원리를 리서치하는데 주력하였다. 한국은 물론 해외에도 잘 정리된 자료가 없었기에 코드를 뜯어가면서 자료를 만들었다(그 결과가 바로 미디엄이다). 리서치를 하면서 초기에 잡았던 아키텍처를 변경하기도 하고 구현체도 많이 바꾸었다. 리서치를 즉각 활용하면서 아키텍처 설계하는 것이 재미있었다.

아키텍처가 완전히 잡힌 후 모듈 구현에 집중하였다. IBC 모듈 구현이 힘들었던 점 중 하나는 테스트가 힘들다는 것이었다. 실제로 작동이 잘 되는지 확인하려면 기능이 구현된 릴레이어를 사용해야 했다. 그래서 릴레이어 팀이 완료될 때까지 오로지 유닛 테스트만 사용했기에 한계가 있었다. 릴레이어 구현이 어느 정도 끝난 이후에는 e2e 테스트를 구축하여 완성도를 높여 나갔다(수 많은 왜 안되지...?의 연속).

중간 발표

22.09.20 크러스트

22년 9월 20일 디사이퍼 신분으로 한국 블록체인 밋업에 참여하게 되었다. 연사로 발표하게 되었는데, 개발 진행 중인 IBC-query 프로젝트에 대해 소개하고 질문을 받는 시간을 가졌다.

당시에는 실제로 반영이 될 수 있을지 미지수였는데, 많은 사람들이 관심과 질문을 주셔서 너무 감사했고 좋았었다.

발표를 준비하면서 다시 한번 프로젝트의 진행 상황을 점검했기에 프로젝트에도 큰 도움이 되었던 발표였다.

개발 완료. 그리고 일부의 성공

[모듈 팀]

IBC-query 모듈 팀 contribution 제안. https://github.com/cosmos/ibc-go/issues/2181

개발 완료 후 ibc-go 레포지토리에 이슈를 올려 컨트리뷰션이 가능한지 물어보았다. 오픈 소스에 기여 시도를 하는 것은 처음이라 어떻게 하는지도 몰랐고 연락처도 따로 없어 무작정 이슈에 우리가 누구이고 어떤걸 구현하였는지 소개하였다.

이슈를 보고 코스모스 쪽에서 연락처를 주었고 컨택할 수 있었다. 결과만 말하자면 모듈은 반영이 되지 못했다. 이미 Liquid staking 서비스를 개발하고 있던 스트라이드의 모듈을 반영할 확률이 높아졌기 때문이다. 각자 본업이 있는 우리 팀이 시간을 쪼개서 만드는 코드와 자신의 서비스를 위해서 만드는 스트라이드의 코드는 절대적인 투입량이 다를 수 밖에 없기 때문에 코스모스 측에서 소극적이었던 것 같다.

모듈 팀의 리드로서 많은 시간을 투자했고 팀원도 퇴근 후 새벽까지 작업했었기에 너무 아쉬운 결과였다. 지나고 생각해보니 cosmos sdk의 모듈은 코스모스 생태계에 큰 영향을 미치기 때문에 사이드 프로젝트로 하기에 너무 큰 프로젝트였던 것 같다. 그래도 처음 목표했던 수준까지 구현을 완료하였고 정말 할 수 있을까 싶었던 컨트리뷰션 시도도 해서 후회는 남지 않는다.

[릴레이어 팀]

릴레이어 팀의 hermes 레포지토리 머지 반영. https://github.com/informalsystems/hermes/pull/2915

릴레이어 팀에서는 현재 a41 소속이신 상윤님이 주로 개발하였다. 릴레이어 팀의 구현은 모듈 팀과 API 스펙만 맞춰 놓고 완전 독립적으로 개발하고 있었다. 상윤님 역시 hermes와 컨택을 하였는데, 스트라이드의 모듈 스펙에 맞춰서 구현을 해보는 것은 어떻냐는 제안을 받았다(이 시점에서 모듈 팀은 컨트리뷰션 노력을 거의 접었다..).

이후 릴레이어 팀의 노력으로 릴레이어의 IBC query 기능 구현은 성공적으로 hermes 레포에 반영이 되었다!! 내가 직접적으로 구현한 것은 아니었지만 같이 고생하며 의견 공유를 많이 했었기에 진심으로 축하할 수 있었다. 주변에서 이런 기여를 한 사람이 없었기에 더 신기했고 나도 오픈 소스에 꼭 기여를 해야겠다는 목표가 생겼다.

마무리

릴레이어 팀은 기여에 성공했지만 내가 직접 구현을 한 모듈은 반영이 되지 못해 나는 오픈 소스에 기여하지 못했다. 하지만 이번 경험을 통해서 많은 것을 얻어갈 수 있었다.

  • 나도 오픈 소스에 기여할 수 있다는 자신감
  • 긴 시간 동안 프로젝트를 하면서 얻은 팀원과의 친밀감
  • 하면 된다!

코스모스 체인을 처음 공부할 때만 하더라도 내가 직접 코어 코드를 작성하게 될 줄 몰랐다. 그런 것은 천재 개발자 일부만 할 수 있다고 생각했었다(물론 프로젝트 초기 아키텍처 설계 및 구현은 지금도 천재 개발자들이 주축이 되야 한다고 생각한다ㅋㅋ). 하지만 필요한 기능을 추가해서 구현하는 것은 내가 생각했던 것보다 어렵지 않았고 지금까지 내가 너무 겁을 먹고 있었다는 것을 깨닫게 되었다.

세상에 코드로 기여를 하는 방법은 생각보다 어렵지 않다. 개발자로서 역량을 기르면서 어떻게 세상에 선한 영향력을 미칠 수 있을지 항상 고민하자.