9_P_B_T2//home/ddenglecom/www//

안녕하세요.

쌩광부입니다.

 

지난 강좌

https://steemit.com/@topmining

https://www.ddengle.com/@TopMining

 

전체 소스

https://github.com/topmining/ethersocial-php-api

 

이번 강좌는 블록을 읽어서 트랜잭션을 데이터베이스에 저장하는 과정입니다.

이더리움의 블록 구조는 지난 시간에 설명을 했으니 참고해주시고요.

 

먼저 MySQL의 아래 2개의 테이블을 생성합니다.

 

CREATE TABLE `block` (

  `blocknumber` bigint(20) NOT NULL,

  `timestamp` bigint(20) DEFAULT NULL,

  `blockhash` varchar(66) DEFAULT NULL,

  `transactions` int(11) DEFAULT NULL,

  PRIMARY KEY (`blocknumber`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

CREATE TABLE `txaccount` (

  `hash` varchar(66) NOT NULL,

  `fromaddr` varchar(42) DEFAULT NULL,

  `toaddr` varchar(42) DEFAULT NULL,

  `timestamp` bigint(20) DEFAULT NULL,

  `blocknumber` bigint(20) DEFAULT NULL,

  `blockhash` varchar(66) DEFAULT NULL,

  `txindex` int(11) DEFAULT NULL,

  `gas` decimal(65,0) DEFAULT NULL,

  `gasprice` decimal(65,0) DEFAULT NULL,

  `value` decimal(65,0) DEFAULT NULL,

  `input` text,

  `v` varchar(22) DEFAULT NULL,

  `r` varchar(82) DEFAULT NULL,

  `s` varchar(82) DEFAULT NULL,

  `nonce` varchar(22) DEFAULT NULL,

  PRIMARY KEY (`hash`),

  KEY `idx_from` (`fromaddr`,`blocknumber`),

  KEY `idx_to` (`toaddr`,`blocknumber`),

  KEY `idx_block` (`blocknumber`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

block 테이블에는 블록에 대한 기본 정보들을 저장합니다.

큰 의미는 없지만 마지막으로 몇 번째 블록을 읽었는지를 확인합니다.

 

txaccount 테이블에는 트랜잭션 내용을 저장합니다.

 

지난 강좌에서 만들었던 api-config.php 파일에 아래 내용을 추가합니다.

 

$mysql_host = "127.0.0.1";

$mysql_user = "esnapi";   // YOUR ID

$mysql_pass = "1234";     // YOUR PASSWORD

$mysql_database = "ethersocial";

 

MySQL 접속을 위한 정보인데요.

이 부분은 알아서 수정하시는 센스! 

 

또 지난 강좌에서 만들었던 json-rpc.php 파일에 아래 내용을 추가합니다.

 

function getEtherRpcMulti($host, $port, $list) {

    $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);

 

    $data = "[";

    $n = 0;

    foreach($list as $item) {

        if($n > 0) $data .= ",";

        $data .= '{"jsonrpc":"2.0","method":"'.$item['method'].'","params":['.$item['params'].'],"id":'.$item['id'].'}';

        $n++;

    }

    $data .= "]";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

 

    $ret = curl_exec($ch);

    curl_close($ch);

 

    return $ret;

}

 

기존에 getEtherRpc 함수를 만들어서 사용했었는데요.

이번에는 getEtherRpcMulti 함수를 추가해서 JSON RPC를 동시에 여러개를 호출할 수 있게합니다.

블록이 많아지는 경우 매우 많은 호출을 해야되기 때문에 1건씩 호출하면 매우 느립니다.

그렇기 때문에 이 함수를 만들어 좀 더 빠르게 호출할 수 있습니다.

 

이제 본격적인 코딩을 위해 read_block.php 파일을 만듭니다.

전체 소스는 아래 링크를 확인해주세요.

 

https://github.com/topmining/ethersocial-php-api/blob/master/read_block.php

 

소스를 한줄 한줄 설명하겠습니다.

 

use Brick\Math\BigInteger;

wei 단위의 매우 큰 이더리움의 숫자를 처리하기 위해 BigInteger를 이용합니다.

 

$json = getEtherRpc($api_host, $api_port, 'eth_blockNumber', '"latest"', $id++);

eth_blockNumber 명령을 호출해서 현재 블록체인의 마지막 블록이 몇 번인지를 확인합니다.

 

$tonumber = hexdec($data['result']);

결과값이 Hex값이기 때문에 10진수로 변경합니다.

 

$conn = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_database);

MySQL에 연결합니다.

 

if($query = $conn->query("select max(blocknumber) from block"))

block 테이블에서 저장된 최종 블록을 읽어옵니다.

저희는 read_block.php 파일을 지속적으로 실행시켜서 저장된 최종 블록 이후에 생성된 블록을 읽어와 저장하게 됩니다.

 

$blocknumber=$fromblock;

while($blocknumber<=$tonumber)

$fromblock은 기존에 block 테이블에 저장된 최종 블록입니다.

$tonumber는 블록체인에 저장된 최종 블록입니다.

즉, $fromblock에서 $tonumber까지 반복해서 블록을 확인하기 위함이죠.

 

$list = [];

for($i=0; $i<100; $i++) {

  if($blocknumber > $tonumber) break;

  $list[] = array(

    "method" => "eth_getBlockByNumber",

    "params" => '"0x'.dechex($blocknumber).'", true',

    "id" => $id++

  );

  $blocknumber++;

}

RPC 명령을 100개씩 배열에 넣습니다.

 

$json = getEtherRpcMulti($api_host, $api_port, $list);

위에 만들어 놓은 getEtherRpcMulti 함수를 이용해 블록 정보를 읽어옵니다.

 

foreach($datas as $data)

결과값을 순차적으로 읽습니다.

RPC를 Multi로 호출하면 배열 형태로 값을 가져올 수 있습니다.

 

foreach($transactions as $tr)

블록에는 여러개의 트랜잭션이 저장되기 때문에 반복해서 읽습니다.

 

$value = BigInteger::parse(str_replace("0x", "", $tr['value']), 16);

이더리움의 숫자 단위는 wei라는 10의 18승 이라는 엄청나게 큰 값이므로 기존 integer로는 처리할 수가 없습니다.

그렇기 때문에 BigInteger를 이용하는 거죠. ^^

 

if(strcasecmp($fromaddr, "0x2f16af67dbd141c53beb03a533de6ab3bd0e69df") == 0) continue;

이 부분은 생략해도 되는 부분입니다만.

이더소셜의 경우 지난번 트랜잭션 공격이 있었는데요.

위 주소에서 의미없는 엄청나게 많은 트랜잭션을 발생시켜 문제가 되었죠.

그렇기 때문에 해당 주소의 경우는 아예 테이블에 저장하지 않는게 좋습니다.

DB 용량을 엄청나게 줄일 수 있죠.

 

$sql = "insert into txaccount ... on duplicate key update ...

테이블에 저장하기 위한 쿼리를 만듭니다.

이때 on duplicate key update 쿼리를 만들어 중복되는 경우 새로 insert되지 않도록 합니다.

 

$sql = "insert into block ... on duplicate key update ...

트랜잭션 저장이 완료되면 블록을 저장합니다.

이때도 마찬가지로 on duplicate key update 쿼리를 만들어 중복 방지는 필수!

 

코딩을 마쳤으면 한번 실행해볼까요.

우분투 콘솔창에서 read_block.php 파일이 있는 곳으로 이동 후 아래와 같이 입력합니다.

물론 MySQL이 실행중이며 위에 설명한 테이블이 만들어져 있어야 하고요.

또한 gesn도 실행중인 상태여야 겠죠.

 

$ php read_block.php

Current block height: 2602588

Block: 100

Block: 200

Block: 300

Block: 400

...

 

위와 같이 나오면 성공!!

100 블록씩 읽어서 DB 테이블에 저장하는 과정입니다.

2602588 블록까지 저장되면 중지되는데요.

아주 많은 시간이 걸립니다.

일단은 최종 블록까지 저장될때까지 기다리셔야 되고요.

그 이후에는 crontab을 이용해 주기적으로 새로 생성된 블록을 기록해야합니다.

 

crontab에 대해서는 아래 링크를 확인하세요.

https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab

 

오늘 강좌는 끝~~

다음 시간에는 계정별로 저장된 트랜잭션을 읽는 API를 만들겠습니다.

 

그럼 다음 강좌도 많이 기대해주세요~~

 

 

 

-------------------------------------

꼬리말

* 게시글 내용 삭제레벨 강등

* 질문은 각 주제별 게시판에 적어주세요.

 

비트코인 암호화화폐 커뮤니티 땡글~ 땡글~

-------------------------------------

757 CASH

Who's 쌩광부

profile

이더소셜(ESN) 채굴풀 (Pool fee 0.5%)

https://esn.topmining.co.kr

칼리스토(CLO) 채굴풀 (Pool fee 0.5%)

https://clo.topmining.co.kr

펄(PIRL) 채굴풀 (Pool fee 0.5%)

https://pirl.topmining.co.kr

메타버스(ETP) 채굴풀 (Pool fee 0.5%)

https://etp.topmining.co.kr

폴엠(FLM) 채굴풀 (Pool fee 0.5%)

https://flm.topmining.co.kr

 

디스코드 https://discord.gg/sjwKhaS

페이스북 https://www.facebook.com/topmining.co.kr

트위터 https://twitter.com/TopMining

댓글 2

List of Articles
번호 분류 제목 추천 수 조회 수 글쓴이 날짜
공지 [ESN 300만 블록 기념 이벤트] 124 updatefile 21 4716
ESN운영
2019.04.19
공지 Seedblock 게시판을 신설합니다. 3 file 1 647
땡글운영위원회
2019.04.19
[AD] [AD] 신개념 커뮤니티 개판을 소개합니다. 7 updatefile 2 984
관리자
2019.04.16
1590 개발 [강좌] 이더소셜 PHP API 서버 만들기 #7. 트랜잭션 내역 확인하기 안녕하세요. 쌩광부입니다.   지난 강좌 https://steemit.com/@topmining https://www.ddengle.com/@TopMining   전체 소스 https://github.com/topmining/ethersocial-php-api   이번 강좌는 지난 강좌에서 저장한 ... 3 504
쌩광부
2019.02.27
1589 질문 quorum 관련해서 도움 얻을 수 있는 곳이 있을까요?   quorum에 대해서 공부좀 해볼려고 하는데 정보가 너무없네요...   혹시 관련 개발 정보 나와있는곳 아시는 분 계시면 답변 좀 부탁드립니다.(__);;   답변 감사합니다.                     ----------------------... 222
로텔
2019.02.27
1588 질문 이더리움 동기화를 하면서 이런 에러 겪어보신분 계신가요? 이더리움 테스트넷(롭스텐)블록을 동기화 하던 중 아래와 같은 에러 때문에 동기화 더이상 진행이 안되는 문제가 발생했는데 해결 방법이나 이 에러가 왜 발생하게 되는건지 원인을 알 수 있을까요?   Section proces... 3 576
나비잠
2019.02.27
1587 질문 알트코인 빌드하고 테스트넷 돌리는데 코인전송에서 The Transaction was rejected!   the transaction was rejected this might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but marked as spent he... 6 file 556
hifivefootball
2019.02.26
1586 질문 Blockchain explorer를 만들어 보고 싶습니다. 글쓰기가 가능해져서 처음으로 글 남겨봅니다. Blockchain explorer를 만들고자 합니다만, Insight이외에 추천해주시만할것이 있나요? levelDB를 Postgresql이나 오라클로 이행하는 방법은 난이도가 높을까요? -----... 4 589
ohworld5
2019.02.26
» 개발 [강좌] 이더소셜 PHP API 서버 만들기 #6. 트랜잭션 기록하기 안녕하세요. 쌩광부입니다.   지난 강좌 https://steemit.com/@topmining https://www.ddengle.com/@TopMining   전체 소스 https://github.com/topmining/ethersocial-php-api   이번 강좌는 블록을 읽어서 트랜잭션... 2 7 952
쌩광부
2019.02.24
1584 개발 사이드 프로젝트로 자동매매 프로그램 함께 만들어 봅시다.   각 거래소의 오픈 api 를 이용하여 자동매매 프로그램을 만들어 봅시다. 프로그램은 제가 만들테니 기획은 이글을 읽는 분이 해주세요. 기획이라고 해서 거창한건 아니고요.  이렇게 이렇게 화면이 되고 이런 기능... 776
헬로월드
2019.02.24
1583 질문 스마트폰 앱 개발하시는 분께 질문이 있습니다. 구상하는하고 있는게 있는데 현재 아이디어 수준입니다. 제가 앱개발은 전혀 몰라서 질문좀 드릴려구요.   어떤 블루투스 디바이스가 있고 이 디바이스는 스마트폰과 블루투스로 통신하면서 약1분 주기로 특정포맷의 ... 20 1054
꿀맨
2019.02.22
1582 질문 이더리움 동기화모드를 full로 하신분 계신가요? 이더리움 동기화모드를 fast로 하지 않고 full 로 할경우 현시점에 블록데이터 크기가 어떻게 되는지 알수 있을까요? 혹은 알 수있는 방법이 있을까요?                       -------------------------------------... 7 769
나비잠
2019.02.21
1581 질문 G MAIL도 못 믿을 듯     코인을 G MAIL에 연동시켜 두신 분 많은 것 같은데 해커놈이 어떻게 흔적도 없이 비번을 바꿔놓고 발자국을 다 지웠을까요? 잘 찾아보면 발자국을 찾을 수 있을까요?   구글봇은 MAC주소를 자동수집해서 새로운 ... 4 file 1 1593
내가총대멘다
2019.02.20
1580 질문 거래소에 상장되는 토큰들에 관하여 erc-20 토큰을 만드는 것은 간단하다고 알고 있습니다. 그렇다면 거래소에 토큰을 상장하는 작업은 erc-20 토큰을 만드는 것보다 훨씬 어려운 작업인가요? 그 과정과 배경에 대해 알고싶습니다.                   --... 3 734
코크코크
2019.02.19
1579 질문 안녕하세요. 개발자님들!   안녕하세요. 땡글 개발자님들 정보의 상향평준화를 꿈꾸고 있는 코인코입니다!   유명한 블록체인 프로젝트들과 Q&amp;A 진행을 주기적으로 해보려고합니다.   많은 개발자님들이 참여하셨으면 해서 이렇게 글을 남... 495
코인코1
2019.02.19
1578 개발 10억이 팔린 미술품 코인과 동일한것을 개발 해보았습니다. 그리고 이후 이 글의 목적: 포에버로즈 와 동일한 코인 개발완료 이후 활성화에대한 이야기 이 글의 목표: 개발이 다가아니다, 개발이후 가치를 만드는작업은 더 어려울수도 혹은 아주 어려운작업이다 라는것을 말하고자 합니다. ... 1012
연개소문_2019
2019.02.19
1577 개발 비트코인 보물 찾기, RAIDS 플랫폼을 개발중입니다. 안녕하세요. 초밥매니아입니다.   땡글에 오랜만에 글을 올리네요^^    예전에 제가 올린 글중 비트코인 채굴이 아닌 도굴? 이란 제목으로 글을 올린 적이 있습니다(https://www.ddengle.com/develop/9694510). 여러 ... 36 file 4 1304
초밥매니아
2019.02.18
1576 개발 NodeRed Flow-based 개발툴 소개합니다. NodeRed - Flow-based 개발툴 소개합니다.     한번쯤 지나가다 들어봤을 법한...프로그래밍툴 Node-Red입니다.   API를 이용하는 간단한 웹프로그램은 손쉽게 구현이 가능합니다. 전문가분들께는 많이 모자른 프로그... 5 1 754
까치섬
2019.02.18
1575 질문 ERC20 개발 하면서 궁금한게 몇 가지 있습니다.     1. 현재 테스트 넷(Ropsten)을 이용해 ERC20 개발 중인데요 . 제가 만든 ERC20 컨트랙트를 배포하면 롭스텐 이더스캔에서 반영이 잘 되는데 막상 컨트랙트를 배포한 제 노드에서 배포한 계정의 밸런스를 확인해보... 3 766
나비잠
2019.02.17
1574 개발 구글봇이 자동으로 전세계에 HACKER 비트코인 주소 소문내주고 있습니다     고맙게도 구글봇이 저렇게 자동으로 전세계에 해커의 bitcoin address를 소문내주고 있었습니다     거래소의 주소 조회 필터링 시스템만 더 발전하면 아마도 돈을 현금화 하진 못할 것 같습니다     전세계 누구... 14 file 1449
내가총대멘다
2019.02.17
1573 개발 블록체인에 정보기록 개발하기 개요: 판문점선언을 블록체인에 기록했다는데 이걸 만약 직접 개발 한다면 어떻게 해야할까요 ? 블록체인에 정보기록을하는 사례들이 많아 지고있습니다, 예를들면, 결혼식을 기념해서 메타정보및 서약서를 블록체인... 13 799
세줄
2019.02.16
1572 개발 비트코인(블록체인) 마이닝 개발 강의 개요: 마이닝개발 하려면 어떻게 해야할까요 ? 궁금해서 공부를 해서 정리를 하고 실제 구현도 해보았습니다. 3달정도 걸린것같네요  한국어로 자료가 잘없고 영어로도 자료가 정리된것이 없어서 고생을 많이 하긴 했... 617
세줄
2019.02.16
1571 개발 이더리움 개발시 도커 세팅 방법 개요: 이더리움 개발(블록체인개발)을 하기위해서 무엇부터 해야할까요 ? 블록체인 개발을 위한 도커설정하는 법부터 해야겠지요 ? (물론 도커를 안해도 상관은없지만, 안하고 차이의 생산성은 매우 큰 것같습니다.) ... 1 554
세줄
2019.02.16
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 82 Next
/ 82