LiteTree 공개: Branching 기능을 갖춘, 빠른 데이터베이스 엔진

850만 명 이상의 SQL 개발자를 위한 블록체인

Hunyoung Park
Aergo blog
14 min readOct 16, 2018

--

Translated by the AERGO team. English version found here.

블록체인을 비롯한 신기술과 함께 소개되는 프로그래밍 프레임워크와 개발 언어는 이해하기 어렵습니다. 분산 어플리케이션 플랫폼의 강자인 이더리움(Ethereum)에서 사용되는 솔리디티(Solidity)를 그 예로 꼽을 수 있습니다. 개발자들은 솔리디티를 활용해 자가 집행(Self-enforcing)되는 비즈니스 로직을 스마트 컨트랙트로 표현하며, 이를 기반으로 어플리케이션을 개발해 일관성 있고 신뢰도 높은 트랜잭션 기록을 확보할 수 있습니다.

솔리디티를 통해 분산 아키텍처에서 실행되는 흥미진진한 신규 어플리케이션들이 출시됐지만, 이는 헌신적인 소수의 기술 전도사(evangelist)에게만 국한됐습니다. 대다수 개발자에게는 복잡하고 익숙하지 않은 언어였기 때문입니다.

전 세계 1,800만 명 이상으로 추산되는 소프트웨어 개발자 중, 1%도 안 되는 개발자들만이 솔리디티를 활용할 수 있을 거라 예상됩니다. 기존 프로그래밍 표준에 익숙한 개발자 대다수는 개발 유연성이 부족하거나, 새로운 언어를 익히고 활용하는 데 어려움을 겪기 때문입니다. 기업 역시 IT 관련 프로젝트를 하청이나 계약직 직원에게 맡기는 경우가 많습니다. 이들이 프로젝트를 위해 새로운 언어를 배우길 원할 가능성은 아주 낮습니다. 블록체인 기반의 핵심 비즈니스 로직과 규칙을 쓰고 코드화시키는 업무를 외주 업체에 전부 맡긴다는 것은 현명하지 못한 일입니다.

블록체인 어플리케이션 개발이 대중화되기 위해선, 프로그래밍 프로세스가 이해하고 따라 하기 쉬워야 합니다.

블록체인 어플리케이션 개발 대중화를 위한 유일한 방법은 익숙한 개발 환경을 통해 개발자들이 이미 보유한 경험과 전문성을 최대한 살릴 수 있도록 하는 것입니다. AERGO를 통해 이를 가능케 하고, 더 넓은 시장이 블록체인 개발에 뛰어들 수 있게 됩니다. 우리는 블로코가 구축해온 23개의 상용 프라이빗 체인 사례를 기반으로 한 정교한 SDK와 IDE, 실용화 적용 사례 중심의 구축 청사진을 공유하고자 합니다.

나아가, 850만 명이 넘는 SQL 개발자들이 손쉽게 블록체인 개발이 가능하도록 SQL이라는 유서깊은 언어를 활용하고자 합니다. 이런 노력의 일환으로, 브라질 R&D팀은 AERGO 기능 세트에 탑재될 강력한 SQLite 엔진을 개발해왔습니다. 이를 통해 블록체인 어플리케이션 및 코드 개발 대중화에 앞장서고자 합니다.

LiteTree를 소개합니다.

하나의 데이터베이스에 다수의 connection이 포함되며, 각각의 connection은 동시에 서로 다른 branch 혹은 commit을 불러오는 것이 가능하다고 상상해보세요. 하나의 데이터베이스가 완전히 분리된 branch에 기록할 수 있는 connection을 포함하는 건 어떨까요? 이 모든 것이 새로운 툴 하나로 가능합니다. AERGO 브라질팀 소속 개발자, 베르나르도 라모스(Bernardo Ramos)가 20년 이상의 소프트웨어 개발 및 관계형 데이터베이스 관리 경력을 쏟아 만들고 있습니다.

우리는 추후 발표될 수많은 오픈소스 프로젝트 가운데 가장 먼저 LiteTree를 공개하게 된 것을 자랑스럽게 생각합니다. LiteTree는 Branching 기능을 갖춘, 빠른 SQLite 엔진입니다. LiteTree 초기 버전이 우리 깃헙 페이지에 공개된 후, 다양한 개발자 커뮤니티에서 큰 관심을 받았습니다. 해커뉴스(Hacker News)의 첫 페이지에 오랫동안 소개된 것은 물론, 해커데이(Hackaday)오픈넷(OpenNet)에서도 큰 관심을 받았습니다. LiteTree는 그 혁신성과 오픈소스에 대한 기여를 인정받았습니다. 지금까지 1,250명이 넘는 개발자들이 깃헙 페이지를 즐겨찾기에 추가하기도 했습니다.

LiteTree는 두 가지 핵심 기능을 제공합니다.

  • Branching: 개발자들은 Git과 비슷한 구조의 LiteTree를 활용해 SQL 기반 데이터를 분리해 작업할 수 있습니다.
  • 속도: LiteTree는 굉장히 빠릅니다. 기존 SQLite 소프트웨어보다 두 배 빠른 읽기, 쓰기 속도를 자랑합니다.

LiteTree를 통해 한 데이터베이스의 여러 버전을 저장할 수 있으며, 각각의 branch를 개별적으로 개발하고 수정할 수 있습니다. 다시 말해, 사용자는 특정 development branch와 연결된 다양한 read point를 통해 데이터베이스에 접근이 가능합니다. LiteTree는 일반적으로 리눅스나 MacOSX에서 구동하는 SQLite에 비해 2배 이상 빠릅니다. SQLite 데이터베이스 페이지를 LMDB에 저장하는 방식으로 구현됩니다.

이제 우리가 왜 LiteTree를 개발하게 됐으며, 어떻게 블로코에서 활용됐는지, 그리고 내년 출시를 목표로 부던히 노력하고 있는 AERGO 프로토콜에서 어떻게 활용될지에 대해 설명하고자 합니다.

코인스택(Coinstack)

몇 달 전, 블로코는 23곳이 넘는 엔터프라이즈급 IT 환경에 구축된 풀 스택 퍼미션드 블록체인 제품인 코인스택에 SQL 기반 특정 시점 복구 기능(point in time recovery)을 추가하고자 했습니다. 이 특정 시점 복구 기능은 블록체인 위에서도 블록을 재배열하기 위한 데이터베이스 롤백을 제공하게 됩니다. 여러 번의 회의 끝에 코인스택에서 해당 기능을 제공하는 것이 좋겠다는 결론을 내렸습니다. 그리고 SQLite 엔진의 데이터베이스 복사용 수정판인 LiteReplica를 활용해 해당 기능을 구현했습니다.

그런데, 특정 시점 복구하는 것은 정확히 어떤 의미일까요? 그림 1에 조금 더 정확하게 표시되어 있습니다.

그림 1. 블록체인용 SQL 기반 스토리지 롤백 (특정 시점 복구)

하나의 블록이 0개 이상의 컨트랙트 트랜잭션을 저장할 수 있다고 가정해 보겠습니다. 이 블록이 가장 긴 체인에 성공적으로 연결됐다면, 모든 컨트랙트 트랜잭션마다 대응하는 SQL 스토리지에 commit 하나씩을 저장하게 됩니다. 이 commit은 컨트랙트 트랜잭션의 모든 업데이트 내역을 가지고 있습니다. 하나의 블록은 해당 SQL 데이터베이스 스토리지에 연동된 commit 포인트를 가지게 됩니다. 업데이트되지 않은 컨트랙트의 commit 포인트는 이전 블록의 commit 포인트와 같은 값을 지니게 됩니다.

그림 1에서 기존 최고 블록은 103번 블록입니다. 만약 블록 101에서 블록 110으로 새로운 블록이 보내지면, 이 블록체인은 100번 블록으로 롤백되어야 합니다. 따라서, 컨트랙트 A의 commit 포인트는 1이고 컨트랙트 B의 commit 포인트는 8입니다. 컨트랙트 B 데이터베이스를 commit 포인트 8로 롤백하면 해당 SQL 스토리지는 100번 블록에 대응합니다.

특정 시점 복구를 통해 우리는 새로운 블록의 컨트랙트 트랜잭션을 효과적으로, 끊김없이 수행할 수 있었습니다. 이 기능을 코인스택 플랫폼에 추가해 고객들이 다양한 구축 사례에서 활용할 수 있게 됐습니다.

우리는 지난 몇 달간 AERGO를 구축해왔습니다. AERGO는 코인스택과는 달리, 완전한 오픈소스 프로젝트이며 메인 체인 역시 퍼블릭 형태로 구축될 것입니다. 그래서 우리는 코인스택보다 더 많은 개발자들이 AERGO에 관심을 가져주셨으면 합니다. SQL과 같은 언어에 익숙한, 더 많은 데이터베이스 엔지니어들에게 우리 플랫폼을 알리고자 비슷한 기능을 AERGO에 탑재하기로 했습니다.

AERGO

대중화에 적합한 오픈소스 플랫폼을 만들기위해 우리는 블록체인 상에서 SQL을 지원하는 몇 가지 방법을 제공하고자 합니다.

  • AERGO의 데이터베이스 기능 제공 : SQL을 통해 데이터 조사와 향후 상호운용성 기능 체계화
  • SQL 기반 스마트 컨트랙트 : 스마트 컨트랙트 코딩에서 SQL 기반 구문 지원

블록체인상에서의 LiteTree 구현은 정교한 데이터베이스 기능을 블록체인에서 구현하는 첫 번째 시도입니다. 이는 간단한 키/값 저장 기반 시스템과 비교해, 체인 상의 데이터와 상호운용성 기능을 처리하는 데 있어 훨씬 편리한 방법을 제공합니다.

AERGO의 데이터베이스 기능 제공

AERGO에 LiteTree를 통합해 제공되는 핵심 기능은 크게 두 가지로 구분됩니다.

1. AERGO 체인을 위한 데이터베이스 스토리지 제어

위에서 설명된 바와 같이, LiteTree를 통해 블록 재구성이나 특정 시점 복원을 통한 롤백 기능을 비롯한 관계형 데이터베이스 기능을 원장에서도 사용할 수 있습니다. AERGO에서는 LiteTree를 통해 빠른 복원 기능을 제공하며, 이는 LiteReplica가 블로코의 코인스택에 적용되었을 때 보다 더 빠르게 진행됩니다.

그림 2에서 SQL 기반 상태 스토리지는 LiteTree를 통해 관리됩니다. SQL 스토리지는 구조화된 데이터를 저장할 수 있으며, SQL을 통해 접근할 수 있습니다. 한 컨트랙트 당 하나의 SQL 스토리지가 배정됩니다.

그림 2 : 블록체인에서 LiteTree를 사용하는 방법의 예

AERGO의 LiteTree Branching: LiteTree를 통해 초고속 SQLite 엔진의 견고한 기능은 물론, branching 기능까지 사용할 수 있습니다. 이는 AERGO의 n-tier 아키텍처를 활용하기 위해 초기부터 기획된 것입니다. 초기에 블록 병렬화 솔루션의 일환으로 블록체인의 Git-like branch를 제공하고, LiteTree를 구현해 branch에서 관계형 데이터베이스 스토리지 관리가 가능하도록 할 계획이었습니다(현 기술 백서에서 설명되어 있듯이). 하지만, 대신 1st-layer 프로토콜 레벨의 데이터베이스 스토리지를 활용하기로 계획을 수정했습니다. 초기 개발된 LiteTree의 branch 기능을 더 이상 사용하지 않게 됨을 의미합니다. 그 대신 우리는 현재 다양한 방식을 연구하고 있으며, 추후 스토리지 레벨의 branchability가 AERGO에 어떻게 적용될지 개발 커뮤니티에 공유하고자 합니다.

2. 블록에 대응하는 다중버전 병행성 제어(Multi-Version Concurrency Control)

AERGO에 LiteTree가 구현되면 다중버전 병행성 제어가 가능해지며, 개발자들은 각기 다른 블록 높이에서도 일관성 있는 데이터를 볼 수 있습니다.

SQL 기반 스마트 컨트랙트

AERGO는 스마트 컨트랙트 개발 단계에서 SQL을 지원해 더 다양한 개발자 커뮤니티에서의 플랫폼 대중화를 이루고자 합니다. AERGO 플랫폼에는 AERGOSQL이 포함됩니다. AERGOSQL은 SQL 형식의 구문과 문법을 사용하는 코딩언어 기반의 규범적인 스마트 컨트랙트 엔진입니다.

AERGOSQL의 순조로운 개발과 현재 베타 버전이 테스트 중임을 발표하게 되어 기쁘게 생각합니다. 오픈소스 공개에 관한 자세한 정보는 곧 발표될 예정입니다. AERGOSQL의 첫 번째 공개 버전에는 콜 레벨의l SQL 지원이 포함되며, 문법 구현형 SQL 지원은 추후에 공개될 예정입니다.

LiteTree 사용법

각 데이터베이스 트랜잭션은 commit으로 저장되며, 각 commit은 증분값(incremental number)을 가집니다. 빈 데이터베이스에 처음 SQL 명령어를 실행하는 경우를 가정해보겠습니다.

이제 자동적으로 생성된 masterbranch 에 첫 번째 commit이 생성됐습니다.

새로운 트랜잭션을 실행하면 current branch에 새로운 commit이 추가됩니다.

이제 총 3 commit이 생성됐습니다.

다수의 SQL 명령어를 한 commit에 포함하기 위해선 BEGINCOMMIT 명령어 사이에 삽입해야 합니다.

source branch와 commit 넘버 정보를 가진 새로운 branch를 생성해보겠습니다.

이 명령어가 실행되면, 아무런 데이터가 없는 새로운 branch가 생성됩니다. 이 database connection은 새로운 branch로 옮겨지며, current branch로 설정됩니다. 아래의 명령어로 current branch를 확인할 수 있습니다.

이 경우, test 값을 반환합니다.

SQL 명령어를 이 database connection에서 실행한다면 해당 connection의 current branch에 commit으로 저장됩니다.

그림으로 표현하면 다음과 같습니다.

또, 새로운 branch의 database를 조회할 수도 있습니다.

아래와 같은 값을 반환합니다.

first

from test branch

아래의 명령어를 통해 master branch로 이동할 수 있습니다.

같은 SELECT 구문을 master branch에서 실행하면 다음과 같은 값을 반환합니다.

first

second

각각의 branch에 각기 다른 콘텐트를 가진 같은 테이블이 저장됩니다.

다른 branch에 저장된 commit은 첫 번째 commit과의 거리를 기반으로 같은 규칙의 번호가 매겨집니다.

아래와 같이, 해당 커밋으로 이동해 특정 시점의 데이터베이스를 읽어올 수도 있습니다.

이 시점에 테이블 t1에는 한 줄만 있으며, SELECT를 실행할 경우, first만 반환하게 됩니다.

쓰기는 오직 각 branch의 head에서만 가능해 defined commit 상에서는 데이터베이스에 데이터를 쓸 수 없습니다. 이전 commit에 수정을 해야 한다면 해당 commit부터 시작하는 새로운 branch를 생성해야 합니다. 특정 commit의 branch를 초기화하고, branch의 이름을 변경하며, 삭제하고 branch 정보를 읽어오는 것 모두 가능합니다.

몇 기가바이트 이상의 저장 공간을 필요로 하는 큰 데이터베이스에서도 LiteTree를 활용할 수 있습니다. 새로운 branch를 생성할 때 데이터까지 복사되지 않기 때문입니다. 새로운 트랜잭션이 최종 적용될 때 수정된 데이터베이스 페이지만 복사됩니다.

LiteTree의 Merging 성능

초기에 우리는 diff 나 merging 기능을 LiteTree에 포함하지 않기로 결정했습니다. AERGO가 이러한 기능이 필요하지 않다고 판단했기 때문입니다. 하지만, LiteTree 에 대해 알게 된 많은 개발자는 이러한 성능에 관심을 보였고, 우리는 적극적으로 이 기능들을 포함하고자 합니다. 단순히 오픈소스 프로젝트가 아닌, 오픈소스 플랫폼과 그 기반이 되는 생태계를 구축하기 위해, 우리가 공개하는 코드나 도구들을 최대한 매력적이고 유용하게 만들어 더 많은 개발자가 우리 생태계에 참여할 수 있도록 할 것입니다.

결론

요약하자면, LiteTree를 AERGO에 구현하는 것은 개발자들에게 많은 데이터베이스 기능을 제공하고, 그들이 각자 가진 SQL 코딩 경험을 블록체인 위에서 사용할 수 있게 합니다. 우리는 데이터베이스 스토리지 기능을 위한 LiteTree의 branching을 AERGO의 n-tier 블록체인 디자인에 녹이고자 합니다. 이를 통해 개발자나 기업이 AERGO 플랫폼 위에서 체인을 구현하고 관리하는데 프로그래밍 편의성을 극대화하고자 합니다.

더 많은 프로젝트에서 LiteTree가 사용되고, 기술 커뮤니티에서 이를 활용해 만들어 나갈 가능성을 기대합니다. LiteTree의 추가 기능과 관련해 곧 공개될 새로운 업데이트를 기대해주시고, 개발자분들의 많은 참여 부탁 드립니다.

LiteTree나 AERGO 기술적인 부분에 참여하고 싶으신 분들을 위해, 공식 Discord 채널을 열었습니다.

새로운 소식은 아래 소셜미디어 채널을 통해 받아보실 수 있습니다.

--

--

Hunyoung Park
Aergo blog

Board Member of the AERGO Foundation and CTO at Blocko Inc.