20181119

C++로 만들어진 파일을 컴파일 해 wasm파일로 변환하여 EOS 블록체인에 올려보려 한다.

EOS doc에 C++로 파일 만드는 방법과 eosio-cpp로 컴파일해 wasm 과 abi파일을 만드는 것 까지는 수월하게 해결했는데 set contract를 사용하여 블록체인에 deploy하는 것에 꽤 시간이 걸렸다. 그 이유인 즉슨, 애초에 docker image를 이용하여 node를 돌리고 cleos에 alias를 걸어 docker exec를 수행해 왔는데 그걸 깜박하고 cleos로 local file (wasm파일)에 접근을 하려고 했기 때문이다.

해결방법은

1. 아래의 명령으로를 compile 된 wasm된 파일 혹은 wasm이 포함된 폴더를 docker 컨테이너로 copy 한 후

docker cp <local_file_dir> <imagename>:<docker_dir>

2. 아래 명령으로 docker container에 접속 하고

docker exec -it <imagename> bash

3. docker container bash에서 cleos  set contract 명령어를 수행한다.

cleos -u https://api.eosnewyork.io:443 set contract <account_name> <docker container dir> -p <account_name>@active

docker_container_dir 안에 wasm 파일과 abi파일을 넣어주면 그냥 폴더 위치까지만 입력하면 wasm과 abi를 모두 deploy해준다.

다만 한가지 더 명심할 점은 contract를 deploy할 때 램과 cpu network 가 필요하므로 깡통 account에 올리려 하면 에러가 난다.

EOS는 확실히 다른 코인들과 운영 방식이 다르다. 비트코인이나 이더리움의 경우 블록체인에 어떤 액션을 취할 때 (예를 들면 코인을 송금할 때) 수수료를 부과한다. 하지만 EOS는 그렇지 않다. EOS는 송금할 때 수수료가 부과되지 않는다. 그 대신 계정을 만들 때 RAM, CPU, Network를 확보해야만 한다. 이 3가지 자원들을 확보해 놓아야  EOS 계정을 생성할 수 있다.

여기서 가장 희소성이 있고 귀한 자원은 RAM이다. RAM은 블록체인 내 정보를 저장하거나 수신 또는 송신할 때 필요하다. 다른 두가지 자원과  다르게 RAM은 한번 쓰면 없어지는 소모성 자원이다. 따라서 개발자는 RAM을 구매해야 하며 RAM의 가격은 시장의 수요와 공급에 따라 변동된다.

CPU는 컴퓨팅 시간 단위로 계산된다. A계정에서  B계정으로 EOS를 보내는 액션을 취하면 일정한 시간이 걸린다. 다3일간 사용할 수 있는 시간이  CPU 자원이다. 많은 양의 액션을 취하려면 많은 CPU를 확보해야 한다. 하지만 RAM과 다르게 시간이 지나면 다시 회복된다. 따라서 많은 양의 EOS를 Stake 해놓았다면 많은 양의 액션을 단 기간안에 수행할 수 있는 것이고 그렇지 않고 이미 CPU를 다 써버렸다면 일정 시간을 기다렸다가 액션을 취해야 한다.  Network는 CPU와 유사하지만 시간이 아닌 Byte로 측정된다. Network도 일정시간 이 지나면 다시 사용할 수 있으므로 EOS를 staked해 놓고 사용한다.  계정 주는 언제든 EOS를 staked 했다가 unstaked할 수 있다.

현재 1kb당 램 가격은 0.09 EOS로 보다 많은 EOS Dapp이 개발되면 개발될 수록 이에 대한 수요가 높아져 비싸질 것으로 예상된다.


This post is about how to catch and deal with parameter sent by post method from client.  First of all, you need to download and set up a middleware to achieve the goal.

The middleware's name is body-parser. You install body parser.

$ npm install body-parser --save

Then, set up in your app.js

// add middleware
app.use(bodyParser.json()); //suport json encoded bodies
app.use(bodyParser.urlencoded({extended:true}));//support encoded bodies

Then, play with it like one below. 

/*Ajax post*/
router.post('/postparams',function(req, res){
var receiver_acct = req.body.receiver_acct;
var memo = req.body.memo;
res.send(receiver_acct + " "+ memo);
});
module.exports = router;


This will work.


EOS 블록체인에서는 기존의 블록체인과는 다르게 계정을 만드는 게 좀 까다롭다.  비트코인이나 이더리움 블록체인에서는 간단하게 랜돔한 프라이빗키->퍼블릭키를 생성해 계정으로 사용할 수 있다. 하지만 EOS에서는 퍼블릭키, 프라이빗키와 더불어 account라는 것이 추가되었다. Account는 human-readable characters로서 정확하게 12자리의 알파벳으로 만들 수 있다. 12자 보다 짧아서도 안되고 길어서도 안된다. (물론 12자보다 짧은 account를 얻는 방법이 있긴 하지만 여기서는  언급하지 않겠다.)  그래서 EOS를 전송할 때는 퍼블릭키 대신 어카운트를 사용해 보낸다. 이메일과 비슷한 방식으로 보내기 때문에 외우기도 쉬워 EOS의 장점으로 꼽힌다. 다만, 이 어카운트를 만들 때 약간의 금전(EOS)가 필요하다는 점과  새 계정을 만들 때는 반드시 기존 계정을 이용해서 만들어야 한다는 점은 좀 불편할 수 있다.

위의 내용을 기본으로 하여 이번 포스팅에서는 기존 account가 있는 상태에서 새 account를 만드는 방법을 설명해 보겠다.

위에서 언급하였지만 새 account를 만들기 위해서 돈(EOS)가 든다. 이 부분에 대해 조금 더 설명하자면 비트코인이나 이더리움은 가상화폐를 전송할 때 수수료가 들지만 EOS는 전송 시 수수료는 들지 않지만 계정을 만들 때 돈이 든다. 왜냐하면 블록체인 내의 RAM을 구입해야 하기 때문이다. 간단히 비유하자면 전통적인 서버-클라이언트 구조에서 서버서를 빌릴 때 지불하는 금액으로 생각하면 되겠다. 메모리가 크고 빠른 서버를 구입하기 위해서는 더 많은 금액을 지불해야 하는 것 처럼 EOS 블록체인에서도 용량이 크고 빠른 dapp을 만들기 위해서는 좀 더 많은 EOS를 지불해 많은 컴퓨팅파워를 확보해야한다. 

두서 없이 말했다. 정리하자면 새 account를 만드는데 필요한 것은 아래와 같다.

1. 기존 EOS account

2. 기존 EOS account 내 EOS

기존 account 이름을 existing1234 이라 하고 새로 생성하려는 아이디를 creating1234(public key: EOSXXXX) 라고 하자. 다시 한번 명심해야 할 것은 EOS블록체인의 account 명은 반드시 12글자여야 한다는 점이다. 위 account명이 12자가 아니면 에러가 난다.

cleos를 이용해서 새 account를 만드는 명령어는 아래와 같다.

$ cleos system newaccount existing1234 creating1234 EOSXXX -stake-net "0.1 EOS" --stake-cpu "0.1 EOS" --buy-ram-kbytes 8

이렇게 하면 새로운 계정이 만들어진다. --stake-net "0.1 EOS"의 경우 account의 brandwidth를 0.1 EOS만큼 예치하여 사용 하겠다는 뜻이고 --stake-cpu는 계정의 cpu를 0.1 EOS를 예치하여 사용하겠다는 것이다.  

이상.

Chapter1-2: EOSIO/EOS image 다운 및 설치

전편에서 설명한 Docker를 설치하였다면 이제 docker 명령어를 이용하여 EOS Docker 이미지를 다운 받아 컴퓨터안에 EOS node를 생성할 차례이다. 이 단계가 정상적으로 끝난다면 지금 당신의 컴퓨터 내에 EOS 노드가 생성될 것이고 EOS Mainnet과 통신을 할 수 있게 된다.

1) 간단한 명령어로 Docker eosio 이미지 다운 받기

$ sudo docker pull eosio/eos

2) 그리고 임의의 공간에 contracts라는 폴더를 만든다. 그리고 pwd명령어를 이용해 경로 파악한 후 보관한다. 여기에 EOS관련 계약 등이 담길 것이다.

$ mkdir contracts

$ cd contracts

$ pwd

3) 노드 생성 시키기. CONTRACT_DIR에 위에서 파악한 contracts 폴더의 경로를 대체한다.

$ docker run --name eosio \
  --publish 7777:7777 \
  --publish 127.0.0.1:5555:5555 \
  --volume CONTRACTS_DIR:CONTRACTS_DIR \
  --detach \
  eosio/eos \
  /bin/bash -c \
  "keosd --http-server-address=0.0.0.0:5555 & exec nodeos -e -p eosio --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::http_plugin -d /mnt/dev/data --config-dir /mnt/dev/config --http-server-address=0.0.0.0:7777 --access-control-allow-origin=* --contracts-console --http-validate-host=false --filter-on='*'"

위 명령을 수행하면 로컬노드가 생성된다. 그러나 아직  Development용으로 실제 EOS Mainnet과 연결되지 않았다. 실제 Mainnet과 연결하려면 아래의 명령을 수행한다.

$ docker run --rm --name eosio -d -v ~/eosio-wallet: /root/eosio-wallet eosio/eos-dev/ bin/bash -c 'keosd'

그리고 cleos 단축키 만든다. 리눅스의 경우 "bashrc"파일에 아래의 문구를 삽입한다.


alias cleos='docker exec -it eosio /opt/eosio/bin/cleos --url http://127.0.0.1:7777 --wallet-url http://127.0.0.1:5555'

4) 실제 EOS Mainnet 과 연결되었는지 확인하기

$ cleos get info

위 명령을 수행하면 json파일 형식이 리턴 되는데 head_block_producer가 eosio로 되어 있으면 현재 메인넷과 연결이되지 않은 상태이고 eosio가 아닌 eoslaomaocom 등 이 나타난다면 정상적으로 EOS Mainnet과 연결된 것이다.

여기까지 정상적으로 끝냈다면 일단 컴퓨터에 EOS 노드가 만들어진 것이다. 다음에는 EOS 스마트 계약을 만들 수있는 CDT를 설치하도록 하자.

요새 이 쪽 바닥에서 핫하다는 EOS Blockchain 플랫폼을 맛보기 위한 작업에 착수하였다. 일단 관련 documentation과 인터넷 기사를 읽어보았다. 가장 눈에 띄는 사실은 블록체인 플랫폼인데 기존 centralized platform처럼 빠른 속도를 지향한다는 점이다. 예전 이더리움 플랫폼으로 무언가 만들어보려던 나는 너무 느린 속도에 상품성이 없을 거 같아서 중단한 적이 있다. 그런데 이더리움의 대항마로 혜성처럼 나타난 EOS는 그런 단점을 해결해 줄 수 있을 것 처럼 보인다.

지식이 거의 전무한 C++를 익혀야 된다는 사실이 좀 마음에 걸리지만 그냥 시작해 보기로 결심하였다.

Chapter 1-1 : Docker 설치하기

모든 개발작업이 그렇듯 EOS Dapp을 만드려면 개발 환경을 만들어주어야 하는데 그 첫번째는 Docker를 설치하는 작업이다. 혹시 모르는 독자들을 위해 Docker에 대해 설명이 잘되어 있는 블로그 페이지를 소개한다.

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

참고로 나는 Ubuntu 18.04 를 사용하고 있다.

1) 패키지 업데이트와 시스템 업그레이드

$ sudo apt update

$ sudo apt upgrade

2) 필수 dependency 설치

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

3) Docker's GPG 키와 repository 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

4) 여기까지 하면 Docker repository 모두 설치완료 되었다. 그리고 다시 apt 패키지 업데이트 및 최신버전 Docker CE(community Edition) 설치하면 끝...

sudo apt update
sudo apt install docker-ce

5) Docker 버전 체크

docker -v

현재 기준 Docker의 최신 버전은 18.06.1 이다.

여기까지 하면 개발환경 구성 첫번째 단계인 Docker설치가 끝난다.


+ Recent posts