Technology

An Overview of Klaytn Architecture

안녕하세요, 이번 포스팅에서는 클레이튼의 전체적인 아키텍처에 대해서 말씀드리고자 합니다.

클레이튼은 2018년 6월 이더리움 코드를 포크하여 시작된 프로젝트입니다. 2019년 6월 메인넷 런칭 이후부터 계속 오픈소스로 관리되고 있으며 Github에서 확인하실 수 있습니다. 클레이튼의 개발과정은 모두 해당 Github에서 진행되고 있으니 개발 진행상황이 궁금하시다면 찾아 와주세요😀 코드 기여(contribution) 또한 언제나 환영합니다.

먼저 클레이튼 아키텍처에 대한 전체적인 그림을 아래에서 확인하실 수 있습니다.

클레이튼 블록체인 개발자들을 위한 희소식이 있습니다. 퍼블릭 엔드포인트 노드가 추가되었습니다!

퍼블릭 엔드포인트 노드는 개발자들이 직접 노드를 배포하고 운영하는 수고를 덜어주기 위한 목적으로 제공됩니다. 클레이튼은 커뮤니티의 요청에 따라 개발자 경험과 편리함을 위해 노드 제공자들을 확대하고자 노력해왔습니다. 그리고 최근 Fantrie의 노드가 추가되면서 여러분의 dApp이나 블록체인 프로젝트를 시험해볼 수 있는 퍼블릭 노드의 선택지가 넓어졌을 뿐 아니라, 트래픽 문제 가능성도 완화되었습니다.

클레이튼 팀은 생태계의 지속적 개선을 위해 노드 서비스를 계속해서 확대하기 위한 작업을 진행 중입니다. 앞으로도 많은 관심 부탁드립니다.

퍼블릭 노드 목록은 아래 링크에서 확인해주세요:https://public-en.klaytn.foundation

그럼 각 레이어별로 어떤 역할들을 하고 있는지 설명하겠습니다.

응용(Application) Layer

응용 레이어는 클레이튼 위에서 동작하는 모듈을 포함하고 있습니다. 이 레이어는 실제 블록체인 코어와는 관계가 없습니다. 현재 여기에는 contacts 모듈만 포함이 되어있으며, 이 모듈 안에는 테스트, 서비스체인, precompiled contract example 등 다양한 용도의 스마트 컨트랙트 코드가 포함되어 있습니다. 클레이튼에서 제공하는 표준 스마트 컨트랙트를 확인하시려면 klaytn-contracts를 참고 부탁드립니다.

지갑(Wallet) Layer

지갑 레이어는 노드에서 사용하는 지갑과 관련된 모듈을 포함하고 있습니다. 이 지갑 기능은 노드에서 개인 키를 관리하여 트랜잭션을 서명하는데 사용할 수 있습니다. 이 기능은 개인이 노드를 운영하는 경우에 유용합니다. 공용으로 사용되는 노드에는 이 지갑 기능을 사용하실 경우 해킹의 위험이 있으니 주의하시기 바랍니다. 클레이튼의 경우, 한 계정에 서로 다른 여러 개의 개인키를 소유할 수 있습니다. 이 기능을 지원하기 위해 키 관리 부분과 트랜잭션 서명 부분이 변경되었습니다. 클레이튼에 새로 추가된 keystore v4에 대한 자세한 내용은 KIP에서 확인하실 수 있습니다.

인터페이스(Interface) Layer

인터페이스 레이어는 노드를 실행시키거나 API를 동작시키는 기능과 관련된 모듈들을 포함하고 있습니다.

  • console 모듈은 노드에 연결하여 콘솔 모드로 JSON-RPC API를 실행할 수 있는 기능을 포함하고 있습니다.
  • api 모듈에서는 JSON-RPC API를 통해 블록체인 데이터를 조회하거나 트랜잭션을 실행할 수 있는 기능을 제공합니다.
  • client 모듈에서는 JSON-RPC API를 사용하기 위한 go 클라이언트를 제공합니다.
  • node 모듈은 cn과 sc 두 개의 모듈로 구분되어 있고, cn 모듈은 메인 체인을 동작시키기 위한 기능이 포함되어 있습니다.
  • sc 모듈은 서비스체인을 구동하기 위한 기능이 포함되어 있습니다.
  • cmd 모듈은 클레이튼에서 제공하는 다양한 실행파일들(abigen, homi, kbn, kcn, ken, kgen, kpn, kscn, ksen, kspn)을 포함하고 있습니다.
  • params 모듈은 computation cost, gas cost, 거버넌스 파라미터, KLAY 단위(peb, ston, KLAY, MKLAY 등), 체인 파라미터 등 다양한 구성 파라미터를 가지고 있습니다.

실행(Execution) Layer

실행 레이어는 블록체인의 핵심 실행 기능들이 구현되어 있습니다.

blockchain/types 모듈에는 계정, 트랜잭션, 블록, 영수증(receipt) 등의 자료구조가 저장되어 있습니다. 클레이튼에서는 성능 개선과 확장성을 위해 새로운 계정과 트랜잭션 모델을 설계하여 구현하였습니다. 보다 자세한 정보는 Klaytn Docs를 참고하시기 바랍니다.

  • blockchain/vm 모듈에는 EVM이 구현되어 있습니다. 클레이튼에서는 블록 생성시간 1초를 유지하기 위해 computation cost 개념을 도입하여, 트랜잭션 하나의 실행시간이 너무 길지 않게 제한하였습니다. 또한 EVM에서 변경된 계정/트랜잭션 모델을 지원하기 위해 precompiled contract를 추가적으로 구현하였습니다.
  • 추가된 precompiled contract는 Klaytn Docs에서 확인하실 수 있습니다.
  • blockchain/state 모듈에서는 트랜잭션 실행을 위해 메모리에서 state trie를 효과적으로 유지하고 탐색하기 위한 기능들이 구현되어 있습니다.
  • work 모듈에서는 트랜잭션 풀에서 트랜잭션을 선별하여 블록을 생성하기 위한 기능들이 구현되어 있습니다.
  • blockchain 모듈에서는 트랜잭션 풀과 블록 검증, 그리고 최신의 블록체인 데이터를 유지하기 위한 동작들이 구현되어 있습니다.
  • event 모듈에서는 이벤트를 실시간으로 구독하기 위한 기능들이 구현되어 있습니다.

거버넌스(Governance) Layer

거버넌스 레이어는 클레이튼에서 새롭게 구현한 여러가지 거버넌스 기능이 구현되어 있습니다.

  • governance 모듈에서는 블록 검증자(validator)를 추가/제거, 가스비(gas price) 변경, 리워드 분배 비율 변경 등의 기능이 구현되어 있습니다.
  • reward 모듈에서는 클레이튼의 리워드 시스템이 구현되어 있습니다. 단순히 블록 생성자가 블록의 전체 리워드를 가져가는게 아니고 거버넌스에 설정된 비율에 의하여 일부는 블록 생성자에게, 나머지는 클레이튼의 생태계 확장을 위해 나누어 분배됩니다. 더 자세한 정보는 Funding Structure를 참고해주세요.

합의(Consensus) Layer

합의 레이어에서는 PoW, Clique, istanbul 세 가지의 알고리즘을 제공하고 있으며, 클레이튼에서는 istanbul BFT 알고리즘을 사용하고 있습니다. 앞의 두 합의 알고리즘은 이더리움에서 가져온 코드를 그대로 사용하고 있으며, 클레이튼에서는 추가로 활발하게 개발하고 있지는 않습니다.

암호(Cryptography) Layer

암호 레이어에서는 암호에 대한 여러 모듈을 포함하고 있습니다. 암호 체계는 블록체인의 근간이 되는 중요한 부분으로 클레이튼에서는 이미 검증된 안전한 암호 체계를 사용하고 있습니다.

동기화(Synchronization) Layer

동기화(synchronization) 레이어에서는 다른 노드와 동기화하기 위해 사용하는 fetcher, downloader 이외에 block data를 효과적으로 스트리밍하기 위한 chaindatafetcher를 제공하고 있습니다.

  • fetcher 모듈은 최신 블록까지 싱크가 된 상태에서 다른 노드에서 한 블록씩 가져올 때 동작합니다.
  • downloader 모듈은 많은 블록을 따라잡아야 하는 경우에 동작합니다.
  • chaindatafetcher를 이용하면 블록이 검증되어 노드에 블록이 추가될 때마다 kafka를 통해 블록데이터를 쉽게 구독(subscribe)할 수 있습니다.

네트워크(Network) Layer

네트워크(Network) 레이어는 grpc, p2p, rpc 통신을 위한 기능을 제공하고 있습니다. 이 레이어는 이더리움에서 가져온 코드를 그대로 사용하고 있으며, 클레이튼에서는 추가로 활발하게 개발하고 있지는 않습니다. 네트워크 레이어는 다른 레이어에 비해 오랜 기간동안 검증되고 최적화 된 영역으로 당장 개선이 필요하기보다는 중장기적인 관점으로 성능을 개선할 계획입니다.

스토리지(Storage) Layer

스토리지(Storage) 레이어는 블록체인 데이터를 디스크에 보관하기 위해 필요한 자료구조 및 기능을 제공하고 있습니다. database 모듈을 통해 다양한 데이터베이스를 지원하기 위한 인터페이스를 구현해 놓았으며, 현재는 levelDB를 사용하고 있습니다.

  • statedb 모듈에서는 블록체인의 상태를 저장하기 위하여 Merkle Patricia Trie의 구현체 뿐만아니라 디스크 접근을 줄이기 위한 다양한 캐시 구조가 구현되어 있습니다.
  • rlp모듈은 계정, 트랜잭션, 블록과 같은 자료구조를 디스크에 저장하기 위해 직렬화(serialization) 기능이 구현되어 있습니다. RLP에 대한 자세한 설명은 이더리움 위키를 참고하시기 바랍니다.

이상으로 클레이튼의 다양한 모듈을 레이어로 구분하여 알아보았습니다. 다른 글을 통해 각 모듈별로 좀 더 알아보는 시간을 가져보도록 하겠습니다. 댓글로 궁금한 부분을 말씀해주시면 그 모듈을 먼저 분석해보도록 하겠습니다. 감사합니다.