develop custom_top_html:no
default debug random = 4 / type = READ / detected = READ

안녕하세요.

쌩광부입니다.

 

#3. 계정 잔액 확인하기

 

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

 

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

ini_set('display_errors', 'On');

 

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"

  }

}

 

위와 같이 나오면 정상입니다.

물론 정상적인 잔액이 나오려면 노드에서 모든 블록이 동기화되어야 하는데요.

이더소셜의 경우 서버 성능에 따라 틀리지만 수십 분 이내에 동기화가 완료됩니다.

 

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

감사합니다.


[알림: 이 게시글은 관리자에 의해 ''에서 '개발'로 이동되었습니다]
8,411

쌩광부님의 서명

댓글 4
default debug random = 0 / type = READ / detected = READ

List of Articles
번호 분류 제목 추천 수 조회 수 글쓴이 날짜
1720 개발 취미로 비트멕스 트레이딩봇 개발중입니다.    제 경우는 개발경력보다 주식경력이 더 길고, 프로그래밍 배울때부터 자동매매봇을 만들고 싶은 마음이 항상 있었는데 작년10월쯤부터 본격적으로 개발에 착수해서 퇴근후에 업데이트와 테스... 4 file 0 5158
제타마인드
2020.02.27
1719 질문 빗썸 API 질문드립니다 안녕하세요 현재 업비트 전용 펌핑알람 &quot;Bitpump&quot; 개발중인 1인 개발자입니다. https://play.google.com/store/apps/details?id=bitpump.isi.com.bitpump 다운로드수는 1천회 넘었고 사용자분들... 1 3275
printf
2020.02.25
1718 개발 CAAT Bot Standard (자동매매) 테스터를 모집합니다 (개인/그룹) 안녕하십니까 BigK 입니다.   여러 시행착오와 검증을 거쳐 드디어 유저 테스트 단계까지 오게 되었습니다. 그동안 땡글 유저들을 통해 정보 공유를 받으면서 많은 도움을 받았습니다. 처음 모집... 15 file 1 2266
CAATBot
2020.02.21
1717 질문 react-native run-android 실행 오류를 해결하고자 합니다. info Running jetifier to migrate libraries to AndroidX. You can disable it using &quot;--no-jetifier&quot; flag. Jetifier found 864 file(s) to forward-jetify. Using 12 workers... info Startin... 5 0 2073
uurjjo
2020.02.14
1716 개발 자동 트레이딩을 웹 서비스로 만들때 어떻게 해야 좋을까요      안녕하세요.  선배님들  문의 좀 드릴게 있는데요.      1. 자동 트레이딩을 웹 서비스 형태로 만들어 보려하는데요.    python/django 로 할려고요.    샘플 소스코드(python/django)가 있... 1 0 1337
부자아들
2020.02.12
1715 질문 리플 관련 질문드려요     리플 노드를 구축해서 운영해보려고 하는데  키페어 생성까진 원활하게했는데 account_id가 따로 또 있어야하더군요  이거는 어디서 얻는건지 혹시 알수있을까요? api 문서 조회해도 안보이... 0 1313
페어
2020.01.10
1714 개발 타키온 프로젝트 개발 소스가 일부 공개되었네요.       https://github.com/tachyon-protocol 빗썸에 상장된 IPX 토큰으로 유명한  블록체인 인터넷 프로토콜 '타키온'의 깃헙입니다.   타키온은 주로 프로젝트 개발에 Go 언어를 사용하는데요, ... file 0 1471
아수라발발타KYC
2019.12.30
1713 개발 추세선 알고리즘과 개발코드 질문   추세선 매매법은 익히 잘 알려져 있습니다. 현재 저는 그러한 매매법을 시스템트레이딩으로 구현해보고자 하는데요. 코드로도 분명 구현이 가능할 것으로 보입니다. 예를 들면 두 점을 잇는 직... 5 1 1821
CAATBot
2019.12.29
1712 질문 업비트 Open API 암호화폐 출금주소 에러   혹시 리플이나 이오스 업비트 OpenAPI 에 출금주소 등록 정상적으로 하신 분 있나요?   잘 사용중인 주소인데 등록하려고 하면 올바른 주소가 아닙니다라는 에러가 뜨네요...                 ... 0 1372
lkjdf
2019.12.28
1711 개발 ETH 풀노드 구축후 datadir 사이즈는 사용하면 할 수 록 커집니다. 적어도 1T ssd 쓰셔야 해요.   ETH 풀노드 구축후 datadir 사이즈는 사용하면 할 수 록 커집니다   풀노드 구축후 이제는 1T ssd 에 풀노드를 올리셔야 합니다.   최근 작업했던 다수의 프로젝트에서 ETH 풀노드 datadir 폴... 1 1 1346
김대박
2019.12.26
1710 질문 고팍스 API 암호화폐 출금?   고팍스 API를 보고 있는데 출금에 대한 예제가 없네요.   혹시 코인원처럼 고팍스도 API로는 암호화폐 출금이 불가능한가요?                 0 1103
skeee01
2019.11.30
1709 개발 V SYSTEMS 테스트넷 접속 방법입니다.   VSYS의 슈퍼노드 후보로 등록한 홍콩의 마이닝풀 Forbole에서는 미디엄 블로그를 통해 VSYS의 테스트넷 액세스 방법을 공유하였습니다.    출처: https://medium.com/forbole/joining-v-system... file 2 949
아수라발발타KYC
2019.11.27
1708 개발 홍보글은 아니고 private blockchain 개발에 참조하시라고 올립니다      private blockchain은 폐쇄돼있어 회사 관계자 외에는 장부를 아무도 못봅니다 은행들이 이 private blockchain 방식을 취하고 있고 국제 국내 은행들은 이런 방식을 취할 수밖에 없습니다 ... 4 2 467
핵심코어보기
2019.11.26
1707 질문 EOS 에서 RAM,CPU,NET 에 EOS 할당후 서비스 접을 때 EOS 를 다시 빼올 수 있나요?     최근 EOS 토큰을 제작하고 잘 사용하고 있습니다.   최근 EOS 토큰 발송이 실패될 때가 있습니다. 그래서 RAM,CPU,NET 이 부족해서 100만원  EOS 는 더 투입하였습니다. 그런데 또 간혹 발생... 1 2 801
김대박
2019.11.26
1706 개발 [질문]지갑 언락 프로세스 진행 시 결과 값이 null 으로 나오는 경우 어떻게 처리 하면 되는지 질문드립니다. 안녕하세요.  web3j 으로 지갑을 현재 만들고 있습니다.  문의 점이 두가지 정도가 있는데요..  1.질문 내용 1) web3j.personalUnlockAccount 함수 결과값이 null 으로만 나옵니다..ㅠㅠ 2) pers... 1 0 650
jun98
2019.11.25
1705 질문 [질문] EOS 트랜잭션 데이타값 가져오기? 이오스 전자웹지갑을 제작하였습니다.   트랜잭션 데이터를 가져오기 위해서 cleos 로 BP 들의 URL 을 활용하였는데 이게 언젠가부터 없어지기 시작하더니 서비스가 종료가 되었네요. 여러분들은... 6 0 805
김대박
2019.11.16
1704 질문 블록체인 관련 지식을 많이 가지고 있으신 프로그램 개발자 혹은 앱개발자 분들의 고견듣고 싶습니다. 안녕하세요 ..  지금 파주에서 코인이 오르기만을 기다리고 있는 채굴러입니다.  코인을 채굴을 하고 있지만 블록체인에 대한 이해도는 참 답답할만큼 없습니다.      제가 프로그램에 지식이 전... 4 1 978
휘리릭릭릭릭
2019.11.10
1703 개발 Geth v1.9.7 (Quad Kicker) 릴리스 Geth 1.9.7이 나왔다는 소식입니다   블록 9,069,000 // 12월 4일경이 될거라는군요~   이하 현재 이더리움 1.x개발 수장이 남긴 트윗을 같이 참고하시기 바랍니다. Geth v1.9.7 (Quad Kicker) o... 1 814
ethminer
2019.11.08
1702 질문 이더리움 2.0이 되면 현재 보유중인 이더와 토큰에 영향이 있나요? 이더리움 2.0이 되면 현재 보유중인 이더와 지갑주소, 그리고 보유중인 토큰에 영향이 있나요?   예를들자면, 이더리움과 ERC 기반의 토큰에 아래에 해당하는 영향이 있는지 문의 드립니다     1... 2 1 1416
he123
2019.11.07
1701 개발 웹지갑을 만드려는데 질문좀 드립니다~ 라이트코인 포크뜬 알트코인입니다...   bitcoinjs를 사용해서 웹지갑을 만드려고 하는데 알트코인이다 보니 네트워크 쪽에 값을 적어줘야 연동이 될거 같은데...   잘 모르겠더라고요ㅠㅠ   혹... 2 2 1312
김깡
2019.10.31
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 92 Next
/ 92
default debug random = 0 / type = READ / detected = READ