오픈소스 작업록: 1년만에 고친 Prysm Sequence Number 이슈
발단: 이슈 발견
작년 8월에 Prysm에서 P2P 관련 이슈를 발견하고, PR을 올렸었습니다(위 글에서 Prysm #4). 이슈를 간단하게 설명하면 다음과 같습니다.
- 이더리움의 CL 노드는
seq_number
라는 것을 각자 가지고 있습니다. 일종의 버저닝을 위한 값으로, 스스로 메타데이터가 업데이트되면 하나씩 증가합니다. - P2P 네트워크에서 노드들끼리 서로 Ping을 하는 과정에서, 내가 알고 있는 상대방의
seq_number
가 상대방이 제공한 값보다 크면 해당 Ping 메시지를 거절하게 됩니다. - Prysm에는
--p2p-static-id
라는 옵션이 있습니다. 노드를 종료 후 재시작하더라도, P2P 네트워크에서 내 Identity는 유지하는 옵션이라고 볼 수 있습니다. - 문제는 여기서 발생합니다. Prysm에서
seq_number
가 업데이트되더라도, 업데이트된 값이 저장되지 않았습니다.
원래 --p2p-metadata
라는 옵션이 있었고, 이 옵션을 통해 메타데이터를 파일로써 제공할 수 있기 때문에, 제 PR은 해당 파일에 메타데이터가 수정될 때마다 파일 시스템에 쓰는 변화였습니다.
전개: 급작스러운 관심

PR 제출 후 한동안 잠잠하다가, 올해 7월 중순 갑작스럽게 관심(!)을 받게 됩니다. PeerDAS를 작업하고 있는 Manu에게 이후 어떤 연유인지 물어봤는데, Fulu Devnet에서 해당 P2P 이슈를 발견했고 그러던 중 제 PR을 발견한 것이었습니다.
꽤 오래된 코드였기 때문에 Rebase 작업이 필요했고 즐겁게 작업을 했습니다. Fulu에서는 P2P 메타데이터 버전이 하나가 더 추가되었기 때문에, 총 세가지 버전에 대응하는 코드를 새로 작성했어야 했습니다. (e.g., 파일로부터 읽을 때 메타데이터 버전을 판단하는 방법 등) 빠르게 작업을 마무리했고, 리뷰를 요청드렸습니다.
Design decision, Idiomatic Go에 대한 논의가 몇번 오가던 중, 이 PR이 닫힐 위기에 처하게 됩니다..!
위기: 파일 시스템 대신 DB를 쓰자

그러던 중, 기존 파일 시스템에 의존하던 메타데이터 저장 방식을 DB 레벨에서 관리하자는 의견이 나옵니다. 일단 --p2p-metadata
기능 자체가 상당히 오래된 기능이면서, 제대로 동작하지 않았던 이슈도 있었기 때문에 과감하게 이를 옮기자는 것이었습니다.

기존에 존재하던 기능을 Deprecate시키는 것은 메인테이너들의 몫이긴 하지만 저도 작업을 하면서 느낀 바를 공유를 드렸습니다. 파일 시스템에 자주 Write하는 것은 Best Practice가 아니라고 생각했었기 때문입니다. 특히 에러 핸들링이 곤란했는데, 파일의 권한 문제 등을 모두 고려하려면 상당히 복잡했고 불필요한 코드들이 필요할 것 같았습니다.

결국, 이 PR은 닫히게 되었습니다. 하지만 개인적으로 이 이슈를 마무리하고 싶다는 욕심도 있었고, 개발 방향성이 확실히 정해진 것 같아 구현 난이도가 그리 높지 않을 것이라는 생각에, DM으로 제 의사를 전달했습니다.
결말: Finally Merged!
어떤 부분들이 필요한지 Github Issue로 정리했고, 이를 할당받아 빠르게 작업해 PR을 올려두었습니다. 저번 PR에서 Idiomatic한 코드에 대한 리뷰를 받았던지라, 리뷰 hop을 최대한 줄이기 위해서 이 부분을 신경을 많이 썼습니다.
테스트는 Ephemery Testnet에서 boltbrowser를 이용해 DB를 열어보고 값을 변경해보면서 진행했습니다. 간단한 기능이라 동작 확인도 빠르게 할 수 있었습니다.

한 번 정도 리뷰-반영 사이클을 돌렸고, Approve는 이전 PR의 컨텍스트가 있었기 때문에 생각보다 빠르게 받을 수 있었습니다!

오픈소스 기여를 1년 가까이 틈틈이 하고 있는데, 이렇게 팀 멤버들과 티키타카를 하면서 기능과 코드의 완성도를 높여간 경험이 굉장히 특별해서 기록해두고 싶었습니다. Go 코드를 더 깔끔하게 쓰는 방법을 배웠고 (특히 에러를 다루는 흐름), Prysm에서 DB는 건드려본 적이 없었는데 이번 기회에 가볍게 맛을 봤습니다. 팀 멤버들이 다들 친절하게 리뷰해주고 빠르게 소통해주었기 때문에 매우 즐거운 기여 경험이었습니다!