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

안녕하세요.

쌩광부입니다.

 

지난 강좌

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

쌩광부님의 서명

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

List of Articles
번호 분류 제목 추천 수 조회 수 글쓴이 날짜
1302 개발 NodeRed를 이용한 시각화툴 Grafana 이용하기 비트코인 모니터링 시스템으로 Grafana를 활용하고 있습니다.   본인만의 모니터시스템을 구현하고자 하는 분들은 영상 확인해보시기 바랍니다.   Grafana로 구현중인 내용은 1. 거래소별 비트... 3 file 4 2386
까치섬
2019.03.06
1301 개발 [강좌] 이더소셜 PHP API 서버 만들기 #8. 트랜잭션 전송하기 안녕하세요. 쌩광부입니다.   지난 강좌 https://steemit.com/@topmining https://www.ddengle.com/@TopMining   전체 소스 https://github.com/topmining/ethersocial-php-api   이번 강좌는 이... 2 8 2346
쌩광부
2019.03.05
1300 개발 bitcoin에서 잔액주소만 표시해주는 명령어가 있을까요?     제목글처럼 비트코인 wallet명령어중에서 잔돈수신용으로 생성된 주소를 검색하는 명령어가 있을까요?   아님 방법이라도 있을까요?                   -----------------------------------... 4 0 997
ohworld5
2019.02.28
1299 개발 [강좌] 이더소셜 PHP API 서버 만들기 #7. 트랜잭션 내역 확인하기 안녕하세요. 쌩광부입니다.   지난 강좌 https://steemit.com/@topmining https://www.ddengle.com/@TopMining   전체 소스 https://github.com/topmining/ethersocial-php-api   이번 강좌는 지... 3 955
쌩광부
2019.02.27
개발 [강좌] 이더소셜 PHP API 서버 만들기 #6. 트랜잭션 기록하기 안녕하세요. 쌩광부입니다.   지난 강좌 https://steemit.com/@topmining https://www.ddengle.com/@TopMining   전체 소스 https://github.com/topmining/ethersocial-php-api   이번 강좌는 블... 2 7 2001
쌩광부
2019.02.24
1297 개발 삭제한 글입니다 삭제한 글입니다 0 1157
헬로월드
2019.02.24
1296 개발 10억이 팔린 미술품 코인과 동일한것을 개발 해보았습니다. 그리고 이후 이 글의 목적: 포에버로즈 와 동일한 코인 개발완료 이후 활성화에대한 이야기 이 글의 목표: 개발이 다가아니다, 개발이후 가치를 만드는작업은 더 어려울수도 혹은 아주 어려운작업이다 라는것... 0 1378
연개소문_2019
2019.02.19
1295 개발 비트코인 보물 찾기, RAIDS 플랫폼을 개발중입니다. 안녕하세요. 초밥매니아입니다.   땡글에 오랜만에 글을 올리네요^^    예전에 제가 올린 글중 비트코인 채굴이 아닌 도굴? 이란 제목으로 글을 올린 적이 있습니다(https://www.ddengle.com/dev... 36 file 4 2053
초밥매니아
2019.02.18
1294 개발 NodeRed Flow-based 개발툴 소개합니다. NodeRed - Flow-based 개발툴 소개합니다.     한번쯤 지나가다 들어봤을 법한...프로그래밍툴 Node-Red입니다.   API를 이용하는 간단한 웹프로그램은 손쉽게 구현이 가능합니다. 전문가분들께... 5 1 1161
까치섬
2019.02.18
1293 개발 구글봇이 자동으로 전세계에 HACKER 비트코인 주소 소문내주고 있습니다     고맙게도 구글봇이 저렇게 자동으로 전세계에 해커의 bitcoin address를 소문내주고 있었습니다     거래소의 주소 조회 필터링 시스템만 더 발전하면 아마도 돈을 현금화 하진 못할 것 같습... 14 file 0 1963
내가총대멘다
2019.02.17
1292 개발 블록체인에 정보기록 개발하기 개요: 판문점선언을 블록체인에 기록했다는데 이걸 만약 직접 개발 한다면 어떻게 해야할까요 ? 블록체인에 정보기록을하는 사례들이 많아 지고있습니다, 예를들면, 결혼식을 기념해서 메타정보... 13 0 1103
세줄
2019.02.16
1291 개발 비트코인(블록체인) 마이닝 개발 강의 개요: 마이닝개발 하려면 어떻게 해야할까요 ? 궁금해서 공부를 해서 정리를 하고 실제 구현도 해보았습니다. 3달정도 걸린것같네요  한국어로 자료가 잘없고 영어로도 자료가 정리된것이 없어서... 0 917
세줄
2019.02.16
1290 개발 이더리움 개발시 도커 세팅 방법 개요: 이더리움 개발(블록체인개발)을 하기위해서 무엇부터 해야할까요 ? 블록체인 개발을 위한 도커설정하는 법부터 해야겠지요 ? (물론 도커를 안해도 상관은없지만, 안하고 차이의 생산성은 ... 1 0 837
세줄
2019.02.16
1289 개발 [강좌] 이더소셜 PHP API 서버 만들기 #5. 블록 내용 살펴보기 안녕하세요. 쌩광부입니다.   지난 강좌 https://steemit.com/@topmining https://www.ddengle.com/@TopMining   오늘 강좌 내용은 트랜잭션(거래내역)을 MySql DB로 옮기기 위해 필요한 사항을 ... 4 8 2177
쌩광부
2019.02.12
1288 개발 비트맥스 지정가 주문(post only 로) 을 넣는 방법   안녕하세요.   비트맥스 api 를 이용하여 트레이딩을 하고 있는데요. 비트맥스 사이트에 보면 지정가주문을 위해 손으로 거래하는 경우 post only 를 체크하게 되어 있는데요. (taker fee를 받... 1 0 2100
부자아들
2019.02.06
1287 개발 test 거래소 상장 준비중이라 개발중 말한 내용중 보안과 관련이 조금 이라도 있다는 내용을 삭제 중입니다. 양해 바랍니다. 감사합니다. ------------------- 꼬리말 * 게시글 내용 삭제시 레벨 강등... 15 2 3166
Xmessiah
2019.02.03
1286 개발 [강좌] 이더소셜 PHP API 서버 만들기 #4. 계정 트랜젝션 개수 확인하기 안녕하세요. 쌩광부입니다.   한동안 ESN 재단 설립 때문에 너무 바빠서 강좌를 못했었는데요. 오늘 ESN 재단 구성원 모집이 완료되어 한시름 놓았습니다. 그리하여... 다시 강좌를 시작하도록 ... 3 13 3274
쌩광부
2019.01.29
1285 개발 카카오게임 개발에 관심있는 개발자분이라면 한번 참조해볼만한..   카카오 클레이튼에 올라가는 보라 플랫폼이 해커톤을 진행한다네요.   게임 댑 개발을 주제로 하니까 참가해보면 좋을것 같습니다.   http://www.fnnews.com/news/201901141819407902         ... 1 file 0 1091
코인끝판킹마
2019.01.25
1284 개발 나비 코인 계속 돌려 보며 안정화 시키는데 생각 보다 많이 걸렸습니다 많은 조언 감사하고 기왕 만든거 계속 개선하고 개발하겠습니다... 감사합니다. www.nabi-coin.com           ---------------------... 5 1 2650
Xmessiah
2019.01.24
1283 개발 게임 해커톤 개발 공모전     게임 해커톤 개발 대회 진행하네요. 관심 있으신 분들 첨고하시길   http://www.fnnews.com/news/201901141101354291   블록체인 콘텐츠 플랫폼 '보라' 게임 개발자 대상 해커톤 진행   록체... 0 1197
수영귀신
2019.01.24
Board Pagination Prev 1 ... 3 4 5 6 7 8 9 10 11 12 ... 73 Next
/ 73
default debug random = 0 / type = READ / detected = READ