[강좌] 이더소셜 PHP API 서버 만들기 #7. 트랜잭션 내역 확인하기

in topmining •  6 years ago 

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

지난 강좌
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 입니다.

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

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!