입금-Transaction 확인하기

두가지 형태(RPC 및 web3)에 대해 각각 기술합니다.

Eth 수신 (RPC Command)

생성된 블록을 확인 후 블록내에 내 주소에 대한 해당항목을 찾아 처리하는 방식입니다.
새 블록이 언제 생성되었는지 알 수 없으므로 크롤링 각격에 따라 이전 n개긔 블록을 읽어 들여야 합니다.
한 블록은 보통 10~20초 이내에 생성되고, 한 블록당 많아야 200~300개의 트랜잭션이 들어있습니다

private function getTransactionsByAccount($myaccount='*', $startBlockNumber=null, $endBlockNumber=null) {
  if ($endBlockNumber == null) {
    $endBlockNumber = hexdec($this->eth_blockNumber());
  }

  if ($startBlockNumber == null) { // 현재 블록으로 부터 50개의 이전 블록을 읽어 ㄷㄹ인다.
    $tmp = $endBlockNumber - 50;
    $startBlockNumber = $tmp < 0  ? 0 : $tmp;
  }
  $transactions = [];

  for ($i = $startBlockNumber; $i <= $endBlockNumber; $i++) { // 50개의 블록을 차례로 일거 들인다.
    $block = $this->eth_getBlockByNumber('0x'.dechex($i), true);;

    if (isset($block) && isset($block['transactions'])) {
      foreach ($block['transactions'] as $transaction) { // 각 block에 포함된 transaction을 체크한다.
        if ($myaccount == "*" || $myaccount == $transaction['from'] || $myaccount == $transaction['to']) { // transaction에 나의 account가 존재하면 
          print_r($transaction);
        }
      }
    }
  }
  return $transactions;
}

Eth 수신 (web3 이용)

하나의 주소에 대해서는 아래처럼 event를 수신하여 처리가능
거래소처럼 다수의 주소를 수신할 경우는 위의 예시 처럼 처리함
현재 지원하는 subscribe

  • web3.eth.subscribe('pendingTransactions' [, callback]);

  • web3.eth.subscribe('newBlockHeaders' [, callback]);

  • web3.eth.subscribe('syncing' [, callback]);

  • web3.eth.subscribe('logs', options [, callback]);

  • log : erc20 토큰의 log를 이용하여 처리

  • newBlockHeaders : eth의 transaction을 확인하기 위해 처리

web3.eth.subscribe(type [, options] [, callback]);

geth를 실행할때 아래와 같이 websocket에 대한 정보를 입력한다.

nohup geth --goerli --ws --ws.origins '*' --ws.api eth,net,web3 

예) logs subscribe

let options = {
    fromBlock: 0,
    address: ['address-1', 'address-2'],    //Only get events from specific addresses
    topics: []                              //What topics to subscribe to
};

let subscription = web3.eth.subscribe('logs', options,(err,event) => {
    if (!err)
    console.log(event)
});

subscription.on('data', event => console.log(event))
subscription.on('changed', changed => console.log(changed))
subscription.on('error', err => { throw err })
subscription.on('connected', nr => console.log(nr))

우리가 사용할 것은 newBlockHeaders 이다.

const web3 = new Web3('위에서 설정한 node webSocket url');

web3.eth.subscribe('newBlockHeaders', function(error, result){
  if (error) {
    console.error(error);
  }
})
.on("connected", function(subscriptionId){
    console.log(subscriptionId);
})
.on("data", function(blockHeader){
    console.log('blockHeader.number >>', blockHeader.number);

    web3.eth.getBlock(blockHeader.number, {}, function(error, data) {
      data.transactions.forEach((trans) =>{
        if (myAddress === trans.to || myAddress === trans.from ) {
          console.log(trans);
        }
      })
    });
})
.on("error", console.error);
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1