본문 바로가기
개발 이야기/Blockchain

Hyperledger Study (1) - Intro.

by _ppuing 2020. 12. 10.
반응형

비트코인, 이더리움이 한창 유행하고 있을 때 리눅스 파운데이션에서 Hyperledger 오픈소스 프로젝트를 시작했다.

인텔, IBM등 전 세계 IT 업계의 큰 손들도 이 프로젝트에 전념하고 있는데, Hyperledger 프로젝트의 목표는 블록체인 기술을 각종 분야(농업, 건강, 의료, 무역 등)에 널리 활용하는 것이다. 

오픈소스 프로젝트이니만큼 아래 그림처럼 프레임워크도 가지각색인데, 가장 널리 이용되는 프레임워크는 Fabric(패브릭) 으로, Hyperledger의 기본적인 기능들을 포함하기 때문에 가장 제너럴하게 활용할 수 있는 장점이 있다. 

 

Hyperledger 생태계

Hyperledger 는 일반적으로 알고 있는 암호화폐가 기반이 되는 퍼블릭 블록체인과는 엄연히 다른데, 가장 큰 특징으로는 암호화폐를 사용하지 않는다. (억지로 사용하게 프로토콜을 구현하면 사용할 수 있다.)

대부분의 사람들이 암호화폐 == 블록체인이라고 잘못 아는 경우가 많은데, 블록체인은 단순히 "해시" 값들의 연결 형태이며, 그 연결의 원리에 따라 퍼블릭 블록체인, 프라이빗 블록체인으로 나뉜다. 

 

해시(Hash), 해시함수 그리고 블록체인

해시(값)는 해시함수를 통해 얻어지는 값이다. 해시함수는 MD5, SHA1 등 각종 기법을 통해 만들어진 함수로, 기본적으로 "비가역적" 특성을 가진다. (비밀번호 암호화 하는 것과 같은 원리) 또한 원문의 길이에 상관 없이(1GB가 넘는 문자열 혹은 파일이라도), 해시값의 길이는 항상 일정하게 유지되므로 파일의 압축저장이 용이하게 만드는 장점도 있다. 여기서 비가역적이라는 뜻은 절대로 암호화된 해시값으로부터 원문을 추적할 수 없다는 것을 의미하지는 않는다. (양자 컴퓨팅이 보급화되면 슈퍼컴퓨터보다도 성능이 좋아져서 원문을 추적해내는 게 가능할 것) 일반적으로 해시값의 역추적을 하는 기댓값은 상당한 컴퓨팅 비용이 들기 때문에, 해커들이 해킹시도를 하는 것 조차도 손해라서 일반적으로 매우 안전한 값으로 쓰인다.

또한 원문의 문자열 중 점(.) 하나만 추가되더라도 해시 결과 값은 천차만별로 변하기 때문에 백신 등과 같은 보안 프로그램에서 파일의 손상을 측정하는 데에 이용되기도 한다. 해시가 주로 사용되는 또 다른 예로는 해시테이블인데, 고정적인 길이의 해시값으로 매우 큰 파일, 데이터의 "키" 역할을 할 수 있기 때문에, 바로 데이터에 접근하기 전에 해시값(키)으로 먼저 조회하면 O(n)의 시간만에 데이터를 가져올 수 있다.

블록체인 개념도

위에 언급했듯 블록체인의 각 블록은 해시값을 갖고 있다. 기본적으로 블록체인의 한 블록은 1) 이전 블록의 해시값, 2) Nonce, 3) 데이터, 4) 블록넘버, 5) 현재 블록의 해시값 으로 이루어져 있다.

5) 현재 블록의 해시값 부터 먼저 살펴보면 현재 블록의 해시값은 1), 2), 3), 4)를 이어붙인 문자열(Concat)을 해시함수를 돌려 얻은 값이다. 그런데 그냥 구하면 너무 쉽기 때문에, 해시값의 형태는 n개의 0으로 시작하는 문자열이 되어야만 한다. (ex. 00000000akewifo2314klfejop23jr....). 여기서 2) Nonce를 0부터 1씩 증가시키면서 n개의 0으로 시작하는 해시값을 만들어야 한다. 이 과정을 채굴(Mining) 혹은 증명(Proof)이라고 한다. 즉, 블록체인은 다음 블록을 검증하는 것의 난이도를 미리 설정해두고, 그 블록을 검증하는 데 이용한 컴퓨팅 비용을 보상하기 위해 이에 상응하는 수수료(코인)를 지급하는 방식으로 운영된다. 3) 데이터 부분은 코인에 따라 다른데, 가장 쉽게 생각하면 A 에게서 B 로 300 토큰을 지급함. 같은 내용이 들어간다. 

4) 블록넘버는 이전 블록 + 1 이라고 보면 된다. 1) 이전블록의 해시값은 말 그대로 이전 블록 넘버에 해당하는 현재 블록 해시값이다. 따라서 악의적인 사용자가 말도 안되는 블록을 만들어도 이전 블록의 해시들도 모두 부정할 수 있을 만큼 과거의 블록 해시값까지 잘못되었었다는 것을 역으로 증명해내야 하기 때문에, 블록이 길어질면 길어질수록 블록체인 생태계를 무너뜨리기는 어려워진다(난이도가 계속 올라가기 때문). 따라서 일반적으로 한 블록체인을 마음대로 조작하고 점유하기 위해서는 전 세계의 컴퓨팅 파워의 51%에 해당하는 파워를 가져야 하는데, 이는 사실상 불가능하므로 블록체인 네트워크가 아주 강력하다는 합의가 생긴다. 

 

Public Block chain vs Private Block chain .. and Hyperledger ?

위에서 언급했듯 블록체인이 공개적으로 오픈되어 있기 위해서는 블록체인 생태계를 안전하게 지킬 수 있는 노드(Node) 역할을 하는 여러 컴퓨터들이 필요하다. 또한 각 노드가 본인들의 비용을 써서 생태계를 유지하고 블록을 검증하기 때문에, 코인이라는 보상은 필수적인 요소이다. 하지만 퍼블릭 블록체인은 어디서나, 누구나 어떤 트랜잭션이라도 들여다 볼 수 있기 때문에 데이터의 보안성 측면에서는 좋지 못하다. 단순히 화폐 이상의 가치를 지니기는 어렵다는 단점을 갖고 있는 것이다.

여기서 프라이빗 블록체인 (혹은 비지니스 블록체인)이 대두되는데, 프라이빗 블록체인은 화폐의 용도보다는 블록체인이 갖고 있는 계속 쌓여나가는 데이터의 무결성 측면에 집중한다고 볼 수 있다. 한 번 블록체인에 올라오게 되면 데이터를 변경할 수 없으니, 어느 분야에건 응용이 가능한 좋은 기술임에 분명하다. 또한 각 분야에서만 사용할 용도라면, 애초에 그 네트워크의 참여자는 허용된 참여자만이 노드가 될 수 있을 것이다. 따라서 공개되지 않은 블록체인이며, 허용된 참여자는 이미 "신뢰"를 바탕으로 조인한 노드이기 때문에 굳이 "채굴" 같은 난이도 높고 느린 검증방식을 채용할 필요가 없다. (n개의 0 중 n을 1~2로만 설정해도 충분할 정도) 따라서 퍼블릭 블록체인이 기본적으로 트랜잭션 처리 속도가 느린 반면에, 프라이빗 블록체인은 비교적 실시간 처리가 가능하다(PoS, PoW 등의 불필요한 검증 패스). 이미 허용된 노드만 받았고, 여기서 CA(Certificated Authority) 검증방식만 채용해도 충분하기 때문이다. 

Hyperledger는 이러한 프라이빗 블록체인의 기본 개념을 가져가므로 어느정도의 분산화(허용된 노드끼리의 분산화)가 보장되고, 거래정보의 보안에 좀 더 신경을 쓸 수 있게 할 수 있다. Hyperledger 에서는 "채널"이라는 개념이 존재하고, 한 시스템에 여러 채널을 둘 수 있다. 채널에 들어갈 수 있는 노드 혹은 참여자는 정해져 있으며, 정보를 볼 수 있는 권한도 정책에 따라 자유롭게 정할 수 있다. 예컨대 병원 의료기록 블록체인이 있다고 할 때, 의사들은 업로드만 가능하고 마음대로 볼 수 없으며, 실제 환자가 권한 허용을 해야만 들여다볼 수 있게 하는 것이 가능하다. 

Hyperledger Composer에는 기본적으로 3가지 요소가 있는데, asset(자산), participant (참여자), transaction(거래) 가 그것이다. 쉽게 말하면 참여자가 자산을 거래하는 과정을 응용하여 어느 분야에건 개발할 수 있다. 아래는 이 세 요소를 정의한 스터디 코드이다. 

 

Hyperledger Composer

asset = 잔고, participant = 거래 계좌, transaction = 거래 이다. → 표시는 Foreign Key와 같은 효과를 지닌다. (잔고의 주인은 거래, 거래에는 잔고, 계좌, 거래 id, 상태, 거래금액이 들어감)

즉, 이런 식으로 내 마음대로 asset, participant, transaction의 모양을 정할 수 있고, 아래 코드처럼 실제 transaction이 발생하면 어떤 처리를 하면 되는지 구현할 수 있다. (이더리움의 스마트컨트랙트와 같은 원리이며 체인코드라고 부른다.)

Hyperledger Composer: Transaction 정의

위 코드의 의미는 payment가 일어나면 sender의 잔고를 차감하고, receiver의 잔고를 올려준다. 그런 다음 각각의 잔고에 업데이트 처리를 해주며, 상태를 ACCEPTED로 변경해준다.

실제 트랜잭션은 이 네트워크에 REST API를 호출하면 되는데, 테스트 UI상에서 아래 그림처럼 요청한다. 

Hyperledger Composer: Transaction 생성하기

그림을 보면 Transaction Type이 있는데, 위 체인코드를 복수개로 만들어서 여러 유형의 거래를 만들 수 있다. (환불이라던지.. 상태 변경이라던지..)

해당 거래를 submit 하면 실제 블록체인에 정보가 올라가며, 아래 그림처럼 리스트처럼 쌓인다.

 

Hyperledger Composer: Transactions

여러 유형의 거래가 가능하다고 했는데, Entry Type을 보면 실제로 participant를 추가한 것도 블록체인에 저장된다. 즉, 기본적으로 모든 액션은 블록체인에 저장되며, 그 액션의 종류를 결정하는 것은 스마트컨트랙트(체인코드) 라고 볼 수 있다.

반응형

댓글