그라운드엑스 (Ground X)가 만든 클레이튼(Klaytn) 수업입니다
안녕하세요 Skkrypto 5기 여정민입니다. 평소에 Klaytn에 관심이 많았는데 한양대학교 일반대학원(석사과정) 블록체인 융합학과에서 한학기 동안 진행한 Klaytn 수업이 있더라구요. 그래서 이 수업에 대한 내용을 여러분에게 공유하고자 글을 썼습니다! 이 글을 통해서 카카오 블록체인 자회사 그라운드엑스(Ground X)가 개발한 클레이튼(Klaytn), 'Blockchain Application' 개발, 블록체인 SDK 등의 사용법을 학습하실 수 있습니다.
간단히 얘기하면 정보를 블록 단위로 저장하는 저장기술을 말합니다. 그 블록들이 연결되어 있고 이것이 체인형태로 연결되어 있어서 블록체인이라고 합니다 자료구조인 Linked-List와 유사하다고 생각하시면 됩니다 Linked-List의경우 자기 앞에 있는 노드를 기억하는 것처럼 블록체인도 같은 방식으로 구현되어 있지만 기억하는 방법은 해시함수를 통해 기억합니다.
해시함수는 데이터의 길이가 어떠하든 간에 고정된 길이의 데이터로 변환해주는 함수를 말합니다. 해시함수의 특징을 살펴보면 하나의 데이터에서 오직 단 하나의 해시만 도출됩니다.
임의의 데이터 X와 Y가 있을떄
A. IF X == Y THEN Hash Function(X) == Hash Function(Y)
X와 Y가 같다면 해시 값이 같아야 합니다
B. IF X! = Y THEN Hash Function(X)! = Hash Function(Y)
X와 Y가 같지 않다면 해시 값은 다릅니다
C. IF Hash Function(X) == Hash Function(Y) THEN X == Y
해시 값이 같다면 X와 Y가 같습니다
해시함수의 특징을 좀 더 살펴보면 같은 해시 함수(SHA-256)으로 조금만 다른 데이터를 해시할 경우 결과값이 크게 다른 것을 확인할 수 있습니다
A. 문자열 ‘hello!’를 SHA-256으로 해시한 결과는 다음과 같다.
CE06092FB948D9FFAC7D1A376E404B26B7575BCC11EE05A4615FEF4FEC3A308B
B. 문자열 ‘hello?’를 SHA-256으로 해시한 결과는 다음과 같다.
B45CF64669F2F8DA6C6CC2DB0329EC1A37D067B9AB7640C029CFD44EB4BF928A
그럼 이제 이 해시 함수를 통해서 블록과 블록을 어떻게 연결할까요? 해시를 사용해 데이터를 포인팅 했다고 해서 해시 포인터를 사용합니다 좀 더 자세히 얘기하면 뒤의 블록은 앞의 블록의 해시를 기억합니다 블록에는 많은 데이터가 들어있고 이 데이터가 조금만 바뀌어도 해시 값은 달라집니다 그러므로 어떤 블록을 기억하는지 결정적으로 알 수 있습니다 그리고 블록마다 Sequence가 있기 때문에 우연히 동일한 블록이 존재한다고 해도 블록 포인터가 잘 못 가리키는 일은 없습니다.
블록은 Header와 Body로 구성되어 있습니다 Body가 정보의 묶음이라면 Header는 이 Body를 설명하는 역할을 합니다 그리고 이 Header에 앞의 블록을 기억하는 해시가 저장되어 있습니다
실제로 불록체인을 표현할 때 높이가 있는 이런 모양으로 표현합니다. 블록체인에서 블록은 블록 생성시간이라는 주기를 가지고 블록을 만듭니다 그리고 이런 최근의 블록이 위로 오도록 정렬되며 블록이 생성될 수록 높이가 늘어납니다 이 쌓아진 순서가 블록의 높이라 부르며 첫번쨰 블록을 편의상 블록의 높이를 0이라고 합니다
블록 생성 시간에 대해서 알아보면 비트코인의 블록생성 시간은 10분 이더리움의 블록 생성시간은 15초 ~ 5분 클레이튼의 블록 생성 시간은 1초입니다 이 블록 생성 시간은 중요한데 비유적으로 마트에서 물건을 사는데 10분걸린다고 생각해보면 됩니다 엄청 불편하겠죠? 클레이튼의 블록 생성 시간을 짧은 이유는 서비스 지향적이기 때문입니다
블록체인은 기본적으로 서버 클라이언트 아키텍처가 아니라 P2P 네트워크입니다 블록체인에서는 서로 같은 데이터를 가지고 있고 서로 간의 연산력이 있어서 데이터(블록)를 주고받을 수 있습니다. 정리하자면 블록체인은 한 명 이상의 참여자가 있는 네트워크에서 관리하며 누구 한 명이 없어져도 나머지 참여하는 노드들이 정보를 가지고 있어서 현재 블록체인의 정보를 볼 수 있습니다
블록체인에서 합의가 필요한 이유는 중앙화 된 기관이 없기 때문에 누군가 신뢰할 대상이 없습니다 그래서 서로가 모든 데이터를 가지고 있고 누군가 어떠한 행동을 하려고 할 때 그게 맞는지 안 맞는지 판단할 수 있어야 합니다 그리고 모두가 동의하면 블록에 포함되고 블록체인에 추가될 수 있습니다. 대표적인 합의 알고리즘은 POW(Proof of Work)가 있습니다. 쉽게 말하면 어려운 퍼즐을 푸는데 퍼즐을 푼 사람이 블록을 제안할 수 있습니다. 이렇게 하지 않으면 누구나 블록을 제안하려고 하겠죠? 블록을 제안할 권리를 가지기 위해서 퍼즐을 푼다고 생각하시면 됩니다 누구든지 블록을 제안할 수 있기 때문에 블록체인의 탈중앙성의 특성을 가진 합의 알고리즘입니다. 정리하자면 네트워크 참여자 모두가 같은 데이터를 가지고 있기 때문에 다음 블록에 대해서 누가 제안을 할 때 누구나 검증을 할 수 있습니다 그리고 블록이 체인에 추가되기 위해서는 합의가 필요하며 블록을 제안하는 사람은 자격을 가지고 있어야 합니다. 이런 자격을 정하는 알고리즘은 합의 알고리즘마다 다를 수 있습니다.
합의에 따라서 블록체인의 성격이 달라집니다. 블록체인에 블록을 제안하기 위해서는 자격을 얻어야 합니다 이 자격을 얻기 위해서 POW는 어려운 퍼즐을 푼다고 했습니다. 좀 더 자세하게 말하면 지금의 블록을 가지고 해시를 만듭니다. 같은 값을 가지고 해시를 하면 항상 같은 값이 나오므로 Nonce를 붙여서 해시를 합니다. 그러면 새로운 값이 나오고 POW는 이 값을 찾으면 블록을 제안할 권리를 얻습니다. 여기서 Nonce를 붙이는 이유는 새로운 해시 값을 위한 garbage 값입니다. 다른 합의 알고리즘 중 하나인 POS(Proof of Stake)는 내가 이 블록체인에 얼마나 기여를 하고 있는지를 기준으로 블록 제안할 권리를 얻을 수 있습니다. 즉 블록체인의 토큰이 많은 사람이 다음 블록을 제안할 확률이 높습니다. 이런 POS같은 경우는 자본이 많을수록 중앙화 될 수 있다는 단점이 있기 때문에 POW와 같이 사용하는 경우가 많습니다. POW로 마이닝 경쟁을 하면서 토큰을 여러 사람에게 분배한 후 POS로 합의 알고리즘을 바꿔서 사용합니다. 요즘 많이 사용되는 합의 알고리즘은 BFT(Byzantine Fault Tolerance)입니다. BFT 같은 경우는 네트워크가 동기화 되어 있어서 누가 참여하고 있는지 알 수 있습니다. 만약 누군가 추가되면 기존의 노드들은 새로운 노드를 추가하는 동기화 과정이 있습니다. 또 BFT 같은 경우는 합의를 할 때 통신량이 대단히 많습니다. 그래서 합의에 참여하는 노드를 제한해서 속도를 올립니다.
블록체인은 크게 Public과 Private 두 종류가 있습니다. 둘의 차이는 누구든지 기록된 정보를 읽을 수 있는가의 여부, 명시적인 등록 또는 자격취득 없이 정보를 블록체인에 기록할 수 있는가의 여부 입니다 블록체인의 정보가 공개되어 있고 네트워크가 정한 기준에 따라 정보를 기록 요청할 수 있으면 그 블록체인은 퍼블릭/공개형이라 합니다. 이와 반대로 정보가 공개되어 있지 않고 미리 자격을 얻은 사용자만이 정보를 기록할 수 있다면 그 블록체인은 프라이빗/비공개형이라고 합니다
크게는 P2P 네트워크에 참여할 수 있는지 없는지, 좁게는 합의에 참여할 수 있는지 없는지를 말합니다. POW, POS같은 경우는 네트워크에 참여하면 합의에도 참여할 수 있습니다. BFT같은 경우에는 네트워크에는 참여할 수 있어도 합의에는 참여하지 못할 수 있습니다. 이 경우에는 Permissioned라고 합니다. 유형별로 블록체인을 비교하면 이렇게 됩니다.
블록체인은 해시와 암호화를 통해 만들어진 것이라고 해도 크게 문제가 되지 않습니다.
먼저 용어를 살펴보면
A. 평문이라는 말은 암호화되어 있지 않은 문자열을 의미합니다.
B. 암호화는 평문을 암호로 만드는 것을 말합니다 (cipher, encrypt)
C. 복호화는 암호를 평문으로 만드는 것을 말합니다. (decipher, decrypt)
D. 대칭키 암호는 암호화에 사용한 키와 복호화에 사용한 키가 동일한 경우입니다
E. 비대칭키 암호는 암호화에 사용된 키와 복호화에 사용된 키가 다를 경우를 말합니다
블록체인에서는 첫번쨰로 비대칭키암호를 이용한 공개키 암호방식을 사용합니다 여기서 암호화에 사용되는 키를 공개키(Public Key, PK)라고 하고 복호화에 사용되는 키를 비밀키 라고 합니다. (Private Key/Secret Key, SK) 공개키 암호의 목적은 누구든지 암호화를 할 수 있지만 비밀키를 아는 사람만이 복호화 할 수 있도록 합니다 여기서 중요한 건 비밀키와 공개키는 한 쌍으로 비밀키를 만들면 공개키를 비밀키로 생성할 수 있습니다. 그래서 비밀키로부터 공개키를 찾아내는 건 쉽지만 공개키로부터 비밀키를 찾아내는 건 어렵습니다. 여기서 어렵다는 뜻은 최신의 컴퓨터로 풀 수 없다는 의미입니다.
공개키 암호는 누구든지 암호화할 수 있지만 나만 그걸 비밀키를 통해 복호화 할 수 있습니다. 이건 서로 통신할 때 유용합니다 예로 Alice와 Bob이 통신을 한다고 할 때 제 3자가 Alice가 Bob에게 보내는 메시지를 가로 챌 수 있지만 그 메시지를 읽을 수 없습니다. 왜냐하면 Alice는 Bob만 읽을 수 있도록 Bob의 공개키로 암호화하기 때문이죠. 그리고 Bob는 자신의 비밀키를 통해서 Alice가 보낸 메시지를 읽을 수 있습니다.
블록체인에서 쓰는 두번째 암호방식은 비대칭키 암호를 이용한 전자 서명방식이 있습니다. 이 방식을 통해서 Bob은 Alice한테 받은 메시지를 Alice에게 온 것인지 확인할 수 있습니다. 이 전자서명은 누가 메시지는 보냈는지 알기 위해서 사용합니다. 전자서명에서 메시지는 비밀키로 암호화되며 그 사람의 공개키를 통해서 이 사람이 메시지를 보낸 사람인지 검증할 수 있습니다 다시 말하면 비밀키는 그 사람만이 알고 있습니다 비밀키를 통해서 메시지에 서명한다면 그 사람이 보낸 메시지라고 생각할 수 있습니다.
공개키 암호화 전자서명을 같이 사용해서 이제 안전한 통신을 할 수 있습니다. Alice는 Bob만이 읽을 수 있도록 Bob의 공개키를 통해서 암호화하고 자신이 메시지를 보냈다는 걸 증명하기위해서 전자서명을 합니다. Bob은 이 메시지를 자신의 비밀키로 해독해서 나에게 보낸 메시지임을 확인할 수 있고 Alice의 공개키를 통해서 Alice가 보낸 메시지라는 걸 검증할 수 있습니다. 여기서 좀 더 들어가면 해시까지 사용합니다. 이 해시는 메시지가 변조되었는지를 확인하기 위해 사용합니다. 해시는 데이터가 바뀌면 해시 값도 비껴지는 특징이 있습니다.
다음 시간에는 Section2. 블록체인의 상태와 트랜잭션이라는 주제로 찾아오겠습니다.