PoW 블록 믿기

Posted on December 27, 2020 by 주형

PoW 컨센서스를 사용하는 체인에서 어플리케이션을 만든다는 건 정말 간떨리는 일이다.

나는 개발할 때 확실한 게 좋다. 예전에 Node.js 의 DB 라이브러리를 쓰는데 어떤 에러가 발생할 수 있는지 제대로 명시가 되어있지 않아서 쓸 때 많이 불편했다. unique 키 에러가 나면 해당 에러만 나는 걸 잡고 싶은데 어떤 형식의 에러가 던져질지 알지 못했다. 내가 잘 모르고 있는 에러 케이스에도 대응하고 싶었는데 문서화가 안되어 있어서 알 수 없었다. 예전에 Java에서 디비 라이브러리도 명시를 안해줘서 고생했었다. 많지 않은 경험이지만 유독 내가 썼던 DB라이브러리들이 그랬다.

PoW 컨센서스를 쓰는 체인에 100% 확신이란 없다. 내 노드가 알고 있는 best block보다 더 점수가 높은 블록이 갑자기 나타날 수 있다. 게임 내 재화를 이더리움으로 살 수 있는 게임을 만들었다고 생각해보자. 내가 받았다고 생각한 이더리움이 나중에 보니 없어져있을 수 있다.

당연히 대책은 있다. 오래된 블록일수록 바뀔 확률이 줄어든다. 비트코인에서 공격자가 10%의 hash power를 가지고 있으면, 가장 최근 6개 블록을 갈아치울 수 있는 확률이 0.1% 미만이라고 한다. 상황에 따라 적당히 먼 과거의 블록을 읽는 것으로 문제를 해결할 수 있다.

하지만 이런 걸 보면 괜한 걱정이 든다. 정말로 바꿔치기 되면 어떡하지? 그 때 우리 코드는 어떻게 동작하지? 얼마나 확률이 작아야 안전한 거지? 이런고민들이 계속 떠오른다. 리스크를 팀과 공유하고, 다른 서비스들의 상황을 조사하여 우리 서비스에 맞는 결정을 하면 그만이다. 내 성격의 문제라고 생각하는데, 팀에서 결정을 내린 뒤에도 코드를 짜면서 계속 걱정이 든다.

생각해보면 git을 처음 쓸때도 random한 해시를 identifier로 쓴다고 해서 마음이 불편했었다. 지금은 많이 익숙해졌고, 확률도 매우 낮다는 걸 알아서 git을 쓸때마다 신경이 그리 불편하진 않다. 블록체인의 이런 특징들도 시간이 지나 익숙해지면 괜찮을까? 블록체인은 실제 돈이 오고 가는 거라 더 불편한 거 같기도 하다.