Hyperledger Sawtooth (private blockchain) 실습하기 #1. 맥북에서 Docker를 이용한 설치
상당히 긴 여정이 될 것 같습니다.
어제 오늘 Hyperledger Sawtooth 를 설치하고 튜토리얼을 따라 Genesis Block(첫 블록)을 만들고, 트렌젝션, 배치 처리, State 등에 대한 기본적인 흐름, XO 게임 예제를 따라가보았습니다.
최근에 친구가 빌려준 '비트코인, 블록체인과 금융의 혁신(https://steemit.com/kr/@loum/5jbqud)' 과 '이더리움, 솔리디티 입문(http://wikibook.co.kr/ethereum-solidity/)' 이라는 책을 보았는데 이해하기가 쉽지 않았는데, 위의 과정을 거치다보니 대략적이나 나마 어떻게 굴러가는가보다 라는 느낌 정도를 받을 수 있었습니다.
개인적으로는 '코드로 이해하는 블록체인' (http://www.popit.kr/java-%EC%BD%94%EB%93%9C%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8blockchain/) 이 사이트도 가볍게 보기에 추천합니다.
여전히 프라이빗 체인에 희망이 있는지에 대한 논란이 많은 듯 합니다. 다만 무슨 사업을 하는 것도 아니고, 좀더 실무적인 관점에서 관심을 갖고 있기에 차라리 퍼블릭 체인보다 진입장벽이 낮을 것 같다는 생각으로 출발했습니다.
앞으로 튜토리얼(https://sawtooth.hyperledger.org/docs/core/releases/1.0.0rc2/contents.html)에 있는 과정을 하나씩 연습해보면서 실제로 활용가능한 DB로 진행해보는 과정을 기록에 남겨두려고 합니다. node가 단 하나로도 구동이 되기 때문에 블록체인에 대한 이해를 위해 좋은 시도가 될 것 같습니다.
Python SDK가 제공되고 있고, 샘플로 제작된 XO 게임도 파이썬으로 함수가 공개되어있습니다. 아마 실제로 구동되는 웹페이지는 Django나 Flask를 이용해서 아예 파이썬으로만 작동하도록 설계해볼까 합니다.
AWS, Ubuntu, Docker를 통한 튜토리얼을 제공합니다. 연습삼아 맥북에서 돌려보기엔 도커만한 것이 없어 이 것으로 진행하고자 합니다.
<도커(Docker)란 무엇인가?> : 잘못된 설명을 한 부분이 있으면 지적 부탁드립니다.
컨테이너 박스를 떠올리면 되는데 원하는 모듈을 장착해서 쓴다고 생각하면 될 것 같습니다. 가상머신과 비슷하나 다른 개념입니다.
안타깝게도 쓰고있는 지금도 여전히 완벽하게는 이해하지 못하고 있는 상황입니다. 다만 인터넷에서 여러 사이트를 찾아본 것 중에 가장 잘 설명된 슬라이드는 https://www.slideshare.net/pyrasis/docker-fordummies-44424016 입니다. '가장 빠르게 만나는 Docker'라는 책의 저자분이 작성하신 슬라이드로 책도 언제 도서관에서 한번 빌려봐야겠습니다. 이 슬라이드의 43번째 페이지에 아주 완벽히 정리된 그림이 있습니다만 저작권 문제로 붙이지는 않습니다.
쉽게 설명하면, 서버 위에서 구동되는 OS(호스트OS)가 있고, 그 위에 도커 엔진이 올라가 있습니다. 그리고 그 도커 엔진 위에서 컨테이너들이 하나하나 붙는다고 보면 됩니다.
Docker Image는 이미지 파일이고 이 것이 실행되어 운영 중인 상태를 Container라고 부릅니다.
맥북에서는 호스트 OS와 도커 엔진 사이에 Virtual Box가 한겹 더 들어갑니다.(그러나 Virtual Box를 통하지 않고 도커를 사용 할 경우에도 Sawtooth가 작동을 했습니다. 다만 이 경우에는 Kitematic에서 이미지와 컨테이너들을 인식을 하지 못하는 문제가 있습니다.)
<도커 설치>
도커는 아래 주소에서 다운받아 설치합니다.
https://store.docker.com/editions/community/docker-ce-desktop-mac
그리고 도커 툴박스라는 것을 설치하면 Virtual Box 및 Kitematic이라는 보조 도구들이 설치됩니다.
https://docs.docker.com/toolbox
처음에는 에러가 안났었던 것 같은데, 중간에 꼬이면서 VirtualBox에 자동으로 설치된 가상머신(default라는 이름)에 바로 접근이 되지 않기 시작했습니다. 나중에 알게된 해결책은 Terminal에서
$ eval $(docker-machine env default)
라고 입력해주면 됩니다. 아마 default라는 이름의 가상머신에 access하겠다..라는 의미정도가 되는 것 같습니다.
다음은 docker-composer를 이용해서 sawtooth 구동에 필요한 이미지들을 한번에 다운받고 구동하는 과정을 거칩니다.
$ docker-compose -f sawtooth-default.yaml up
튜토리얼의 ubuntu 편을 보면 하나하나 설치하고 실행시키기 때문에 생략되는 과정을 자세히 알 수 있습니다.
composer를 통해 한번에 설치하게 되면 sawtooth에서 알아서 genesis block까지 생성해줍니다.
이제 Sawtooth CLI(command-line-interface)를 사용하기 위해 client container로 들어갑니다.
<Sawtooth 예제 따라하기>
$ docker exec -it sawtooth-shell-default bash
여기도 약간 이해가 안갑니다만...일단 sawtooth-shell-default 라는 컨테이너가 일반적인 linux의 쉘과 같은 기능을 한다고 이해했습니다. 그리고 이것은 그 쉘로 들어가서 bash를 실행시킴으로써 마치 가상머신 내부의 리눅스로 들어가는 것과 같지 않나하고..
아무튼 튜토리얼에서는 아래와 같이 세팅된 블록들을 불러오게 합니다.
CLI에서는 curl http://rest-api:8008/block을 사용합니다. 그리고 제대로 연결되었다면 외부(기본터미널)에서도 localhost로 접근이 가능해야합니다. 왜냐면 내 맥북에서 블록체인 서버를 열었으니까요.
그러나 아래와 같이 접근이 안되는 문제가 발생합니다. 보안문제 같습니다.
구글링을 해보니 localhost가 아닌 주어진 IP를 사용해야한다고 합니다. 여기서 Kitematic이 큰 도움을 주는데 실행하고 있는 컨테이너의 정보를 보면 우측에 IP가 적혀있습니다. 이것을 localhost 대신 사용하면 됩니다.
즉 아래와 같이 입력하면,
$ curl http://192.168.99.100:8008/blocks
우리의 첫 Genesis block을 볼 수 있습니다.
글을 써놓고 나니 정말 재미없는 글이 되어버렸습니다.
다음엔 XO 게임을 이용한 블록체인의 변화, 트렌젝션 등을 살펴보겠습니다.
궁극적으로는 웹브라우저에서 보이도록 만들어야하는데, 얼마나 빠르게 진행될 수 있을지는 장담하지 못하겠습니다ㅠ
先日、IBMのセミナーでhyperledgerの話を聞きました。
"최근 IBM의 세미나에서 hyperledger 이야기를 들었습니다."(구글번역)
좀더 쓰기 편해져야 저같은 아마추어들도 편히 사용할 수 있을 듯 합니다.
죄송합니다. 얼마 전 IBM에서 hyperledger 이야기를 들었습니다. 블록 체인을 활용하여 IBM은 점점 더 강한 기업이 될 것이라고 생각했습니다![2062BEA4-8A0B-4F00-8CD4-7AE2DE70B92F.jpeg](https://steemitimages.com/DQmVPxCx6xTueCxDWmWjFSkkLhjX95ssf9MBz1Tmn4r48zh/2062BEA4-8A0B-4F00-8CD4-7AE2DE70B92F.jpeg)
외계어가 난무해서 이해가 중간에 끊긴 ㅎㅎ 나중에 찬찬히 볼께요!
네 ㅎㅎ뭔가 실제적으로 구현이 되는 모습을 보일 수 있을 때 포스팅 내용도 좀 보기 편해지지 않을까 합니다.
블록체인이라는 것이 온통 알수없는 문자열(해쉬값)들의 나열이라...
Docker의 세계로 오셨군요.. 잘 사용하시면 편리합니다.(주의, 편리함과 함께 지옥이 펼쳐질때도 있습니다.)
sawtooth-default.yaml 파일을 살펴 보았는데 무려 컨테이너를 6개나 띄우는군요.. 그중 가장중요해보이는건 validator 컨테이너인거 같습니다.
http://192.168.99.100 주소는 docker-toolbox에서 실행되고 있는 docker데몬이 할당받은 노트북내에 내부 ip주소입니다. 그래서 localhost (~ 127.0.0.1)로는 접속을 할 수 없었던 것입니다.
그리고 docker exec -it [container_name] [실행 명령어] 구조로 컨테이너에 접속하여 그 내부의 명령어를 실행합니다. 이때 -it를 붙여주지 않으면 실행한 명령어를 통해서 intereactive하게 무엇인가 작업을 할 수 없습니다.
이해하는데 도움이 되셨으면 좋겠습니다.
지옥이라함은 컨테이너가 꺼졌을때일까요?ㅎ 자세한 설명 감사드립니다~! 중간에 막히는일이 생기면 또 여쭙겠습니다 ㅠ