[강좌] 이더소셜 PHP API 서버 만들기 #3. 계정 잔액 확인하기

in topmining •  6 years ago  (edited)

안녕하세요.
쌩광부입니다.

우선 이더소셜 노드에서 잔액을 읽어오기 위해 노드를 설치해야합니다.

1. 이더소셜 노드 설치하기

이더소셜 노드의 빌드를 위해 필요한 패키지들을 설치하고 설정합니다.
이더소셜 또는 이더리움 코인의 경우 대부분 golang 프로그래밍 언어를 사용하므로 golang도 설치해야 합니다.

sudo apt-get install -y build-essential
cd ~
wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
tar zxvf go1.11.linux-amd64.tar.gz
sudo mv go /usr/local

export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

재부팅시에도 golang을 사용하려면 아래 .profile 파일 맨 하단에 아래 두 줄을 입력합니다.

vi ~/.profile

export PATH="$PATH:/usr/local/go/bin"
export PATH="$HOME/.yarn/bin:$PATH"

이제 이더소셜 노드를 다운 받고 빌드합니다.

cd ~
git clone https://github.com/ethersocial/go-esn
cd go-esn
chmod 755 build/*
make gesn
sudo cp ~/go-esn/build/bin/gesn /usr/local/bin/

screen을 이용해 별도의 터미널에서 이더소셜 노드를 실행합니다.

screen -S gesn1
gesn --cache=1024 --rpc --rpcaddr 127.0.0.1 --rpcport 9545 --rpcapi "eth,net,web3" console

screen 터미널에서는 Ctrl + a, d로 빠져나오면 실행중인 노드가 중단되지 않고 계속 백그라운드로 작동됩니다.

2. 필요한 PHP 패키지 설치

지난 강좌에서 얘기한대로 composer를 이용해 필요한 PHP 패키지를 설치합니다.
이더리움 계열 코인들은 소수점 18자리까지 정확하게 처리하여야 하므로 BigInteger, BigDecimal 클래스를 사용해야 하는데요.
저희는 Brick/Math를 이용합니다.

cd /var/www/html
composer require Brick/Math

위와 같이 Brick/Math을 패키지를 설치합니다.
Apache2를 설치하면 기본 홈 디렉토리가 /var/www/html 이기 때문에 그곳으로 이동해서 composer를 실행합니다.

3. api-config.php 파일을 만듭니다.

전체 소스는 아래 링크에서 확인하세요.
https://github.com/topmining/ethersocial-php-api

노드의 RPC 주소와 포트를 입력합니다.

<?php
$api_host = "127.0.0.1";
$api_port = 9545;

4. json-rpc.php 파일을 만듭니다.

curl을 이용해 JSON-RPC 호출 함수를 만듭니다.

<?php
function getEtherRpc($host, $port, $method, $params, $id) {
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $host);
  curl_setopt($ch, CURLOPT_PORT, $port);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
  curl_setopt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, '{"jsonrpc":"2.0","method":"'.$method.'","params":['.$params.'],"id":'.$id.'}');

  $ret = curl_exec($ch);
  curl_close($ch);

  return $ret;
}

JSON-RPC에 대한 자세한 사항은 아래 링크를 참고하세요.
https://github.com/ethereum/wiki/wiki/JSON-RPC

5. get_balance.php 파일을 만듭니다.

노드에서 잔액을 읽어옵니다.

<?php
require "json-rpc.php";
require "api-config.php";
require __DIR__."/vendor/autoload.php";

use Brick\Math\BigDecimal;
use Brick\Math\BigInteger;
use Brick\Math\RoundingMode;

header('Content-type: application/json');

$account = $_GET['account'];

$id = 1;
$json = getEtherRpc($api_host, $api_port, 'eth_getBalance', '"'.$account.'", "latest"', $id++);
$data = json_decode($json, true);
$value = $data["result"];
$value = str_replace("0x", "", $value);
$wei = BigInteger::parse($value, 16);
$ether = BigDecimal::of($wei)->dividedBy("1000000000000000000", 9, RoundingMode::DOWN);
$balance = "$ether";

$result = array();
$result["result"] = array("balance"=>$balance);
echo json_encode($result);

간단하죠?
미리 만들어둔 getEtherRpc 함수를 이용해 노드에 eth_getBalance를 호출하고 hex값으로 되어있는 잔액을 읽어와서 Json형태로 출력하는 내용입니다.

require "json-rpc.php";

require를 이용해 필요한 파일들을 로드하고요.

use Brick\Math\BigDecimal;

use를 이용해 사용할 클래스를 지정합니다.

$json = getEtherRpc($api_host, $api_port, 'eth_getBalance', '"'.$account.'", "latest"', $id++);

지정된 IP와 포트로 JSON-RPC를 호출합니다.
eth_getBalance는 잔액을 가져오는 요청합니다.

$wei = BigInteger::parse($data["result"], 16);
$ether = BigDecimal::of($wei)->dividedBy("1000000000000000000", 9, RoundingMode::DOWN);

이더리움의 경우 내부적으로 wei 단위(1 ether = 1000000000000000000 wei)를 사용하기 때문에 BigInteger, BigDecimal을 사용해 소수점 9자리(gwei 단위)까지 표시하도록 합니다.

$balance = "$ether";

PHP 해본분들은 다 아실텐데요. 문자열안에 변수를 넣으면 그 변수가 바로 문자로 변경되어 저장됩니다.
매우 유용한 기능이죠.

결과값을 확인해볼까요?

http://서버주소/get_balance.php?account=지갑주소
{
  "result": {
    "balance": "100.000000000"
  }
}

위와 같이 나오면 정상입니다.
물론 정상적인 잔액이 나오려면 노드에서 모든 블록이 동기화되어야 하는데요.
이더소셜의 경우 서버 성능에 따라 틀리지만 수십 분 이내에 동기화가 완료됩니다.

이상으로 이번 강좌를 마치도록 하겠습니다.
감사합니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!