brunch

매거진 개발실습

You can make anything
by writing

C.S.Lewis

by SKKRYPTO Jul 05. 2020

클레이튼(Klaytn) 스마트계약과 탈중앙앱 시리즈#2

그라운드엑스 (Ground X)가 만든 클레이튼(Klaytn) 수업입니다

안녕하세요 Skkrypto 5기 여정민입니다. 이 글을 통해서 카카오 블록체인 자회사 그라운드엑스(Ground X)가 개발한 클레이튼(Klaytn), 'Blockchain Application' 개발, 블록체인 SDK 등의 사용법을 학습하실 수 있습니다.


SECTION 2. 블록체인 상태와 트랜잭션


2-1      Klaytn 합의 알고리즘

Klaytn은 BFT 계열 합의 알고리즘을 사용합니다. BFT 합의 알고리즘은 정해진 네트워크안에서는 대단히 효율적이고 합의에 참여하는 노드가 적을수록 통신 량이 적어서 합의에 도달하는 속도가 빠릅니다. 효율성이 올라갈 수록 중앙화가 되는 특징이 있습니다. Klaytn에서는 POW를 사용하지 않는 이유는 성능 때문입니다. POS를 쓰지 않는 이유는 POS같은 경우는 자본만 있다면 과반을 점유하기가 쉬운 구조이기 때문입니다.


Klaytn의 경우는 BFT를 좀 다르게 사용합니다. 네트워크를 구성하는 전체 참여자를 기준으로 BFT를 사용하지 않고 전체 집합이 N개라면 S개의 부분 노드 집합을 확률적으로 선택합니다. 이 S개의 기준은 BFT 합의 알고리즘을 적용하는데 성능에 부담이 되지 않을 정도의 노드의 수를 무작위로 선택합니다. 이때 VRF(Verifiable Random Function)라는 함수를 적용해 무작위로 뽑고, 무작위로 뽑았다는 사실을 증명할 수 있습니다.


2-2     블록체인의 상태

블록체인인 상태 기계라고도 합니다. 어카운트 기반의 블록체인의 경우에는 트랜잭션으로 변화하는 상태 기계입니다. 상태 기계라는 건 초기값과 최종 값이 있습니다. 초기값에 변경들을 더해서 최종 값을 만들었다고 생각하시면 됩니다. 그림을 보면 처음 블록 none의 상태에서 변경사항을 더해 최종 상태인 f: [‘Alice’: 100 ]가 되고 이게 다음 블록의 초기 상태가 됩니다. 그리고 이런 변경사항들을 트랜잭션이라고 합니다.


2-3     트랜잭션(Transaction)

먼저 Account는 두종류가 있습니다. 

A.           External Account: 사용자(end user)가 사용하는 Account (a.k.a EOA)

B.             Contract Account: 스마트 컨트랙트를 표현하는 Account


Ethereum 블록체인의 경우는 EOA와 스마트 컨트랙트의 상태를 기록 및 유지합니다. 스마트 컨트랙트는 특정 주소에 존재하는 실행 가능한 프로그램을 말합니다. 프로그램은 코드와 데이터로 이루어져 있습니다. External Account와 Contract Account의 가장 큰 차이는 트랜잭션을 실제로 만들고 불러오는 건 External Account만 할 수 있습니다. 스마트 컨트랙트는 항상 누군가가 실행해줘야 하고 실행된 결과를 돌려줘야 하기 때문에 스스로 트랜잭션을 만들 수 없습니다.


트랜잭션의 목적은 블록체인의 상태를 변경하는 것입니다. 트랜잭션의 구조에는 보내는 사람과 받는 사람이 지정되어 있는데 받는 사람이 누구냐에 따라서 트랜잭션의 목적이 달라집니다. 받는 사람이 External Account의 경우에는 토큰을 전송하거나, 이더를 전송하는 일을 합니다 Contract Account의 경우에는 스마트 컨트랙트를 실행하는 경우입니다. 받는 사람이 지정되지 않는 경우에는 컨트랙트를 처음 배포하는 경우입니다. 그리고 트랜잭션을 처리하기에는 일련의 비용이 있습니다. 항상 트랜잭션을 수신하기 위해서 네트워크가 열려 있어야 하며 트랜잭션을 수신하고 블록에 저장하기까지 연산비용이 발생합니다 그리고 연산후에 블록에 저장하는 데는 저장비용이 발생합니다. 이런 비용은 트랜잭션을 보내는 Sender가 부담하도록 되어있습니다. 이걸 Gas라고 합니다. 


2-4     트랜잭션(Transaction) 구조

일반적인 트랜잭션은 이런 구조를 가지고 있습니다 nonce를 가지고 있다는 건 Account 기반의 블록체인이라는 뜻이고 이중지불 문제를 위해서 nonce라는게 생겼습니다. from은 Sender의 주소, to는 Receiver의 주소입니다 value는 전송하는 토큰의 개수입니다.

이더리움의 트랜잭션은 이런 구조를 가지고 있습니다. 여기에 있는 Gas는 내가 몇개까지 Gas를 쓰겠다 라는 의미이고 GasPrice는 각 한개의 Gas마다 얼마의 가치로 측정하겠다 라는 의미입니다 그래서 이 Gas와 GasPrice를 곱한 값이 트랜잭션의 실제 수수료로 지불하는 값입니다. 아래의 V, R, S가 서명을 말합니다. V는 식별자의 역할을 하고 실제 서명을 이루는 값은 R과 S입니다.


Klaytn의 트랜잭션은 이런 구조를 가지고 있습니다. 여기서 type은 트랜잭션의 타입을 말합니다. 이더리움 같은 경우는 이런 타입이 없고 to를 보고 판단합니다. to가 External Account인지 Contract Account인지, 아니면 비어 있는지를 확인하는 걸 통해서 트랜잭션의 타입을 알 수 있습니다. Klaytn은 보다 명시적으로 Type을 지정해서 트랜잭션 전처리 연산비용을 줄여서 성능을 높였습니다. 그리고 Klaytn의 경우 GasPrice의 값은 고정적입니다. 즉 사용자가 변경할 수 없습니다.



2-5     트랜잭션(Transaction) 이동

트랜잭션은 External Account만 만들고 보낼 수 있습니다. 트랜잭션을 받은 노드는 이 트랜잭션을 블록에 넣는 순간 User에게 영수증을 줍니다. 이 영수증은 트랜잭션이 실행된 결과를 알려주는 값입니다. 이 영수증을 받았다 라는 사실은 내가 보낸 트랜잭션이 블록에 들어갔다 라는 사실을 의미합니다. 그리고 Contract를 배포할 때 Contract의 Address를 이 영수증을 통해서 확인할 수 있습니다. 여기서 중요한 사실은 사용자와 트랜잭션을 전달받을 노드는 같은 프로토콜을 사용해야 합니다. 이더리움 트랜잭션 구조를 가지고 Klaytn 블록체인에 트랜잭션을 보내면 안됩니다.


매거진의 이전글 [백서 읽어주는 남자] - 리플
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari