시작하기에 앞서
최근에 NFT 및 코인 개발을 진행할 수도 있는 일이 생겨서 블록체인과 솔리디티를 공부하면서 이해한 내용을 적으려고 합니다.
해당 내용은 블록체인 인 액션 서적을 읽으며 작성하였습니다.
블록체인의 차별화된 근본적인 개념
블록체인 프로그래밍을 진행하기에 앞서 블록체인이 가진 차별화된 네 가지의 근본적인 개념을 알고 있어야합니다. 이 내용은 우리가 객체지향 프로그래밍을 처음 배울 때 클래스와 객체의 개념이 무엇인지 이해해야하는 것처럼 매우 중요하지만 꼭 알고 있어야 합니다.
블록체인의 차별화된 네 가지 개념은 아래와 같습니다.
블록체인 인프라 - 블록체인 프로토콜, 스마트 컨트랙트, 애플리케이션을 지원하는 특정한 컴퓨팅 하드웨어와 소프트웨어 스택입니다. 이 인프라의 주 구성 요소는 컴퓨팅 노드와 이들 노드를 연결하는 네트워크입니다.
분산 장부 기술 - 인프라 위에 장부가 있고 모든 참여자의 장부에 트랜잭션과 데이터를 동시에 기록합니다. 장부는 모든 참여자가 동일한 사실을 저장하기에 분산되어 있다고 할 수 있습니다. 각 블록은 이전 블록의 서명과 연결되어 변조 방지가 되기 때문에 변조 불가능(immutable) 합니다.
탈중개 프로토콜 - 탈중앙화 시스템의 참여자들은 상호 간에 연결하고 통신하고 거래하기 위해 동일한 블록체인 프로토콜(모두가 따라야 할 규칙의 집합) 을 사용합니다. 예를 들어서 이더리움과 하이퍼레저는 서로 다른 두 개의 블록체인 프로토콜이라고 할 수 있겠네요.
신뢰 확립자 - 탈중앙화 참여자 시스템은 중앙화된 정부 기관이나 은행과 같은 중개자들이 없기 때문에 중개자 없이도 거버넌스(Governance), 검사, 준수(Compliance) 등에 대한 규칙을 구현하여 거의 자동으로 처리하는 인프라가 필요합니다. 블록체인 소프트웨어는 신뢰 확립자의 역할을 맡게 됩니다.
이제 위에 언급한 네 가지 개념을 더 자세히 알아보도록 하겠습니다.
1. 블록체인 인프라
블록체인 인프라는 도시를 연결하는 철로나 도로처럼 내재적으로 탈중앙화가 이루어져 있습니다. Dapp을 배포한다는 것은 마치 철로나 도로 위에 기차나 자동차를 배치하는 것과 비슷합니다. 그럼 철로에 기차가 놓여져 있는 것을 생각하면서 인프라에 대해서 더욱 알아볼까요?
인프라에 대해서 바로 알아보기에 앞서 말한 탈중앙화 시스템은 무엇일까요? 탈중앙화 시스템이란 분산 시스템의 일종으로 아래와 같은 일이 일어납니다.
참여자들은 P2P로 소통합니다.
참여자들은 디지털이든 아니든 자신의 자산(오디오 파일, 디지털 건강 기록, 또는 토지 등)을 통제합니다.
참여자들은 자신의 의사에 따라 참여하거나 떠날 수 있습니다.
참여자들은 통상의 신뢰 경계(대학이나 나라 등)를 넘어서서 행위를 할 수 있습니다.
결정은 중앙화 기관이 아니라 분산된 참여자들이 내립니다.
블록체인과 같은 자동화된 소프트웨어가 상호 간 중개를 담당합니다.
이러한 탈중앙화 시스템이 필요로 하는 조건을 충족시켜주는 블록체인의 아키텍처적인 요소들도 살펴볼까요?
블록체인 노드, 네트워크, 애플리케이션
항공 교통을 예로 들어보겠습니다. 모든 비행기는 출발지랑 도착지를 가지고 있고, 경유 공항과 경로가 항공 네트워크를 구성하고 있습니다. 이처럼 블록체인 노드는 트랜잭션의 엔드포인트로서 작동에 필요한 컴퓨팅 환경을 호스팅하고, 트랜잭션을 릴레이하며, 브로드캐스팅하는 기능을 수행합니다.
위 그림을 통해 아래에서 위로 올라가면서 단일 블록체인 노드를 구성을 알아봅시다!
Computer systems hardware/Network and operating system : 이 두 레벨은 컴퓨팅 시스템이 가진 표준적인 하드웨어랑 소프트웨어를 의미합니다.
Blockchain protocol implementation : 블록체인 프로토콜 레이어로 블록체인 컴포넌트들을 포함하고 있습니다.
Smart contract on virtual machine : 이 레이어에서는 Application의 로직을 호스팅합니다. 여기에서는 데이터 액세스 컨트롤, 확인, 검증 및 저장을 위한 함수 코딩과 같은 문재들을 해결합니다.
Decentralized application : 이 부분은 사용자를 마주하는 인터페이스로 이 부분에서는 웹 프로그래밍이 이루어집니다.
추가적으로, 해당 레이어는 아래와 같이 다른 레이어 구조로도 나타낼 수 있습니다.
이러한 블록체인 애플리케이션은 일반적으로 많은 수의 참여자를 노드 네트워크를 통해서 연결하고 각 노드는 이를 이용하는 서로 다른 사용자들을 식별할 수 있는 다수의 어카운트를 지원합니다. 이 때, 하나의 노드는 다수의 Dapp을 호스팅할 수 있습니다. 즉 예를 들어서, 탈중앙화 공급망 관리 시스템 Dapp과 탈중앙화 지급 시스템 Dapp을 동시에 호스팅할 수 있겠네요!
다음 그림은 이러한 노드 3개를 네트워크로 연결한 노드 네트워크입니다. 이 네트워크에서는 다음과 같은 것을 브로드캐스팅 할 수 있겠네요.
사용자가 기동한 트랜잭션
트랜잭션들로 이루어진 블록
이러한 트랜잭션과 블록은 네트워크의 페이로드를 구성하며, 최종적으로 확인과 검증을 거쳐 분산된 장부에 기록됩니다.
스마트 컨트랙트
스마트 컨트랙트는 블록체인 노드가 호스팅하는 가상머신과 같은 샌드박스 환경에서 실행됩니다. 이런 스마트 컨트랙트의 구문은 객체지향 언어의 클래스와 매우 유사하며, 데이터, 함수, 함수를 실행하기 위한 규칙들을 갖고 있습니다. 이러한 스마트 컨트랙트 함수를 호출하거나 실행하면 아래 그림과 같이 블록체인에 기록할 트랜잭션을 생성합니다. 물론, 함수 호출이 확인과 검증 규칙에 위배되면, 함수 호출을 취소합니다.
2. 분산 장부 기술
1. 블록체인 인프라에서 알아본 이러한 인프라가 지원하는 핵심적인 블록체인 기술은 분산 장부 기술(DLT)입니다. 저희가 알아볼 것은 다음과 같습니다.
블록체인 DLT를 구성하는 요소
트랜잭션을 저장하는 블록을 위한 DLT의 물리적 구조
애플리케이션이 어떻게 의도한 목적(신뢰 구축을 위한 확인, 검증 및 변조 불가능한 저장)을 위해 DLT를 사용하는지에 대한 상세한 작동 과정
DLT의 무결성을 위한 합의 알고리즘
트랜잭션, 블록, 블록의 체인
애플리케이션은 트랜잭션과 스마트 컨트랙트 코드 실행을 시작합니다. 즉, 우리가 애플리케이션에서 어카운트 간에 단순한 암호 화폐 송금을 하면 ‘send’라는 트랜잭션이 생성됩니다. 이는 블록체인 네트워크를 통해 트랜잭션을 브로드캐스팅한 후, 변조 불가능한 분산 장부에 기록합니다.
이러한 트랜잭션을 블록체인에 저장하는 과정은 아래와 같습니다.
수집한 네트워크의 트랜잭션들은 검증 단계를 거쳐 풀로 모입니다. 노드는 블록을 만들기 위해서 풀에서 트랜잭션들을 골라서 세트로 만들어집니다. 이 때, 트랜잭션들을 고르는 기준은 일반적으로 트랜잭션에 책정된 수수료로, 수수료가 비싼 트랜잭션부터 선택받습니다.
참여한 노드들은 합의 알고리즘을 사용해 기존 체인에 추가될 트랜잭션들을 포함하는 하나의 블록에 대해 집합적으로 합의를 합니다.
체인의 현재 리드 블록을 나타내는 값인 해시를 새롭게 추가될 블록에 더해서 체인 링크를 만듭니다.
트랜잭션이 모여서 블록이 된 뒤에 참여 노드들 간의 합의로 마지막 체인에 추가가 됩니다. 이 때, 새로 참여한 블록 n + 1의 해시에 이전 블록인 n에 저장되어 체인 링크를 만듭니다. 만약에 블록 n을 수정하면 해시 n값 또한 변하는데, 이것이 바로 변조 불가능성을 보장합니다.
위 설명에서 짐작을 하셨겠지만, 블록체인은 추가만 허용(Append-only)할 수 있습니다. 이 때문에 변조 불가능성을 보장하는 것이기도 했고요! 그러면 이러한 체인에도 첫 번째 블록이 있을텐데, 그 블록을 제네시스 블록(Genesis Block) 이라고 합니다. 그리고 블록체인에 참여하는 모든 노드는 제네시스 노드로부터 시작해서 모두 동일한 블록체인 복사본들 가지고 있습니다.
이 때문에 저희는 블록체인 DLT를 다음과 같은 특징으로 정리할 수 있습니다.
분산되어 있다. : 블록체인 프로토콜은 분산된 각각의 참여 노드들이 동일한 블록의 체인 복사본을 가지고 있다는 것을 보장해주기 때문입니다.
변조가 불가능하다. : 위에서 두 번이나 언급했듯이, 새로 생성되는 모든 블록은 현재 블록체인인 헤드의 해시값을 통해 기존 블록체인에 연결되어 있기 때문에 변조가 불가능합니다.
3. 탈중개 프로토콜
교통 인프라와 마찬가지로 블록체인 인프라도 따라야 할 규칙들을 가지고 있습니다. 도로에 있는 자동차를 운전하는 운전자들이 도로 규칙을 따르지 않으면 어마어마한 혼란이 일어나기 때문에 규칙을 지키는 것 처럼 프로토콜이나 규칙의 집합이 블록체인의 구조와 운영(Operation)을 관할합니다. 이러한 블록체인 프로토콜은 주요하게 다음과 같은 것을 규정합니다.
블록체인의 구조(트랜잭션, 블록, 블록의 체인)
암호화, 해싱, 상태 관리를 위한 기반 알고리즘과 표준
블록의 합의와 일관성 있는 체인을 구현하기 위한 방법
불일치하는 장부를 초래할 수 있는 예외들을 처리하는 테크닉
이러한 맥락(Context)에서 일관성, 정확성, 변조 불가능성을 유지하기 위한 블록체인의 코드와 규칙들의 실행 환경
이러한 프로토콜은 대표적으로 비트코인과 이더리움으로 나눌 수 있는데 각 코인의 스택은 다음과 같습니다.
4. 신뢰 확립자
모든 거래에서 신뢰는 매우 중요합니다. 만약에 저희가 엄청난 금액의 돈을 송금하려면 어떻게 신뢰를 확보할까요? 아마 거래 당사자들의 신용을 확보하기 위해서 은행과 같이 중개자가 필요할 겁니다. 근데 탈중앙화 시스템에는 신분을 확인하는 사람도 없고 은행이 없기 때문에 이를 해결하기 위한 소프트웨서 메커니즘이 필요합니다.
여기서 블록체인은 탈중앙화 인프라, 분산 장부 기술, 탈중개 프로토콜인 3D를 충족하여 시스템에 신뢰를 구축합니다.
실제로 인터넷과 블록체인 기반 신뢰는 IETF의 RFC를 통해서도 확인할 수 있습니다.
결론
오늘은 이렇게 블록체인의 주요한 4가지 개념을 알아보았습니다. 코딩을 하는 것이 아니라 CS적인 내용이라 약간 머리가 띵하긴 했지만 그래도 블록체인 자체를 제대로 이해할 수 있었던 시간입니다.
다음 글에서는 스마트 컨트랙트를 이해하고 사용해보겠습니다!