아이콘의 비상식적인 행보

ICON은 작년 성공적인  ICO를 밑거름으로 고속 성장하고 있는 유명한 블록체인 프로젝트이다. 이더리움과 마찬가지로 스마트 컨트랙을 통해 다양한 DApp을 서비스할 수 있는 체인이며, 서로 다른 여러 체인을 연동하는 인터체인 프로젝트이기도 하다.

자타가 공인하는 국내 최고의 블록체인 기술 기업이지만, 마케팅과 사업 제휴 능력에 비해 의외로 기술력을 보여준 것이 없고 기술 개발과 관련된 그간의 행보도 무척이나 비상식적이다.

 

1. 스크린샷으로만 존재하는 메인넷 런칭 소식

아이콘은 2018 1 24 Hello ICON World 블로그를 통해 메인넷 런칭 소식을 알렸다. 하지만 공개된 건 제네시스 블록 스크린샷 한 장 뿐 메인넷의 주소도 블록 익스플로러로 공개하지 않았다.

 

2. 소스 코드 비공개

1월에 이미 메인넷을 런칭했다고 하는데 아직도 소스 코드는 공개하지 않고 있다. ICO를 위해 공개한 프로토타입 수준의 loopchain 소스 코드 6개월 넘게 업데이트 없이 방치되고 있다.

icon.support FAQ 소스 코드를 공개하지 않는 이유를 다음과 같이 밝히고 있다.

We are developing on Gitlab for internal uses. It is because currently ICON is being used by actual institutions, and opening the related sources is concerned to their intellectual property rights. We need some time to sort this part out from the rest and make it open sourced and update to github. We will soon open our technical development community and start to develop on the basis of github completely.

ICON을 이미 사용하고 있는 곳의 지적재산권 때문에 소스 코드를 공개하지 못하고 있다는 해명인데, 해명 자체도 석연치 않지만 이 해명이 사실이라고 해도 공개 블록체인으로 펀딩 받은 프로젝트의 지적재산권을 온전히 소유하지 못하고 있다는 건 심각한 문제이다.

 

3. 수준 이하의 개발력과 실망스러운 대응

6 18일 이더리움 위에 발행된 아이콘 ERC20 스마트 컨트랙에서 어이 없는 실수가 발견되었다. 개발자가 코딩 실수로 아이콘 관리자에게만 허용되어야 하는 전체 거래 중지 및 재개 기능이 모두에게 허용된 것이다.

일단 1월에 메인넷을 런칭했는데 6 18일까지도 이더리움 상에서 토큰 거래가 이루어지고 있었다는 사실 자체가 이상하다. 스마트 컨트랙 실행은 커녕 토큰 거래도 못 하는 메인넷을 6개월 가까이 운영하면서 뭘 한 걸까?

스마트 컨트랙에서 발견된 버그는 단순한 코딩 실수로 개발자가 테스트 한 번만 해봤어도 발견할 수 있었다. 어이 없는 실수지만 버그 없는 소프트웨어란 없고 다행히 금전적인 손실을 초래하는 버그도 아니니 불행 중 다행이라 하겠다.

하지만 더루프 김종협 대표의 최근 인터뷰 해명은 무척 실망스럽다.

김 대표는프로그래밍에서 코드에 오류가 있는지 검사를 할 때 일반적으로는 CI(지속적 통합)유틸리티 툴을 사용해 지속적·자동적으로 검사가 하게 되는데, 중앙화 된 서버에서 개발이 이뤄지지 않는 블록체인에는 이 같은 자동화 검사의 개념이 없다때문에 개발자가 일일이 검사를 진행해야 하는데 이 같은 과정에서 사고가 발생할 수 있다고 설명했다. 그는 이어이처럼 CI 개념이 도입되지 않고 있다는 것은 블록체인 기술의 단점이라고 말했다.

아이콘 스마트 컨트랙 버그는 CI 없어도 개발자가 딱 한 번이라도 테스트해봤으면 바로 알 수 있는 단순한 버그다. 그런데 김 대표는 이걸 블록체인 특성상 어쩔 수 없는 문제인 것처럼 해명하고 있다.

그리고 일부 언론은 이 버그가 아이콘 구현의 버그인 것처럼 보도하고 있는데, 아이콘 메인넷에서 발생한 버그가 아니라 이더리움 위에 구현된 아이콘 ERC20 토큰에서 발생한 버그다.

 

ICON은 작년 ICO를 통해 충분한 자금도 확보했고 최근 대대적인 충원을 통해 개발력도 확충했을 거라고 본다국내 블록체인 산업의 신뢰 확보를 위해서라도 더 이상의 비상식적인 행보를 멈추고 제대로 개발해서 소스 코드도 공개하고 메인넷도 확보하길 진심으로 기원한다. 화이팅이다.

BFT 합의 알고리즘

Tendermint, Casper the Finality Gadget, BFT+dPoS 등 많은 합의 알고리즘이 BFT 기반의 합의 방식을 사용하고 있습니다. BFT는 분산 컴퓨팅 분야에서 많은 연구가 되었고 safety나 liveness를 수학적으로 보장할 수 있기 때문에, 앞으로 더 많은 합의 알고리즘이 BFT를 차용하여 성능이나 확인 시간을 개선하는 용도로 사용할 것으로 보입니다.

BFT 방식의 합의 알고리즘을 실용적인 수준으로 쓸 수 있도록 개선한 PBFT(Practical Byzantine Fault Tolerance) 논문이 1999년에 나왔는데, 당시는 블록체인이 없었기 때문에 블록이 아닌 개별 연산(operation)의 순서를 보장하는 용도로 사용이 되었고 논문에서는 BFT한 NFS(Network File System)를 구현하였습니다.

이후에 나온 Tendermint 합의 알고리즘은 BFT를 블록체인에 맞게 다음과 같이 수정/보완하였습니다.

  1. 리더를 하나로 고정하지 않고 매 라운드마다 교체
  2. 노드를 동적으로 더하거나 뺄 수 있는 기능 추가
  3. Point-to-point 통신 대신 gossip 프로토콜 사용

특히, 리더를 라운드마다 교체하도록 한 부분이 중요한데 리더가 비잔틴일 경우 새로운 리더를 선출하기 위해 필요한 리더 선출 알고리즘을 단순화할 수 있고, 하나의 리더가 자신에게 유리한 트랜잭션만 선택적으로 블록에 포함시키는 행위를 방지할 수도 있습니다.

관련 내용에 관심 있으신 분은 Tendermint과 PBFT 비교 글을 참고하시기 바랍니다.

해시 충돌

비트코인을 비롯한 거의 모든 블록체인 시스템은 해시 함수의 collision을 찾기가 어렵다는 사실을 전제하고 있습니다. 비트코인은 SHA256, 이더리움은 Keccak 해시 함수를 사용하고 있는데, 만약 이들 해시 함수에 collision이 발견되면 비트코인이나 이더리움의 안정성을 담보할 수 없게 됩니다.

비트코인 스크립트 언어를 이용하면 hash collision을 찾았을 때 자동으로 상금(bounty)를 지급하는 스크립트를 작성할 수도 있습니다. 2013년 Peter Todd가 실제로 이러한 바운티 프로그램을 제안하였고, SHA1, SHA256, RIPEMD160과 같은 해시 함수 뿐만 아니라RIPEMD160(SHA256()), SHA256(SHA256())와 같은 더블 해시에도 바운티를 걸었습니다.

자세한 내용은 아래 링크에서 볼 수 있습니다.

https://bitcointalk.org/index.php?topic=293382.0

일례로, SHA1에 대한 스크립트는 다음과 같습니다.

scriptPubKey: OP_2DUP OP_EQUAL OP_NOT OP_VERIFY OP_SHA1 OP_SWAP OP_SHA1 OP_EQUAL
scriptSig: <preimage1> <preimage2>

두 개 의 서로 다른 메시지를 넣어서 각각 SHA1 해시를 구한 다음 비교했을 때 같은 값이 나오면 SHA1 해시에 collision이 발생한 것이고, lock script가 풀리게 됩니다.

그리고 2017년 2월에 실제로 누군가가 SHA1 바운티를 풀어서2.48 비트코인을 상금으로 가져갔습니다!

https://blockchain.info/address/37k7toV1Nv4DfmQbmZ8KuZDQCYK9x5KpzP

다행히 비트코인은 SHA1이 아닌 SHA256 해시 함수를 사용하고 있기 때문에 SHA1 해시가 풀린 사건이 비트코인에 직접적으로 영향을 미치지는 않습니다. 다만, 이 사건은 해시 함수의 안정성이 얼마나 중요한지를 잘 보여주고 있습니다. 관련 내용은 아래 레딧 링크에서 보실 수 있습니다.

가짜 블록체인 기술

전세계에서 블록체인 열기가 가장 뜨거운 한국. 덕분에 어처구니 없는 일들도 많이 일어난다.

가장 대표적인 예는 소스 코드도 외부 참여도 없는 메인넷. 메인넷을 런칭했는데 공개된 소스 코드도 없고, 오직 개발사만 노드를 운영하고 있다면 그런 블록체인이 중앙화된 서버와 뭐가 다를까? 해당 블록체인이 어떤 로직으로 동작하는지 알 수도 없고, 트랜잭션을 내 손으로 직접 검증(validation)해볼 수도 없는 블록체인은 무늬만 블록체인인 서버 기술이다.

국내 대표 코인 아이콘이 대표적인 예다. 지난 1월 메인넷을 런칭했고 얼마 전부터 ERC20 토큰을 메인넷 토큰으로 교환해주는 토큰 스왑을 시작했다. 하지만 메인넷의 소스 코드는 이런 저런 핑계로 공개를 미루고 있고, 메인넷 노드도 아이콘 외에 다른 기관이 운영하고 있는 것처럼 보이지 않는다.

아이콘이 블록체인 기술로 그 어떤 신뢰도 제공하지 못하고 있음에도 불구하고 코인마켓캡 기준으로 6000억원이 넘는 가치를 가지고 있다는 사실이 시사하는 바는 매우 크다. 현재 아이콘의 가치는 블록체인 기술이 아닌 아이콘 재단에 대한 신뢰에 기반하기 때문이다. 중앙화된 발행기관에 대한 비판에서 나온 블록체인 기술이 오히려 중앙화된 발행기관에 대한 신뢰에 절대적으로 의존하고 있는 셈이다. 아이콘은 한국의 대표 블록체인 기술을 표방하지만, 역설적으로 블록체인 기술의 가치를 철저히 부정하고 있다.

 

Tendermint로 배우는 블록체인 코어 개발

블록체인 플랫폼을 만들려면 합의 알고리즘 외에도 트랜잭션 포맷, P2P 네트워크, 직렬화, 스토리지, 키 관리, 암호 알고리즘 등 여러 요소들을 고민해야 합니다. 하지만 보통 블록체인 기술 백서는 합의 알고리즘 위주로 1-2개의 주요 기술 요소만 설명하고 다른 요소에 대해서는 언급을 하지 않는 경우가 많습니다.

블록체인 기술을 직접 만들려면 이런 요소들도 간과할 수가 없는데, 비트코인, 이더리움 소스 코드를 보는 방법 외에는 마땅한 리소스가 없는 것도 사실입니다. 블록체인 구현 기술에 대해 궁금한 분에게 추천 드리는 문서는 Tendermint의 CTO인 Ethan Buchman가 석사 논문으로 작성한 Tendermint: Byzantine Fault Tolerance in the Age of Blockchains입니다.

Tendermint 합의 알고리즘 뿐만 아니라 블록체인 구현에 필요한 여러 기술 요소들에 대해 간결하게 잘 설명하고 있고, 배경 지식, 다른 블록체인 플랫폼과의 비교 등도 포함되어 있어서 블록체인 기술을 구현 수준에서 공부하시는 분들에게 좋은 가이드가 될 것 같습니다.

Go 언어로 구현된 Tendermint 소스 코드도 참고하세요!

 

이더리움 트랜잭션 malleability 문제

이더리움은 ECDSA 이용하여 트랜잭션을 서명하고 서명값(r, s, v)를 트랜잭션에 붙여서 보냅니다. 트랜잭션 해시는 서명을 포함하기 때문에 서명값에 따라 트랜잭션의 해시 값도 달라집니다.

이더리움 블록 헤더의 transactions root 필드는 각 블록 내의 트랜잭션 인덱스를 키로 각 트랜잭션의 해시를 저장해서 만든 merkle patricia tree 루트입니다. 블록을 검증할 때 헤더의 transactions root가 실제 트랜잭션으로 계산한 transactions root와 같은지 확인하는 방법으로 트랜잭션의 위변조 여부를 검사하고 있습니다.

그런데 서명 데이터 중 하나인 s는 타원곡선 상의 점이기 때문에 x축에 대칭인 타원곡선의 특징상 하나의 서명에 대해 high s, low s 두 개의 값이 모두 유효한 서명이 됩니다. 따라서 트랜잭션을 받아서 low s를 high s로 바꾸는 것만으로 서명의 유효성을 해치지 않고 트랜잭션의 해시 값을 바꿀 수 있게 됩니다.

이러한 문제를 트랜잭션 malleability라고 부르는데, 이더리움에서는 이 문제를 해결하기 위해 두 개의 s 값 중에 low_s만을 유효한 서명으로 인정하고 있습니다. 비트코인에서도 같이 같은 이유로 트랜잭션 malleability 문제가 있었고 역시 low_s만 유효한 서명으로 인정하는 방법으로 문제를 해결하였습니다.

비트코인의 BIP-62도 이 문제에 대해 설명하고 있으니 관심 있으신 분은 읽어보시기 바랍니다.

이더리움 트랜잭션의 서명 검증 방법

이더리움은 타원곡선디지털서명(ECDSA) 알고리즘을 이용하여 트랜잭션을 서명합니다. 비트코인과 마찬가지로 secp256k1 곡선을 사용하고 있습니다. ECDSA로 서명한 메시지를 검증하려면 서명에 사용한 비밀키에 대응하는 공개키가 필요합니다.

그런데 네트워크로 전송되는 이더리움 트랜잭션 포맷을 보면 서명자의 공개키가 포함되어 있지 않습니다. 트랜잭션에 보낸 사람의 주소는 포함되어 있지만 이더리움 주소는 공개키의 해시값이기 때문에 주소만 가지고 공개키를 복원하는 것은 불가능합니다.

그럼 이더리움은 어떻게 트랜잭션이 서명이 유효한지 검증할 수 있을까요? 놀랍게도 ECDSA는 메시지(트랜잭션의 해시)와 서명만 있으면 서명에 사용된 공개키를 복원하는 게 가능합니다. 완벽한 복원은 아니고 후보를 4개까지 줄일 수 있습니다.

그래서 이더리움은 4개의 후보 중에 어떤 공개키를 써야 하는지를 트랜잭션에 포함시켜서 보냅니다. 이더리움 트랜잭션 서명은 r, s, v 컴포넌트로 이루어져 있는데 여기서 r, s는 각각 32바이트로 이루어진 서명 데이터이고, v는 1바이트로 4개의 후보 중에 어떤 공개키를 사용해야 하는지 지정합니다.

자세한 내용이 궁금하신 분은 SEC 문서의 4.1.6 Public Key Recovery Operation을 읽어보시기 바랍니다.