Embedded Blockchain

라즈베리파이를 Private Blockchain의 Geth 클라이언트 노드로 만들기 1

예전에 사놓은 라즈베리파이 보드. 엄밀히는 라즈베리파이 보드 짝퉁인 오렌지 파이라는 녀석을 가지고 있습니다. 한참 라즈베리파이로 뭐 하는게 유행할 때라, 싸게 하나 구입해 놨었죠. 배송비 포함 $32에 구입한거 같습니다. 라즈베리파이보다 저렴하죠. 오렌지 파이말고, 바나나 파이 등등 많은 파이들이 있죠~


출처

오늘은 이 녀석에 Geth를 설치하고, 사설 블락체인 서버처럼 사용하는 방법을 설명해 보겠습니다.

발단

블락체인 스터디하면서, Geth 클라이언트가 필요해졌습니다. 모든 스터디원이 Geth 클라이언트 설치가 어려운 상황이어서 서버처럼 노드를 만들어 보기로 한게 이 포스팅의 발단입니다.

또 하나는 예전에 @twinbraid님의 QTUM 지갑만들고 Staking하는 글을 본적이 있는데, 그것도 좀 해보고 싶어서 오렌지 파이를 좀 만지작 하던 참에 Geth 노드까지 만들어 보게 됐습니다.
라즈베리파이에서 큐텀지갑 스테이킹해보자 01

!주의

한가지 짚고 넘어가야 할 것은 여기서의 geth 노드는 public blockchain 데이터와 싱크하지 않고, private blockchain으로 만들어 사용할 것입니다. 인터넷 찾아보면 대부분 라즈베리 파이를 public blockchain 노드로 만드는 방법들이 검색되고 private blockchain으로 만드는 방법은 별로 검색이 안됩니다. 그래서 좀 힘들었네요.

private blockchain을 만든다는 것은 publich chain과는 완전히 별도로 새롭게 블락체인을 만드는 것입니다. genesis 블락부터요. 이렇게 하는 이유는 public blockchain과의 싱크도 필요하고, 메모리도 필요하고 이래 저래 복잡합니다.

Testnet을 쓰면 되지 않냐? 할 수 있는데요, Testnet도 작업하려면 Ether를 받아와야 하고, 이래저래 시간이 소요됩니다. 직접 사설 blockchain을 만들면 뭐든 테스트해보고 맘대로 다 해볼수 있는 것이죠.

1. 개발환경

간략한 개발환경은 다음과 같습니다.

  • Orange pi pc plus
  • Ubuntu 16.04
  • SD Card: 32GB
  • 설치할 Geth Version: 1.5.5

보통은 라즈베리 파이를 많이 쓰실테니 Ubuntu 설치하는 방법은 @skuld2000님의 글을 참고하시면 되겠습니다. 오렌지 파이에 리눅스 설치하는 방법은 다른 글을 참고하시면 됩니다. 여기서는 설치 방법은 생략하겠습니다. 공부차원헤서 직접 찾아서 해보세요~

라즈베리 파이3 로 채굴하기 Part-2 / 기본 셋팅

오렌지 파이에 와이파이 설정까지 하면 아래처럼 전원만 연결하고 구석에 짱 박아 놓을 수 있습니다.

오렌지 마크 보이시죠?ㅎ

2. ARM용 Geth 설치

오렌지 파이나 라즈베리 파이는 CPU가 우리가 흔히 쓰는 인텔 계열 CPU(x86)와 다릅니다. 오렌지 파이와 같은 것들은 임베디드 보드라고 하여 저전력 ARM CPU가 사용됩니다. Geth 소스를 받아서 빌드해보면 컴파일 에러가 발생하더라구요. 그래서 직접 prebuilt 파일을 받아서 적절한 위치에 넣어줘야 합니다.

라즈베리 파이에 Geth 설치 참고 사이트

2.1 Prebuilt Geth 다운로드

아래 사이트를 방문하여 받고자 하는 버전의 파일을 다운로드 합니다.
https://geth.ethereum.org/downloads/
저는 스터디 하는 책과 호환성을 위해 1.5.5 버전을 다운로드 합니다. 원하시는 버전을 다운로드 하시면 됩니다. 주의할 점은 OS와 CPU 부분을 잘 보고 다운로드 하셔야 합니다. 아래 그림 처럼 CPU가 ARMv7인 것을 선택하셔야 합니다. 대부분의 임베디드 보드의 CPU는 ARMv7을 선택하시면 됩니다.

2.2 Geth 실행 파일을 시스템 폴더에 복사

위에서 다운로드 받은 파일의 압축을 풉니다.

$ tar xvf geth-linux-arm7-1.5.5-ff07d548.tar.gz

압축을 풀면 초록색의 geth 실행파일이 나타납니다. 파일이 있는 위치로 이동해서 그것을 아래와 같이 시스템 폴더에 복사해서 어디서든 실행가능하게 해줍니다. 아래에서 ./geth로 입력했는데 .은 현재 디렉터리를 의미합니다. 즉 현재 디렉터리 밑에 있는 geth를 복사하라는 것이죠.

$ sudo cp ./geth /usr/local/bin

2.2 geth 초기화

geth를 설치했으면 초기화 작업이 필요합니다. 크게 두가지 작업이 필요합니다. 하나는 블락체인 데이터를 저장할 위치를 지정하는 것이고, 다른 하나는 genesis 블락을 만들기 위한 설정 파일을 만드는 것입니다.

블락체인 데이터는 기본적으로 ~/.ethereum 디렉터리에 저장되는데, 여기서는 별도로 지정하는 방식으로 하겠습니다. 아래와 같이 적절한 위치에 블락체인 데이터가 저장될 디렉터리를 만듭니다.

$ mkdir -p ~/Blockchain/data_testnet

저는 홈 디렉터리 밑에 Blockchain 디렉터리와 그 밑에 data_testnet이란 디렉터리를 만들었습니다. 이곳을 블락체인 데이터 저장하는데 사용할 것입니다.

그 다음에 위에서 만든 디렉터리 밑에 genesis.json 파일을 만들어 줍니다.

{
       "config": {},
        "nonce": "0x0000000000000042",
        "timestamp": "0x0",
        "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "extraData": "0x0",
        "gasLimit": "0x8000000",
        "difficulty": "0x4000",
        "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "coinbase": "0x3333333333333333333333333333333333333333",
        "alloc": {}
}

제일 처음의 "config": {};부분은 Geth 1.5.5에서는 필요없는데 1.6 이상인가에서는 필수적으로 필요한 부분이라고 합니다.

다 됐습니다. 그럼 이제 geth를 아래와 같은 명령으로 초기화 합니다.

$ geth --datadir ~/Blockchain/data_testnet init ~/Blockchain/data_testnet/genesis.json

위에서 만든 블락체인 데이터 저장 디렉터리와 json 파일을 입력해 준 것입니다.

2.3 geth 실행

그럼 geth 설치는 끝입니다! 쉽죠? 그럼 한 번 실행해 볼까요? geth 옵션은 일단 무시해 주세요.

$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/Blockchain/data_testnet console 2>> ~/Blockchain/data_testnet/geth.log

마지막에 > 콘솔이 나타나면 문제가 없이 동작하는 것입니다. 이제 geth 명령어를 입력하여 계정 생성, 마이닝 등 블락체인 명령을 실행할 수 있습니다.

3. Out of Memory 문제 해결

다 된줄 아셨죠? 저도 다 된줄 알고 좋아했는데, 한가지 난관에 봉착했습니다. 책에서 하듯이 아래와 같이 새로운 계정을 만들어 보려고 했죠. 그런데 말입니다.

3.1 새로운 계정 생성시 오류 발생

> personal.newAccount("pass0")
killed
$

이렇게 그냥 geth가 종료되는 것입니다. 엄밀히 종료가 아니라 프로그램이 죽습니다. 잘 보시면 geth 콘솔을 의미하는 >가 있어야 하는데, killed라는 메시지가 나오고 바로 콘솔이 죽고 리눅스 프롬프트 $가 나오게 된 것입니다. 그런데 personal.newAccount 명령 말고 eth.mining과 같은 명령어는 문제 없이 실행되는 것이었습니다!

좀 당황했는데, 이것저것 찾아보다 도저히 해결이 안되었습니다. 프로그램이 죽을 때 error 메시지라도 있어야 검색에 도움이 되는데 그저 killed라는 것은 거의 도움이 안되었습니다.

그런데 말입니다. geth가 실행되면 log 파일이 저장되는 것을 알게 됐습니다. 심지어 그 위치를 geth 실행할 때 지정해 뒀지 말입니다.

로그 파일인 geth.log를 열어보면 무슨 out of memory라는 에러 내용이 발견될 것입니다. 무슨 out of memory래? 찾아보니 personal.newAccount 명령은 추가적으로 256MB 이상의 메모리가 필요하다는 것을 발견했습니다!

헐. 계정 생성하는 명령어 실행할 때 256MB 메모리가 필요하다니!!! 믿을수는 없었지만, 그래도 해결책이라고 하니 그대로 따라 해봤습니다.

** 해결책은 swap 파일을 만드는 것이었습니다.** 오렌지 파이나 라즈베리 파이는 내부 RAM이 크지 않습니다. geth의 --cache 옵션으로 메모리를 설정할 수 있는거 같은데, 이 값을 크게 해봐야 보드에 설치된 RAM이 작으면 소용이 없는 것이죠. 그래서 해결방법으로 부족한 메모리를 파일 저장공간으로 대체하는 것입니다. 그게 swap 파일 생성인 것이죠.

3.2 리눅스에서 swap 파일 생성

swap 파일 생성 참고 사이트

$ sudo dd if=/dev/zero of=/var/swap bs=1024 count=524288
$ sudo chmod 0600 /var/swap
$ sudo mkswap /var/swap
$ sudo swapon /var/swap

제일 첫 줄이 중요합니다. swap 파일의 이름과 크기를 정하는 것인데요. 먼저 swap 파일의 이름은 /var/swap이라고 했습니다. 그 다음의 bs=1024가 block size의 읽는 단위를 나타내는데 여기서는 1024바이트 즉, 1MB로 설정했습니다. 그 다음 count=524288은 block size의 개수입니다. 즉 여기서는 512MB의 swap 파일을 만드고 싶어서 bs에 512를 곱하면 됩니다. 1024 * 512MB = 524288 block size.

그 다음 swap 파일의 권한을 설정하고 swap 파일을 만들고 swap 파일을 사용 설정합니다.

이제 이렇게 swap 파일을 만들고 geth를 실행한 후 geth.log파일을 보면 아래와 같이 512MB가 할당된 것을 확인할 수 있습니다.

3.3 새로운 계정 생성

그럼 이제 다시 geth 콘솔에서 새로운 계정을 생성해 봅시다.

와우, 위 그림과 같이 새로운 계정이 생성되었습니다. 계정 생성하는데 시간이 좀 오래 걸립니다. 생각해보니 계정 생성하기 위해서 난수 프로그램을 좀 버겁게 돌려야 할 거 같네요. 계정마다 유일한 개인키, 공개키, 주소 등을 생성해야 하니 말이죠. 그래서 계정 생성 명령에 메모리가 많이 필요한가 봅니다.

계정 생성할 때 인자로 준 것이 계정의 passphrase 입니다. 즉 개인키에 접근할 수 있는 암호이죠. 까먹지 않게 주의하세요. 그리고 개발용으로 하는 것이기 때문에 암호를 매우 쉽게 설정한 것이니, 실제 public blockchain에 계정 생성할 때는 암호를 복잡하게 남한테 노출되지 않게 주의가 필요합니다.

PC로 작업했을 때, 전혀 문제 없는 것들이 임베디드로 오면 항상 문제를 일으키네요. 그래도 이렇게 정리하고 공유하면 똑같은 문제에 봉착했을 때 도움이 되겠죠?


서버 구축하기 위한 공유기 설정까지 다루려고 했는데, 분량 및 시간이 너무 소요되어 다음 편에서 포스팅 하도록 하겠습니다. 다음편에서 만나요.

오늘의 실습: 라즈베리 파이, 오렌지 파이와 같은 임베디드 보드는 향후 blockchain의 노드로서 활약하게 될까요?

댓글

댓글 본문