[강좌] 이더소셜 PHP API 서버 만들기 #4. 계정 트랜젝션 개수 확인하기

in topmining •  6 years ago 

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

한동안 ESN 재단 설립 때문에 너무 바빠서 강좌를 못했었는데요.
오늘 ESN 재단 구성원 모집이 완료되어 한시름 놓았습니다.
그리하여... 다시 강좌를 시작하도록 하겠습니다.

지난 강좌는 땡글 블로그와 스팀잇에서 보실 수 있고요.
https://steemit.com/@topmining
https://www.ddengle.com/@TopMining

오늘 강좌는 계정 트랜젝션 개수를 확인하는 방법인데요.
트랜젝션 개수가 왜 필요한 걸까요?

트랜젝션 개수는 새로운 트랜젝션을 만들기 위한 Nonce 값으로 활용됩니다.
코인을 전송하기 위해서 트랜젝션이 필요한데요.
Nonce는 그 트랜젝션의 일련번호라고 보시면 되겠습니다.
즉, 맨 처음 전송을 할 때는 트랜젝션의 일련번호는 0입니다.
그다음은 1입니다.
이런 식으로 자신의 트랜젝션이 생성될 때마다 고유한 번호를 붙여줘야 하는데요.
그때 사용하기 위해 이전에 생성된 자신의 트랜젝션의 개수를 읽어와 Nonce 값으로 적용하게 되는 것이죠.

  1. get_txcount.php 파일을 만들고 아래와 같이 코딩합니다.
<?php
require "json-rpc.php";
require "api-config.php";

header('Content-type: application/json');

$account = array_key_exists('account', $_GET) ? $_GET['account'] : '';

if(strlen($account) == 42 && ctype_alnum($account) && strpos($account, '0x') >= 0) {
  $id = 1;
  $json = getEtherRpc($api_host, $api_port, 'eth_getTransactionCount', '"'.$account.'", "latest"', $id++);

  $data = json_decode($json, true);
  $error = array_key_exists('error', $data) ? $data['error'] : null;

  $result = array();
  if($error) {
    $result['error'] = $error;
  }
  else {
    $value = $data["result"];
    $result['error'] = null;
    $result['result']['count'] = hexdec(str_replace('0x', '', $value));
  }

  echo json_encode($result);
}
else {
  $result = array();
  $result['error']['code'] = '-1';
  $result['error']['message'] = 'Invalid address';

  echo json_encode($result);
}

한 줄 한 줄 살펴볼까요?

require "json-rpc.php";
require "api-config.php";

require를 이용해 필요한 파일들을 로드하고요.

header('Content-type: application/json');

출력 Content-type을 JSON 형태로 지정합니다.

$account = array_key_exists('account', $_GET) ? $_GET['account'] : '';

HTTP GET 형식으로 지갑 주소를 받습니다.

if(strlen($account) == 42 && ctype_alnum($account) && strpos($account, '0x') >= 0) {

지갑 주소에 대한 유효성 검사를 하고요.

$json = getEtherRpc($api_host, $api_port, 'eth_getTransactionCount', '"'.$account.'", "latest"', $id++);

지정된 IP와 포트로 JSON-RPC를 호출합니다.
eth_getTransactionCount는 계정 트랜젝션 개수를 받아오는 RPC 명령입니다.
id의 경우 큰 의미는 없는데 내가 보낸 RPC의 고유번호라고 보면 됩니다.
여러 명령을 한 번에 보낼 때 유용하게 사용할 수 있지만 지금은 한 건만 보내기 때문에 큰 의미는 없습니다.

$data = json_decode($json, true);

받아온 데이터가 JSON 문자열이므로 PHP 배열로 변경합니다.

$error = array_key_exists('error', $data) ? $data['error'] : null;

오류가 있는지 확인하고요.

$result['error'] = $error;

오류가 있는 경우 오류 메시지를 출력합니다.

$result['result']['count'] = hexdec(str_replace('0x', '', $value));

16진수(Hex)값으로 되어있는 개수 값을 10진수로 변경하여 출력합니다.

echo json_encode($result);

최종 결과값은 JSON 형태로 변경하면 되는 거죠.

이것으로 트랜젝션 개수 가져오는 코딩은 끝나는 거죠.
참~~ 쉽죠!

그럼 결과값을 봅시다.

http://서버주소/get_txcount.php?account=지갑주소
{
  "result": {
    "count": 10
  }
}

위와 같이 나오면 성공입니다.

이 강좌의 전체 소스는
https://github.com/topmining/ethersocial-php-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!