Klaytn은 Kakao GroundX 에서 개발한 Blockchain platform 입니다. 비트코인을 시작으로 엄청난 붐을 일으킨 블록체인이 이더리움과 Smart Contract의 등장으로 분산 원장을 넘어선 분산 어플리케이션(Distributed App, DApp)으로의 확장으로 이어졌습니다.
Klaytn은 기존 ethereum network 보다 분산화가 적다는 단점(소수의 지정받은 노드들만 마이닝 가능)이 있지만 데이터 무결성과 투명성은 그대로 보장된다는 점, 그리고 TPS가 월등히 높다는 점을 감안해보면 Dapp의 활성화를 목표로 한다면 매력적인 플랫폼이 아닐 수 없습니다.
Klaytn을 사용하기 위해 GroundX에서 Opensource로 공개한 Javascript SDK인 Caver-js 의 구조를 분석해보겠습니다. 먼저 다음과 같은 큰 5개의 클래스들의 구조를 파악하고 그 뒤 하나하나 분석해보도록 하겠습니다.
caver.klay
caver.klay.accounts
caver.klay.abi
caver.klay.contracts
caver.klay.net
caver.util
위와 같이 크게 2개의 클래스로 구성되어 있고 klay의 경우 주요 클래스를 4개를 더 포함한 형태입니다.
기능을 분석한다기 보다는 내부 구조와 코드 패턴 등을 분석해보도록 하겠습니다 SDK의 기능 분석이나 직접적인 사용을 원하시는 분은 Ground X에서 공식적으로 공개한 https://docs.klaytn.com/ 을 참조해주세요! (Korean Version도 있습니다.)
- caver.klay 객체
가장 상위 클래스 입니다. (es5에선 class 라는 문법을 사용할 수 없기 때문에 function으로 선언되어 있음)module의 entry point에서 바깥쪽으로 export하는 가장 상위 클래스로서 내부 멤버 변수들과 다양한 method들을 가지고 있습니다.
1.1 내부 Variable
defaultBlock, defaultAccounts 두 개의 멤버 변수를 가지고 있고 내부적으로 다음과 같은 형태로 선언되어 있습니다.
let defaultAccount = nulllet defaultBlock = 'latest'Object.defineProperty(this, 'defaultAccount', {
get : fucntion() {...},
set : function() {...}
})
Object.defineProperty(this, 'defaultAccount', {... })
또한 Klay 클래스 뿐 아니라 모든 클래스에서 다음과 같은 패턴을 사용합니다.
const _this = this
위와 같은 패턴을 사용해서 this 객체를 선언된 Klay Class로 binding 시키는 효과를 볼 수 있습니다. bind()함수를 호출 하는 것 보다 좀 더 명시적인 패턴 같습니다.
1.2 Methods
이 외에도 Klay 클래스는 다양한 method들을 가지고 있습니다. Klay에서 쓰이는 method들은 모두 RPC 통신이 필요한 메소드 들입니다.
Klay 클래스 뿐 아니라 Caver-js에서 사용하는 모든 RPC 통신 관련 메소드 들은 특징이 있는데보통 javascript에서 클래스 스타일의 객체를 선언할 때 사용는 다음과 같은 패턴을 사용하지 않습니다.
<ObjectName>.prototype.<methodName> = function () {...}
Method 클래스를 선언하고, rpc.json를 읽어 이를 기반으로 rpcCallToMethod객체들을 생성합니다. 이 객체들을 통해 다시 Method 객체를 만들게 되고, 이를 attachToObject 함수를 통해 해당 객체에 attach 하는 식으로 클래스 내부 methods들을 선언합니다. 코드 패턴은 다음과 같습니다.
const methods = [...rpcCalls.map(item => new Method(item))]
methods.forEach(function(method) {
method.attachToObject(_this)
})
위에서 사용하는 rpcCallToMethod, Method, rpc.json 등은 따로 포스팅을 통해 자세한 구조와 프로세스를 분석 및 작성해보겠습니다. 중요한 점은 직접적인 선언이 아닌 method들을 통해 rpc.json을 읽어 method들을 생성한다는 점 입니다.
1 .3 member Object
Klay 클래스는 다양한 기능을 지원하는데 이 기능들을 비슷한 역할을 하는 기능끼리 묶어 새로운 객체로 만들고, 이 객체를 Klay 내부 멤버 객체로 할당하는 형태의 구조입니다. 다음과 같은 주요 클래스들이 있습니다.
klay.account
klay.net
klay.abi
klay.contracts
다음 포스팅에서 위 4개의 클래스에 대해서 분석해보도록 하겠습니다.