테크 #기술분석
가나슈 환경에서의 이더리움 플라즈마 체인 사용기
테스트환경에서 이더리움의 플라즈마 컨트랙트 배포
이더리움 차일드체인, 플라즈마 체인서 토큰 거래 진행
토큰 인출, 항의 메커니즘...사용자경험 개선될까
강민승 기자
등록일: 2019-01-10  수정일: 2019-01-14

이 기사는 2019년 주목할 블록체인 기술 톱10 ③사이드 체인의 부록 기사로 스마트 컨트랙트 코드를 이용해 플라즈마 체인을 실제로 테스트한 내용을 담고 있습니다. 읽기 전 참고하길 바랍니다. <편집자 주>


이더리움의 플라즈마에 대한 이해를 돕도록 간단한 플라즈마 코드를 직접 작성, 작동시켜 봤다. 플라즈마 블록체인 테스트는 맥 운영체제 10.13 버전에서 진행됐다. 고이더리움(geth) 클라이언트를 직접 생성하지 않고 원격자바스크립트객체통신(JSON-RPC) 프로토콜을 지원하는 가나슈(ganache) 커맨드라인 인터페이스(CLI) 테스트 환경에서 사용했다. 가나슈는 이더리움의 로컬 테스트 네트워크를 구축하는 소프트웨어로 원래의 이름은 TestRPC다.


플라즈마는 브릿지 노드에 의존하지 않고 사용자들이 메인체인에서 자신의 소유를 직접 증명해 거래를 성사시키는 모델을 갖고 있다. 참여자 개인의 통제권이 주어지면서 거래의 실패에 대한 책임감도 크게 부여된다. 또 플라즈마에서의 거래에서는 사용자 간 부정행위 감시가 적극적으로 요구된다. 부정행위가 발생하면 사용자는 즉시 플라즈마 체인을 퇴장해야 한다.


플라즈마는 세 가지 구성 요소로 이뤄졌다. 먼저 이더리움 메인 네트워크와의 연결이 필요하다. 이더리움 메인체인에는 플라즈마 체인에서 발생한 거래의 블록 헤더값이 기록된다. 다음으로는 플라즈마 체인이 필요하다. 플라즈마는 메인체인에 의존하는 합의 메커니즘을 사용하지만 테스트에는 편의상 권한증명방식(PoA)으로 구동되는 플라즈마 체인을 사용했다. 플라즈마 체인에서는 앱에서 발생하는 트랜잭션이 위임돼 처리된다. 마지막으로 이더리움 메인넷에 배포돼 전체의 프로세스를 담당하는 플라즈마 컨트랙트가 필요하다. 플라즈마 컨트랙트는 특별한 형태의 스마트 컨트랙트로 예치, 인출 조건이 충족되면 플라즈마와 이더리움 메인체인 간 코인을 이동시킨다.


1. 구동 환경 구축
플라즈마를 사용하기에 앞서 몇몇 소프트웨어를 설치해야 한다. 깃(git), 노드 패키지 매니저(npm), 가나슈(ganache-cli), 트러플(truffle) 설치가 기본적으로 필요하다. 범용적으로 쓰이는 플라즈마 블록체인은 아직 없다. 이번 테스트에 사용한 플라즈마는 자바스크립트로 만들어진 개별 플라즈마 체인이며 REST-API를 사용할 수 있다. 이밖에 오미세고의 깃헙에 미니멀 바이어블 플라즈마(MVP)가 구현돼 있어 사용해 볼 수 있다. 오미세고의 MVP는 파이썬(python3)로 만들어졌으며 테스트에 사용한 플라즈마 체인과 거의 비슷한 방식으로 동작한다.



현재 작업 폴더에서 깃 클론을 통해 플라즈마 코드를 설치했다. npm install을 통해 package.json에 명시된 디펜던시를 모두 설치했다. 터미널의 탭을 추가해 가나슈의 테스트 RPC에 접속했다. 내부망인 로컬 호스트로 접속되며 포트번호는 맥의 경우 8545번으로 설정된다. 가나슈 테스트 네트워크에서는 10개의 계정이 잠금 해제된 상태로 제공된다. 계정에는 100이더씩 충전돼 있고 각 계정의 개인키도 간편하게 볼 수 있어 이더리움 블록체인의 코드 테스트를 편리하게 진행할 수 있다. 가나슈가 생성한 뉴모닉을 알아두면 -m옵션을 통해 똑같은 환경으로 다시 접속할 수 있다. 뉴모닉은 이더리움 지갑의 키를 표현하는 12단어의 배열을 말한다.




2. 플라즈마 컨트랙트 배포

준비된 솔리디티 코드의 컴파일을 위해 트러플(truffle) 프레임워크를 사용했다. 트러플은 탈중앙화앱(dApp)을 개발하기 위한 프레임워크로 여러 라이브러리를 제공한다. 



truffle compile 명령어를 통해 5개의 솔리디티 코드를 한번에 컴파일했다. 트러플은 솔리디티 코드의 대량 컴파일 기능을 지원한다. 트러플 대신 솔씨(solc)와 같은 기초적인 컴파일러를 사용할수도 있지만 코드를 하나씩 컴파일하고 바이트 코드와 응용이진인터페이스(ABI)를 직접 수정해 넣어야 하는 등 번거롭다. 컨트랙트 코드의 에러 메시지는 이전 버전의 양식과 현 솔리디티 코드의 작성 양식이 달라서 발생한 것이기 때문에 무시해도 된다. 실제로 솔리디티는 한달에도 패치가 여러 번 배포될 만큼 업데이트가 활발하다.


truffle migrate 명령어로 컨트랙트를 이더리움 네트워크에 배포한다. 배포된 컨트랙트의 주소(CA)를 확인한다.



이더리움에 배포된 플라즈마 컨트랙트의 주소는 0xf6d855fa752b1f9f0ddc347ca239ea441be8a2e7이다. 플라즈마를 운영할 계정을 하나 임의로 지정한다. 가나슈가 제공하는 10개의 계정 중 0x7d0b409f48712c80e24581f85aa3ee449b0af5e8를 플라즈마 체인의 단일 운영자로 지정했다. 


로컬 네트워크에서 3001번 포트를 개방하고 플라즈마 네트워크를 시작한다. 이 플라즈마 체인은 노드(node.js) 서버로 제작됐다. --contract 옵션과 --operator 옵션을 추가하는 방식으로 시작했다. 해당 옵션을 사용하지 않을 경우 config.js 파일을 직접 수정해야 한다.



CA와 오퍼레이터의 주소를 복사해 서버 시작 옵션으로 넣었다. 이로써 플라즈마 체인에서 새로운 블록이 생성된다.


3. 플라즈마로 토큰 전송, 거래 시작
이제 별개의 네트워크인 플라즈마 체인에서 쓸 수 있도록 토큰을 예치한다. 플라즈마 네트워크에 참여하기 위한 아이디는 별도로 발급받을 필요 없이 메인 이더리움 계정의 주소를 그대로 사용하면 된다. REST-API를 통해 요청을 전달하는 방식으로 토큰을 예치한다. 솔리디티 코드를 간단히 테스트하는 리믹스 브라우저에서도 JSON-RPC 계정을 연결했다. 예치가 끝나면 계정의 이더 수량이 변화한 모습을 볼 수 있다.

맨 위에서 두번째에 위치한 계정은 플라즈마 컨트랙트를 이더리움 테스트넷에 배포하면서 수수료 가스를 소모했기 때문에 99.96이더로 나타난다. 플라즈마 체인을 개시하는 계약 배포, 예치, 송금, 인출 작업 모두 수수료인 가스를 소모한다. 하지만 플라즈마를 사용하면 메인체인에서 모든 거래를 진행하는 경우보다 수수료를 절감할 수 있다. 플라즈마는 최소한의 데이터만 메인체인에 동기화해 기록하기 때문이다.



0xb6b52c34928e080b38d4e2f405f535431bbd22fc에서 플라즈마에서 직접 쓸 수 있도록 4이더(ETH)를 예치했다. 사용자가 명령어를 통해 예치한 금액은 실제로는 스마트 컨트랙트인 플라즈마 컨트랙트의 주소(CA)에 저장된다. 0x7772234ae597782e54c02ff0fb3e9f2650caff9c에서도 10이더를 예치했다.

금액을 플라즈마 체인으로 이동시키도록 요청했지만 실제적으로 결과가 플라즈마 네트워크에 반영되려면 플라즈마의 블록이 채굴돼야 한다. 채굴 작업이 없으면 이동된 코인을 인식하지 못하며 가용성 문제인 “No asset found”에러가 발생한다. REST-API의 POST 방식을 통해 한 블록씩 채굴했다. 


플라즈마 네트워크에서 계정 간 송금을 실행하기 위한 트랜잭션을 만든다. 1이더를 옮기는 트랜잭션이다. 계정의 주소 두개와 수량을 입력값으로 받는다.



HTTP-API를 통해서 자바스크립트객체(JSON)를 전달하는 방식으로 트랜잭션을 요청했다. 플라즈마 네트워크에서 0xb6로 시작하는 계정에서 0x77로 시작하는 계정으로 1이더를 옮겼다.


플라즈마 체인에서의 거래는 부모 체인인 이더리움의 거래 방식과는 다르다. 본래 이더리움 메인네트워크에서의 거래는 발생한 모든 키-밸류값을 순서쌍으로 쌓은 내역인 스테이트를 변경하고 내역을 기록하는 방식으로 거래를 진행한다. 하지만 플라즈마 체인에서는 미사용트랜잭션아웃풋(UTXO)를 나눠갖는 형식으로 자산, 코인을 기록한다.


UTXO 모델은 플라즈마 체인의 잔고를 유지하는 복잡도를 낮추고 사용자의 출금을 빠르게 하기 위해 도입됐다. 하지만 거래를 할 때 사용자가 UTXO장부의 위치를 정확히 알고 있어야만 한다는 단점이 있다. 3001번 포트의 플라즈마 네트워크에서 발생한 트랜잭션의 UTXO는 다음처럼 표시됐다.



기존 이더리움 네트워크에서는 한 개의 트랜잭션을 발생시키고 배포하는데 15초 이상의 시간이 소요돼 거래의 진행이 매우 느린 편이다. 하지만 플라즈마 체인에서는 기존 이더리움 메인넷보다 훨씬 빠르게 실행된다. 실제로 비탈릭 부테린은 이더리움이 플라즈마 네트워크를 사용해 초당 수십억 건의 스테이트 업데이트를 처리할 수 있을 것으로 전망하고 있다.


그러나 오프체인에서의 높은 처리성능은 블록체인의 초당트랜잭션(TPS) 계산에 포함되지 않는다. 기술적으로 TPS는 메인체인에서 초당 처리되는 트랜잭션의 총량을 블록 검증자의 수로 나눈 값이기 때문이다. 다른 체인에 트랜잭션을 위임해 처리하는 방식을 사이드 체인 기술이라고 한다면 메인체인 자체에서 트랜잭션을 처리하는 권한을 위임해 실질적인 TPS를 개선하는 방법은 샤딩이라고 부른다.


4. 전송된 토큰의 인출
플라즈마 체인에서의 거래가 마무리되면 이더리움 메인체인으로 출금을 위해 인출 계약을 신청한다.



출금을 위해 사용자는 출금될 코인의 정확한 UTXO장부 위치를 알고 있어야만 한다. UTXO장부에서 인출하려는 시점의 해당 블록 넘버, 트랜잭션 인덱스, 계좌 주소 등 출금을 위한 입력값이 하나라도 틀리면 “Emtpy reply from server”에러가 발생하며 돈을 되찾을 수 없다. 


인출 절차가 개시되도 받은 이더를 사용자의 이더리움 지갑으로 바로 보낼 수는 없다. 플라즈마에는 라이트닝 네트워크의 거래 항의 시스템처럼 항의 기간이 있다. 지금 만들어진 플라즈마 체인의 항의 기간은 일주일인데 해당 기간동안 이중지불 등의 부정행위가 다른 사용자에게 발각되지 않으면 이더리움의 메인 체인으로 인출된다. 


5. 총평

먼저 블록체인의 전체적인 프로세스를 알고 있지 않으면 플라즈마를 구동하기가 매우 어렵다. 플라즈마 테스트넷을 사용해보며 심지어 개발자를 위해서도 인터페이스의 많은 개선이 필요하다고 느꼈다. 오미세고의 MVP 경우 입력값을 띄어쓰기 한칸으로 구분해 모든 입력값을 받는데 커맨드라인에 이를 입력하면서 오류도 적지 않게 발생한다예를 들어 1이더를 보내는 송금을 하기 위해 omg sendtx 1 0 0 0 0 0 0x0 0xfd02EcEE62796e75D86BCff1642EB0844afB28c7 50 0x4B3eC6c9dC67079E82152d6D55d8dd96a7e6AA26 45 3bb369fecdc16b93b99514e8ed9c2e87c5824cf4a6a98d2e8e91b7dd0c063304를 틀리지 않게 한 줄에 입력해야 한다. 항의 기능도 크게 다르지 않다. 사용자는 자신의 토큰이 도난당하지 않도록 적극적으로 방어해야만 하는 위치에 놓여있지만 이같은 방식으로 플라즈마에서 플라즈마 체인의 내 토큰을 안전하게 지킬 수 있을지 의문이다.


대부분의 플라즈마는 응용프로그래밍인터페이스(API) 제공하지 않아 직접 메뉴얼로 설정해줘야 하는 부분이 많아 보인다. 다른 블록체인 플랫폼에서는 개발을 쉽게 하기 위한 소프트웨어개발키트(SDK) 등을 제공하기도 한다. 실제로 하이퍼레저 패브릭의 경우 스웨거 API 개념증명(PoC) 제품을 쉽게 만들수 있는 컴포저를 도입해 개발자경험을 높이기도 했다.  


플라즈마는 블록체인에서 해결하고자 하는 문제의 포인트에 따라 여러 버전이 존재한다. ‘기술이 무엇을 원하는가 저술한 케빈 켈리는 기술의 궁극적인 목표는 범용적인 망치를 만들어내는 일이라고 말한다. 대중적으로 많이 쓰일 제너럴 플라즈마 솔루션이 등장하길 기대해 본다.


[강민승 기자]

디스트리트 커뮤니티 광고
북마크
좋아요 : 0
공유
https://dstreet.io/news/view-detail?id=N20190109172856329624
URL복사
댓글 0
댓글쓰기
댓글 쓰기
에어드랍 가즈아