검수요청.png검수요청.png

이더리움 클라이언트

위키원
9teahyun (토론 | 기여)님의 2019년 8월 6일 (화) 14:30 판
이동: 둘러보기, 검색

이더리움 클라이언트(Ethereum Clients)는 이더리움 블록체인 네트워크를 구성하는 개별 클라이언트 노드(node)이다. 이더리움은 중앙 집중형 서버 프로그램이 따로 존재하지 않는다. 오로지 클라이언트 프로그램만 존재한다. 이더리움 클라이언트는 멀티 플랫폼 환경을 지원하기 위해 다양한 프로그래밍 언어로 개발되고 있다.

개요

이더리움 사양을 구현하고 다른 이더리움 클라이언트와 P2P 네트워크를 통해 통신하는 소프트웨어 응용 프로그램으로 서로 다른 클라이언트가 다른 팀과 다른 프로그래밍 언어로 구현되는 동안 이들은 모두 동일한 프로토콜을 따른다. 따라서 모두 동일한 이더리움 네트워크를 운영하고 상호작용하는데 사용될 수 있다. 이더리움은 오픈 소스 프로젝트이며 모든 주요 고객을 위한 소스코드는 오픈 소스 라이센스에서 무료로 사용할 수 있다. 이더리움은 일반적으로 다른 블록체인보다 네트워크에서 실행되는 구현의 다양성이 더 크다.[1]

특징

이더리움 클라이언트는 이더리움 블록체인에 참여하는 노드이다. 즉 블록이 생성되면 그 정보를 전파 받는 역할을 하는 것이다. 따라서, 싱크된 블록체인 데이터를 가지고 있어야 하며 이더리움 클라이언트는 블록체인 네트워크의 노드이면서, 일반 사용자의 접속을 허용하고 블락체인과 연결시켜주는 역할도 담당한다. 그래서 일반 사용자는 이더리움 클라이언트, 즉 노드에 접속하여 geth와 같은 명령어로 블록체인 정보를 얻거나, 스마트 컨트랙트를 사용할 수 있다. 이더리움 클라이언트는 블록체인 데이터를 모두 가지고 있다. 한 사용자가 생성한 스마트 컨트랙트는 이더리움 클라이언트를 통해서 블록에 포함되고, 결국 블록체인으로 연결된다.[2]이더리움 클라이언트 프로그램은 리모트 프로시더 콜(Remote Procedure Call) (RPC) 명령어 인터페이스를 자바스크립트(Javascript)의 제이에스오엔(JSON)형태로 지원한다. 이것을 제이에스오엔 알피시 에이피아이(JSON-RPC API)라고 하는데, 이것을 이용해서 블록체인의 정보를 얻거나 거래를 생성하는 명령을 원격으로 할 수 있다

Geth

이더리움 블록체인 네트워크(Ethereum Blockchain Network)

Geth는 이더리움 재단(Ethereum Foundation)이 제공하는 공식 클라이언트 소프트웨어로서, (Go) 언어로 개발되었다. Geth를 처음 시작하면 네트워크 내의 다른 이더리움 클라이언트(노드node라고도 불림)에 연결하는 작업을 먼저 시작하고 블록체인의 전체 사본을 내려받게 된다. Geth는 블록체인의 복사본을 최신 상태로 유지하기 위해 끊임없이 다른 노드와 통신한다. 또한 블록을 채굴하고, 블록체인에 트랜잭션을 추가하고 블록의 트랜잭션을 검증하며 트랜잭션을 실행할 수도 있다. 그리고 RPC를 통해 상호작용할 수 있는 API를 노출하여 서버 역할을 하기도 한다. 블록체인에 연결할 수 있는 자바스크립트 클라이언트(geth console)도 있다.

패리티(Parity)

다양한 클라이언트가 서로 연결된 이더리움 블록체인 네트워크(Ethereum Blockchain Network)

패리티(Parity)는 이더리움 프로토콜의 또 다른 구현체이며, 러스트(Rust) 프로그래밍 언어로 개발되었다. 현재 Parity Inc. 라는 기업에서 운영하고 있으며 사실 이더리움 네트워크에 접속할 수 있는 클라이언트 소프트웨어를 개발하는 길은 누구에게나 열려 있다. C++, 파이썬 및 다른 언어로 작성된 클라이언트도 있다. 원한다면 이더리움 황서의 사양을 따라 자신의 클라이언트를 구현할 수 있다.[3]


활용

화폐기능이 주가되었던 비트코인에 비해서 프로그래밍 가능한 Smart contract기능이 추가되어 다양한 DApp 개발이 가능하다. geth는 이더리움의 모든 기능을 사용할수 있는 클라이언트로 설치는 바이너리를 사용하여 설치하는 방법과 소스를 빌드하여 설치하는 방법이 있다. 먼저 이더리움 geth는 Go 언어로 작성이 되었기 때문에 Go lang을 설치한다. Go lnag 설치가 완료되었으면 다음과 같이 소스를 다운로드 받은후에 빌드를 한다. 빌드가 완료되면 하기 디렉토리에 geth 실행화일이 생성되니 .profile 에 해당 패스를 추가해주는것이 좋다. 이제 private net을 통해 실행 해준다. 먼저 계좌정보가 저장될 디렉토를 하나 생성하고(.data) 계좌를 하나 생성하도록 하겠다. 데이타가 저장될 디렉토리 ./data를 지정하고, genegis 블록정보가 포함되어있는 CustonGenesis.json 화일을 지정하여 genesis 블록을 생성하면 private network 실행을 위한 준비가 완료된다.


> miner.start()

INFO [04-02|22:55:39] Updated mining threads threads=0

INFO [04-02|22:55:39] Transaction pool price threshold updated price=18000000000

null

> INFO [04-02|22:55:39] Starting mining operation

INFO [04-02|22:55:39] Commit new mining work number=69 txs=0 uncles=0 elapsed=132.014µs

> INFO [04-02|22:55:39] Successfully sealed new block number=69 hash=61e6ef…61a88f

INFO [04-02|22:55:39] 🔨 mined potential block number=69 hash=61e6ef…61a88f

INFO [04-02|22:55:39] Commit new mining work number=70 txs=0 uncles=0 elapsed=120.199µs

INFO [04-02|22:55:40] Successfully sealed new block number=70 hash=81a7e6…a68b62

INFO [04-02|22:55:40] 🔨 mined potential block number=70 hash=81a7e6…a68b62

INFO [04-02|22:55:40] Commit new mining work number=71 txs=0 uncles=0 elapsed=72.851µs

> miner.start()

INFO [04-02|22:55:39] Updated mining threads threads=0

INFO [04-02|22:55:39] Transaction pool price threshold updated price=18000000000

null

> INFO [04-02|22:55:39] Starting mining operation

INFO [04-02|22:55:39] Commit new mining work number=69 txs=0 uncles=0 elapsed=132.014µs

> INFO [04-02|22:55:39] Successfully sealed new block number=69 hash=61e6ef…61a88f

INFO [04-02|22:55:39] 🔨 mined potential block number=69 hash=61e6ef…61a88f

INFO [04-02|22:55:39] Commit new mining work number=70 txs=0 uncles=0 elapsed=120.199µs

INFO [04-02|22:55:40] Successfully sealed new block number=70 hash=81a7e6…a68b62

INFO [04-02|22:55:40] 🔨 mined potential block number=70 hash=81a7e6…a68b62

INFO [04-02|22:55:40] Commit new mining work number=71 txs=0 uncles=0 elapsed=72.851µs

채굴이 진행 중일때 계좌의 잔액을 조회해보면 다음과같이 증가함을 볼수 있으며, 하기는 잔액단위를 디폴트 웨이(wei)에서 이더(ether)로 변경하여 출력하고 있다. 채굴을 중지하고자 할 때는 miner.stop()을 실행하면 된다.[4]


이더리움 클라이언트 프로그램은 Remote Procedure Call (RPC) 명령어 인터페이스를 Javascript의 JSON형태로 지원한다. 이것을 JSON-RPC API라고 하는데, 이것을 이용해서 블록체인의 정보를 얻거나 거래를 생성하는 명령을 원격으로 할 수 있다.


$ curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' \ http://localhost:8545


위 예는 JSON-RPC API를 이용하여 클라이언트 포로그램의 버전을 얻어오는 명령이다. 위 명령의 결과는 JSON 형태로 다음과 같이 얻어진다. 이 경우 클라이언트 프로그램은 go.1.8.3인 것을 알 수 있다.


{"jsonrpc":"2.0","id":1,

"result":"Geth/v1.8.0-unstable-02aeb3d7/linux-amd64/go1.8.3"}


또, 현재 gas의 가격을 얻는 명령은 아래와 같이 입력한다.


$ curl -X POST -H "Content-Type: application/json" --data \

'{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":4213}' \

http://localhost:8545

위 명령의 결과를 보면 gas 가격이 "0x430e23400"임을 알 수 있다. 이것은 gas 가격이 18 giga wei라는 것을 의미한다.

{"jsonrpc":"2.0","id":4213,"result":"0x430e23400"}[5]

문제점과 대안

서비스 처리시간과 서비스 거부

2016 년 2 월의 성능 분석에 따르면 Parity 이더리움 클라이언트는 6 개월 분의 트랜잭션 (1 백만 블록)을 처리하는 데 한시간 이상 걸렸다. 모든 1백만 블록은 이더리움 네트워크에 대한 최근의 서비스 거부 공격 이전에 있었다. 이러한 사실에 비교해서 볼만한 자료가 있다. 이더리움보다 훨씬 더 높은 평균 처리 속도로 600만 스팀 블록을 처리하는 데에는 단 몇 분밖에 걸리지 않는다. 이는 처리 속도가 20 배이상 차이가 나는 것을 나타낸다. 단일 CPU 스레드가상 기계(virtual machine)를 처리 할 수있는 속도는 네트워크의 잠재적 트랜잭션 처리량에 직접 영향을 준다. 현재 이더리움 네트워크는 초당 20건이 약간 넘는 트랜잭션을 처리 할 수 있다. 반면, 스팀은 초당 1000 회의 트랜잭션을 유지할 수 있다. 이더리움에 대한 최근의 공격으로 네트워크가 완전히 포화되고 다른 사람에게 서비스를 제공하는 것이 거부 됬었다. 반면에 스팀은 수수료 없이 서비스를 방해받지 않고 공격에서 살아남았다.

대안의견

  • 블록에 트랜잭션이 존재한다는 것은 네트워크가 블록과 모든 트랜잭션을 제 때 처리할 수 있었다는 신호이다. 네트워크의 각 노드는 블록과 트랜잭션이 처리하는 데 걸린 시간에 대한 "투표"를 받는다. 실제로 트랜잭션이 할당 시간을 초과했다고 생각하면 노드는 블록을 중계(relay)할 필요가 없다. 보상 받기를 원하는 블록 제작자는 자신의 블록이 전파되고 다른 노드가 가질 벽 시계 추정치에서 "보수적인"것이되도록 할 것입이다. 네트워크는 포함 된 트랜잭션의 수에 비례하여 블록 보상을 조정해야한다.
  • 스크립트의 문제점 중 하나는 공격자가 무한 루프를 생성하는 데 드는 비용이 들지 않는다는 것이다. 최종 결론은 스크립트를 거부하는 경우에도 노드 유효성 검사는 리소스를 소비하게된다. 이 경우 유효성 검사기는 소비 한 리소스에 대해 대가를받지 않는다. 작업 증명을 사용하여 유효성 검사기가 스크립트 제작자가 최소한의 노력을 소비했음을 알 수 있다. 작업이 많을수록 유효성 검사기가 스크립트가 최대 한도까지 실행할 수있는 "벽시계"시간이 길어진다. 계산 비용이 많이 드는 트랜잭션을 전파하려는 사람은 비용이 적게 드는 트랜잭션을 생성하는 사람보다 더 어려운 작업 증명을 생성해야한다. 이 작업 증명과 TaPoS (지분 증명으로서의 거래)가 결합 됨으로써 우리는 전체 네트워크를 공동으로 보호하는 작업 증명으로서의 트랜잭션을 갖게되었다. 이 접근법은 증인이 "자신의 블록을 채워서" 돈을 받는 것을 막는 부수적인 효과가 있다. 왜냐하면 그들이 생성하는 각각의 거래에는 작업 증명이 필요하기 때문이다. 따라서 블록체인은 스크립트 실행의 어려움에 대한 객관적 프록시로서 작업 증명의 어려움을 토대로 트랜잭션에 대한 증인에게 보상할 수 있다.[6]



각주

  1. 안성주지몬,〈[마스터링 이더리움Mastering Ethereum- Clients〉,《개발이야기》, 2018-09-26
  2. 이더리움 스마트 컨트랙트 동작방식 종결자!!! DApp 개발 가즈아〉, 《스팀잇》, 2017년도
  3. Geth/Parity클라이언트,〈[https://kr.zastrin.com/courses/kr-ethereum-primer/lessons/3-1 Geth/Parity 클라이언트〉,《자스트린》
  4. 니르바나 작가-〈[https://ihpark92.tistory.com/29 이더리움 클라이언트 설치하기〉,《티스토리》, 2018년도
  5. 마스터링 이더리움,〈[마스터링 이더리움3장 이더리움 클라이언트〉,《비지배타》, 2019-06-26
  6. 마 작가〈[https://steemit.com/kr/@maa/3qwkmu 이더리움 스마트컨트랙트의 한계와 스팀의 앞으로의 발전 가능성〉,《스팀잇》2017-05-19

참고자료

같이 보기


  검수요청.png검수요청.png 이 이더리움 클라이언트 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.