안녕하세요.
쌩광부입니다.
지난 강좌
https://steemit.com/@topmining
https://www.ddengle.com/@TopMining
전체 소스
https://github.com/topmining/ethersocial-php-api
이번 강좌는 지난 강좌에서 저장한 트랜잭션 내역을 읽어 출력하는 API를 만들어 보겠습니다.
get_history.php 파일을 만들고 아래와 같이 코딩합니다.
<?php
require "api-config.php";
require "vendor/autoload.php";
use Brick\Math\BigDecimal;
use Brick\Math\RoundingMode;
header('Content-type: application/json');
$account = array_key_exists('account', $_GET) ? $_GET['account'] : '';
if(strlen($account) == 42 && ctype_alnum($account) && strpos($account, '0x') >= 0) {
$wei = "1000000000000000000";
$conn = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_database);
$pagesize = 30;
$result['result']['address'] = $account;
$result['result']['history'] = array();
if($query = $conn->query("select * from txaccount where fromaddr='$account' or toaddr='$account' order by blocknumber desc limit 0, $pagesize")) {
while($row = $query->fetch_array()) {
$txhash = $row['hash'];
$blocknumber = $row['blocknumber'];
$fromaddr = $row['fromaddr'];
$toaddr = $row['toaddr'];
$timestamp = $row['timestamp'];
$value = BigDecimal::of($row['value'])->dividedBy($wei, 9, Brick\Math\RoundingMode::DOWN);
$result['result']['history'][] = array(
'hash' => $txhash,
'blocknumber' => $blocknumber,
'fromaddr' => $fromaddr,
'toaddr' => $toaddr,
'timestamp' => $timestamp,
'value' => $value
);
}
$query->close();
echo json_encode($result);
}
$conn->close();
}
else {
$result = array();
$result['error']['code'] = '-1';
$result['error']['message'] = 'Invalid address';
echo json_encode($result);
}
몇 줄 안되죠? ㅋㅋ
자 그럼 한 줄씩 살펴볼까요?
use Brick\Math\BigDecimal;
use Brick\Math\RoundingMode;
큰 숫자 처리를 위해 BigDecimal과 RoundingMode를 이용합니다.
$account = array_key_exists('account', $_GET) ? $_GET['account'] : '';
GET 인자값으로 account를 읽습니다.
여기에 조회하려는 주소값이 들어가겠죠.
$conn = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_database);
MySQL에 접속하고요.
if($query = $conn->query("select * from txaccount where fromaddr='$account' or toaddr='$account' order by blocknumber desc limit 0, $pagesize"))
txaccount 테이블에서 fromaddr, toaddr이 입력된 주소와 일치하는 내용만 가져옵니다.
이때 blocknumber 최신순으로 $pagesize 만큼만 읽어옵니다.
이 소스에서는 최근 30건만 읽어옵니다. 이 부분은 적당하게 조절하시면 되겠습니다.
$value = BigDecimal::of($row['value'])->dividedBy($wei, 9, Brick\Math\RoundingMode::DOWN);
wei 단위로 저장된 값을 ether 단위로 변경하고 소수점 9자리까지만 표시합니다.
$result['result']['history'][] = array(
...
'value' => $value);
트랜잭션 자료를 history 배열이 추가합니다.
echo json_encode($result);
결과값을 출력합니다.
간단하죠? 끝입니다.
그럼 테스트를 해봅시다.
http://서버주소/get_history.php?account=0xe45b202332dfec3b9bdbb30930f95b87c73da004
{
"result": {
"address": "0xe45b202332dfec3b9bdbb30930f95b87c73da004",
"history": [
{
"hash": "0xb444844cfcb7b35b9af9514d99ba51addeb3e975d0048ec6aef755cc80702b6a",
"blocknumber": "2495748",
"fromaddr": "0xe45b202332dfec3b9bdbb30930f95b87c73da004",
"toaddr": "0x07b873ef096accc44b57f644e2fcbcac7161ec3d",
"timestamp": "1549606001",
"value": "1.249945091"
},
{
"hash": "0xf2a4d86db1d0c291a992668a30c85234a5aa58c49ede166d9325f8343c92fdb3",
"blocknumber": "2495746",
"fromaddr": "0xe45b202332dfec3b9bdbb30930f95b87c73da004",
"toaddr": "0x995bfc6856a7afb46dc1cdb81395b8252b591777",
"timestamp": "1549605945",
"value": "1.918926018"
},
{
"hash": "0xf0c63c29cae736c8b5e0dfc5af44bb6bcb5b45d739fe680d57ffe2caa9b0ff0d",
"blocknumber": "2495744",
"fromaddr": "0xe45b202332dfec3b9bdbb30930f95b87c73da004",
"toaddr": "0xf1732f15fab616294ed28c5b4272fa9e75890dd3",
"timestamp": "1549605915",
"value": "1.258724238"
}
]
}
}
위와 같이 나오면 성공입니다.
다음 시간은 이 강좌 시리즈의 마지막 시간인데요.
매우 간단한 트랜잭션을 전송 API 입니다.
그럼 다음 강좌도 많이 기대해주세요~~