입금-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);