일요일, 12월 16

[KUBL] 이더리움에는 어떤 API들이 있을까?

0

개발자든 기획자든 간에 상관 없이 SW개발과 관련한 일을 해본 사람이라면 API라는 단어를 많이 들어봤을 것이다. 그러나 막상 API가 무엇인지 물어보면 이를 제대로 설명할 수 있는 사람은 많지 않을 것이라 생각한다.

이 문서에서는 간략하게나마 API가 무엇인지, 그 개념을 정리하고 이와 관련된 예시를 보려 한다.

 

API란 무엇인가?

API는 Application Programming Interface의 약자로, 글자 그대로 직역하면 응용프로그램을 프로그래밍하는 인터페이스이다.

API는 다른 응용프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스이다. 쉽게 말하자면 한 프로그램의 기능을 다른 프로그램이 쉽게 사용할 수 있도록 프로그램 간의 커뮤니케이션을 도와주는 것이라 보면 된다. 웹 브라우저나 윈도우같이 기반이 되는 시스템이 제공한 인터페이스를 응용하여 다른 프로그램을 쉽게 만들 수 있도록 도와주는 역할을 한다.

예를 들어, 웹 브라우저의 경우 (Internet explorer든 Chrome이든 어느 웹 브라우저라도 상관 없음) 상단 주소창에

javascript: alert(“Hello, World”);

라고 치면 바로 알림창이 뜨게 된다.

Chrome의 경우, 위와 같이 브라우저 화면 상단부 중앙에 팝업으로 Hello, World!라고 적힌 창이 확인 버튼과 함께 표시되는 것을 확인할 수 있다. 하지만 이러한 화면 구성은 우리가 alert라는 명령어 한 줄을 작성하면서 일일이 지정해둔 것이 아니다. 누군가 이미 개발을 하면서 만약 alert라는 명령어가 들어온다면 이런 식으로 창이 뜨도록 설계를 한 것이다. 이 역시 일종의 API라고 볼 수 있다.

 

  • UI와 API의 차이점?!

UI는 User Interface의 약자로 보다 직관적인 디자인적 요소를 의미한다. 사용자 친화적인 디자인을 통해 사용자의 편의를 증진히키는 것이 UI의 목적이라면, API는 코드를 통해 개발자들이 조금 더 편하게 개발할 수 있도록 하는 것이다.

 

  • REST API는 무엇인가?

REST는 Representational State Transfer의 약자로, HTTP 창시자 중 한 명인 로이 필딩이 설계한, 웹의 장점을 최대화할 수 있는 아키텍처이다. 명확한 디자인 기준을 제시함으로써 서비스 최적화하는 데 도움을 준다.

 

  • API? ABI?

ABI는 Application Binary Interface의 약자로 응용프로그램과 운영체제, 또는 응용 프로그램과 해당 라이브러리, 혹은 응용프로그램의 구성요소 간에서 사용되는 낮은 수준의 Interface이다.

API가 소스 코드에서 사용된다면 ABI는 바이너리에서 호환 가능하다는 점이 주요한 차이이다. ABI는 바이너리 코드이기 때문에 언어나 플랫폼과는 상관 없이 해당 Interface에 대한 정보를 제공할 수 있다.

이더리움의 경우, 이더리움 바이너리 실행 파일과 contract에서 설정한 함수, 변수 등을 연결할 수 있게 한다.

 

대표적인 API 활용 예시

여러 분야에서 공개 API를 활용한 개발이 빈번하게 이루어지고 있다. 대부분의 API는 무료로 제공되지만, 네이버처럼 호출수에 제한을 두거나 초과 사용 시 별도 비용을 청구하여 수익을 내는 경우도 있다. 구글 지도의 경우 API를 통한 수익이 상당하다.

 

네이버 제공 오픈 API (https://developers.naver.com/products/intro/plan/)

카카오 API (https://developers.kakao.com/docs/restapi/push-notification)

 

 

이더리움 DAPP 개발 구조

단순하게 나타내면 다음과 같은 구성이라고 볼 수 있다.

Smart Contract를 짜면 이를 컴파일하여 transaction을 보냄으로써 blockchain network에 올릴 수 있다. 모든 transaction 전송이나 contract의 실행은 EVM(Ethereum Virtual Machine, 이더리움 가상 머신)에서 이루어지며, Geth나 perity, eth 등의 이더리움 노드를 통해 블록체인 서버에 연결한다. 사용자는 웹이나 다른 application server, 혹은 지갑 등을 이용하여 smart contract와 이더리움 서버와 상호작용한다.

이 과정에서 서로 상호작용할 때 JSONRPC, Web3.js, geth와 같은 Interface들을 사용하는 것이다. 대표적인 Web3.js는 EVM과 통신하는 ABI이다.

 

 

대표적인 이더리움 API

  • Go-Ethereum, Geth

이더리움은 C++, Python, JavaScript 등 다양한 언어로 개발되고 있으나, 가장 활발하게 개발이 진행되고 있는 것은 Go(Go-lang)이다.

Geth는 Go언어로 된 이더리움 노드 소프트웨어 코드이다. Geth를 사용하여 Full 이더리움 노드를 실행할 수 있으며, 물론 현 상태를 기록하는 목적의 archive node나 데이터를 검색하기 위한 light node 등도 실행할 수 있다. 이더리움 네트워크와 연결하여 이더리움 노드를 실행하여 실제 이더를 마이닝하거나 주소 간의 자금 이체, 계좌 생성, TX 송신, 블록기록 탐색 등이 가능하다.

위는 Geth github wiki에 정리되어 있는, geth를 사용하여 커맨드 창에서 실행할 수 있는 명령어들이다.

실제로 geth를 설치한 뒤에 커맨드 창을 켜서 geth version이라고 치면 현재 사용하고 있는 geth의 버전에 관한 정보를 알려주는 것을 확인할 수 있다.


위에서 확인한 geth export 명령어를 이용하여 블록의 정보를 가져와봤다. –datadir은 위치를 지정해주는 명령어이며, 코드 실행이 끝나면 완료되었다는 안내를 하며 실행이 종료된다.


–datadir로 지정해둔 폴더를 들어가 확인해보면 data 폴더가 생성되어있으며, 해당 폴더 안에 들어가보면 chaindata가 생성되어 있는 것을 확인할 수 있다.

이런 방식으로 geth를 이용하여 이더리움 노드를 운영하거나, 사설 네트워크를 구축할 수 있다.

 

  • JSON-RPC

JSON-RPC를 설명하기 위해서는 JSON이 무엇인지, 또 RPC는 무엇인지를 먼저 알아야 한다.

JSON은 파일 형식 이름이다. JavaScript Object Notation의 약자로 “키”와 값의 쌍으로 이루어져 있는 단순한 구조를 지닌다. 값에는 숫자나 문자열, 배열, 또다른 키-값 쌍과 같이 다양한 타입이 들어갈 수 있다. JSON 파일은 사람이 읽고 쓰기에도 용이할 뿐 아니라 기계가 분석하고 생성함에도 용이한 경량의 DATA 교환 형식이다.

다음은 한 사람에 관한 정보를 담고 있는 JSON 객체의 한 예이다.

{

   “아이디” : “ryun”,

   “나이” : 20,

   “주소” : “서울특별시 성북구 안암동”,

   “취미” : [“프로그래밍”, “음악 감상”],

   “소속” : “KUBL”,

   “계좌” : {“#”: 3, “국민”: “12345678901234”, “우리”: “98765432109876”, “이더리움”: “0xdAbF9b29e4e47DD6A43E32BcfA758b746db1Ef31”}

}

RPC는 Remote Procedure Call의 약자로 그대로 직역하면 원격 함수 호출이라는 뜻을 가진다. 글자 그대로 다른 client(computer)에 있는 함수를 호출하는 것을 의미한다.

그렇다면 JSON-RPC란 과연 무엇인가? JSON을 데이터 포맷으로 사용하여 다른 원격 응용프로그램과 통신할 수 있도록 하는 API이다. HTTP기반의 REST API test 프로그램으로 즉시 테스트가 가능하다는 특성이 있다.  또한 Stateless*하며 light-weight RPC라는 장점이 있다.

*Stateless(무상태성 성격)는 작업을 위한 상태 정보를 저장하거나 관리하지 않고 서버에 들어오는 요청만 처리하는 단순한 형태를 말하며, 자유도가 높고 구현이 단순하다.

JSON-RPC는 원격 응용프로그램과 통신하기에 적합한 인터페이스이다.

Ethereum wiki (https://github.com/ethereum/wiki/wiki/JSON-RPC#web3_clientversion)에 가보면 JSON-RPC의 각 method에 대한 상세한 설명과 예시가 나와있다.

 

  • Web3.js

Web3.js는 이름에서도 알 수 있듯 JavaScript 기반으로 작성되어 있다. 위에서 살펴 본 JSON-RPC만으로도 충분히 이더리움을 사용할 수는 있지만, 응용 프로그램을 개발하는 입장에서는 JSON-RPC는 조금 불편한 감이 있다. Web3.js는 JSON-RPC를 호출해주는 라이브러리로써 조금 더 쉽게 응용 서비스나 dApp을 구현할 수 있도록 도와준다.

smart contract 상에서 event 처리나 return 타입 처리 등의 응용 개발 과정을 편리하게 도와주기도 하는데, 자세한 내용은 https://web3js.readthedocs.io/en/1.0/web3.html 에서 쉽게 확인할 수 있다. 설치 과정부터 시작하여 전반적인 이용법이나 다양한 예시 코드가 설명되어 있다.

 

 

실제 API들을 사용한 개발 예시

 

 

ethereum 블록과 블록에 담긴 TX를 확인할 수 있는 사이트이다.

공개되어 있는 깃헙 소스코드를 살펴보면 위와 같이 web3를 비롯한 다양한 API를 활용하여 구현되어 있는 것을 확인할 수 있다.

 

이더리움 지갑을 생성하고 거래 관리를 도와주는 사이트이다.

마찬가지로 깃헙을 확인해보면 web3를 활용하여 구현되어 있는 것을 볼 수 있다.

 

크롬, 오페라, 파이어폭스 등의 웹 브라우저 확장 프로그램으로 직관적인 UI로 거래 내역이나 보유토큰 등을 쉽게 확인할 수 있다. 오른쪽은 실제 거래 화면이다.

깃헙 Readme를 읽어보면 위와 같은 구성으로 짜여 있다는 설명이 있다. web dApp에서 UI 코드와 인페이지를 연결할 때 web3를 쓴다고 표시되어 있다.

 

 


 

메타마스크처럼 API를 활용하여 개발한 결과물이 또다른 API로 활용되기도 한다. 깃헙을 활용한 오픈소스 개발이 점차 늘어가는 현 상황 속에서 다른 API를 잘 활용하는 것, 그리고 본인이 개발한 코드가 API로써 어떻게 활용될 수 있는지를 잘 생각하는 것이 바람직한 개발자의 미덕이 아닐까.

 

  • 본 분석칼럼은 Tconomy 의 분석 분야 기여파트너인 고려대학교 블록체인학회(KUBL)의 지적재산입니다. 이 분석은 분석파트너의 판단이며 Tconomy 의 편집 방향이나 의견과 일치하지 않습니다.
Share.

Comments are closed.