# eosJs 시작하기

## EOSJS 시작하기

#### EOSJS란?

EOS 블록체인을 javascript로 좀더 편하게 컨트롤 할 수 있게 만들어 놓은 라이브러리라고 생각하면 편하다. 살짝만 깊게 들어가면 EOS에서 제공하는(nodeos) HTTP API를 이용하게 편하게 해 놓은 거라고 말 할 수 있다. (이더리움에는 [web3.js](https://github.com/ethereum/web3.js), 네오에는 [neon-js](https://github.com/CityOfZion/neon-js)) 

> EOSJS도 EOS에서 제공하는 HTTP API를 사용하기 때문에 BP들을 잘 선택해야된다.(응답속도, 제공여부 등등)



#### 설치

설치 방법으로는 2가지가 있다.

1. NPM을 통해서 간단하게 설치 할 수 있다.

   ```bash
   > npm install eosjs
   ```

2. CNS를 이용하기

   ```html
   <script src="https://cdn.jsdelivr.net/npm/eosjs@15.0.3/lib/eos.min.js"
           integrity="sha512-QX0dPq5pyX33coEuy5x1UqKHFDeveQYMp7Sz+qOUwRL9mol4QDvViU+QAjd+k6P7QjPjrDCoyhK1kz2GDxCP9A=="
           crossorigin="anonymous"></script>
   ```

   

#### EOS Connect

1. EOSJS를 이용한 EOS Connect

   ```javascript
   const Eos = require('eosjs');
   
   // 아래와 같이 하면 localhost Testnet에 접근한다.
   const eos = Eos();
   ```

   localhost에 EOS가 구동 되어있지 않는다면 위의 코드를 실행하면 아래와 같은 에러가 난다. (당연히 connect하는 EOS의 httpEndpoint가 틀려도 아래와 같은 에러가 나온다.)

   ```json
   { FetchError: request to http://127.0.0.1:8888/v1/chain/get_info failed, reason: connect ECONNREFUSED 127.0.0.1:8888
       at ClientRequest.<anonymous> (/Users/mayajuni/Projects/eos-scan/node_modules/node-fetch/index.js:133:11)
       at ClientRequest.emit (events.js:182:13)
       at Socket.socketErrorListener (_http_client.js:382:9)
       at Socket.emit (events.js:182:13)
       at emitErrorNT (internal/streams/destroy.js:82:8)
       at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
       at process._tickCallback (internal/process/next_tick.js:63:19)
     name: 'FetchError',
     message:
      'request to http://127.0.0.1:8888/v1/chain/get_info failed, reason: connect ECONNREFUSED 127.0.0.1:8888',
     type: 'system',
     errno: 'ECONNREFUSED',
     code: 'ECONNREFUSED' }
   ```

2. Mainnet connect 하기

   ```javascript
   const Eos = require('eosjs');
   
   const eos = Eos({httpEndpoint: 'mainnet httpEndpoint'});
   ```

   아마 위와 같이 connect를 시도 한다면 아래와 같은 에러 메시지가 나온다.
	![connect-error](https://raw.githubusercontent.com/mayajuni/hexo-blog/master/source/images/error.png)

   에러가 나더라도 getInfo는 가능하네 이걸 통해서 chainId를 확인해서 넣자. 

   > Mainnet인 경우는 aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906 이것이 공통으로 쓰는 chainId이기 때문에 넣으면 된다.



위와 같은 방법으로 connect를 하면 아래와 같이 최초 1회 get_info api를 호출한다. (처음에 이것도 모르고 매번 커넥트를 줬더니 모바일에서 데이터 사용량이 아주 높게 나온적이 있다.)

![network-image](https://raw.githubusercontent.com/mayajuni/hexo-blog/master/source/images/net.png)

> 메인넷 주소는 https://api.eosnewyork.io 여기에서 확인 해 볼 수 있다. BP들마다 제공하는 정보의 양, 응답속도 등등이 다르기 때문에 확인을 해서 본인에게 가장 잘 맞는 BP를 찾는 것이 좋다.(혹은 본인이 직접 full node를 받아서 연결하는 방법도 있다.)



###### Connect Config

```javascript
const Eos = require('eosjs');

const config = {
  chainId: null, // 32 byte (64 char) hex string
  keyProvider: ['PrivateKeys...'], // WIF string or array of keys..
  httpEndpoint: 'http://127.0.0.1:8888',
  expireInSeconds: 60,
  broadcast: true,
  verbose: false, // API activity
  sign: true
};

const eos = Eos(config);
```

이부분의 자세한 내용은 github에 있으니 여기에서 확인하면 된다.([github-configuration](https://github.com/EOSIO/eosjs#configuration))



#### getInfo - api

EOS의 기본 네트워크 정보를 가지고 올 수 있다. 코드는 아래와 같다.

```javascript
const eos = Eos().getInfo((error, info) => {
    console.log(error, info);
});
```

> 재미 있는 것은 다른 api들은 전부 Promise를 기본으로 하는데 getInfo만 callback방식이다.

리턴된 값은 아래와 같다.

```json
{
    server_version: '36a043c5',
    chain_id:
        'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906',
    head_block_num: 5469047,
    last_irreversible_block_num: 5468711,
    last_irreversible_block_id:
        '00537227a657d1f4fd74de877e9ad1a3839540ece45eedeaf177b20e51b2da1b',
    head_block_id:
        '005373770504c59e992214b3056c7bdabb07c53c5a9c4785909b90fe595a119f',
    head_block_time: '2018-07-12T08:58:05.500',
    head_block_producer: 'helloeoscnbp',
    virtual_block_cpu_limit: 200000000,
    virtual_block_net_limit: 1048576000,
    block_cpu_limit: 199900,
    block_net_limit: 1048576
}
```

위에서(EOS Connect) 애기 했던 chainId를 모를 경우 getInfo를 통해서 chainId를 얻어서 쓸 수 있다.

이번 글에서는 설치, connect, getInfo만 첫 걸음이라는 생각으로 가볍게 알아보았다.
