Nodes/bsc/docker/RPC-TESTS

bsc

BSC Node RPC 테스트 가이드

17분 읽기 · docker/RPC-TESTS

list목차(51)

BSC Node RPC 테스트 가이드

BSC 노드가 정상 작동하는지 RPC를 통해 확인하는 방법입니다.

기본 연결 테스트

1. 노드 버전 확인

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "Geth/v1.4.15-ec318b9c-20240919/linux-amd64/go1.21.13"
}

2. 체인 ID 확인

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x38"  // 56 in hex (BSC Mainnet)
}

3. 네트워크 ID 확인

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "56"  // BSC Mainnet
}

동기화 상태 확인

4. 동기화 진행률

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' \
  http://localhost:8545

동기화 중일 때:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "currentBlock": "0x1e8480",      // 2,000,000
    "highestBlock": "0x2625a00",     // 40,000,000
    "startingBlock": "0x0",
    "syncedAccounts": "0x...",
    "syncedAccountBytes": "0x...",
    "syncedStorage": "0x...",
    "syncedStorageBytes": "0x...",
    "healedBytecodes": "0x...",
    "healedBytecodeBytes": "0x...",
    "healedTrienodes": "0x...",
    "healedTrienodeBytes": "0x...",
    "healingBytecode": "0x0",
    "healingTrienodes": "0x0",
    "txIndexFinishedBlocks": "0x...",
    "txIndexRemainingBlocks": "0x..."
  }
}

동기화 완료 시:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": false
}

5. 최신 블록 번호

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x2625a00"  // 40,000,000 (hex)
}

6. 피어 연결 수

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x19"  // 25 peers (hex)
}

블록체인 데이터 조회

7. 최신 블록 정보

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}' \
  http://localhost:8545

8. 특정 블록 조회 (예: 블록 #1000)

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x3e8",false],"id":1}' \
  http://localhost:8545

9. 블록 트랜잭션 수

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["latest"],"id":1}' \
  http://localhost:8545

계정 및 잔액 조회

10. BNB 잔액 조회

# 예제: Binance Hot Wallet 주소
curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x28C6c06298d514Db089934071355E5743bf21d60","latest"],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x1b1ae4d6e2ef5000000"  // Wei 단위 (18 decimals)
}

Wei를 BNB로 변환:

# Python으로 변환
python3 -c "print(int('0x1b1ae4d6e2ef5000000', 16) / 10**18)"

11. 트랜잭션 수 (Nonce) 조회

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x28C6c06298d514Db089934071355E5743bf21d60","latest"],"id":1}' \
  http://localhost:8545

12. 코드 확인 (컨트랙트인지 확인)

# 컨트랙트 주소 예: USDT on BSC
curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0x55d398326f99059fF775485246999027B3197955","latest"],"id":1}' \
  http://localhost:8545

예상 응답:

  • EOA (일반 계정): "0x"
  • Contract: "0x6080604052..."

트랜잭션 조회

13. 트랜잭션 상세 정보

# 예제 트랜잭션 해시
curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xYOUR_TX_HASH"],"id":1}' \
  http://localhost:8545

14. 트랜잭션 영수증

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xYOUR_TX_HASH"],"id":1}' \
  http://localhost:8545

Gas Price 조회

15. 현재 Gas Price

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}' \
  http://localhost:8545

예상 응답:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x12a05f200"  // 5 Gwei (hex)
}

16. Gas 추정

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{
    "jsonrpc":"2.0",
    "method":"eth_estimateGas",
    "params":[{
      "from": "0xYOUR_ADDRESS",
      "to": "0xRECIPIENT_ADDRESS",
      "value": "0x9184e72a000"
    }],
    "id":1
  }' \
  http://localhost:8545

스마트 컨트랙트 호출

17. 컨트랙트 메서드 호출 (읽기)

# 예: USDT balanceOf 호출
# Function signature: balanceOf(address) = 0x70a08231
# Parameter: 000000000000000000000000 + YOUR_ADDRESS (without 0x)

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{
    "jsonrpc":"2.0",
    "method":"eth_call",
    "params":[{
      "to": "0x55d398326f99059fF775485246999027B3197955",
      "data": "0x70a08231000000000000000000000000YOUR_ADDRESS_WITHOUT_0x"
    }, "latest"],
    "id":1
  }' \
  http://localhost:8545

18. 컨트랙트 이벤트 로그 조회

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{
    "jsonrpc":"2.0",
    "method":"eth_getLogs",
    "params":[{
      "fromBlock": "0x2625a00",
      "toBlock": "latest",
      "address": "0x55d398326f99059fF775485246999027B3197955"
    }],
    "id":1
  }' \
  http://localhost:8545

네트워크 정보

19. 리스닝 여부 확인

curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' \
  http://localhost:8545

고급 테스트

20. 여러 요청 배치 처리

curl -H "Content-Type: application/json" \
  -X POST \
  --data '[
    {"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1},
    {"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":2},
    {"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":3}
  ]' \
  http://localhost:8545

21. WebSocket 연결 테스트

# wscat 설치 (Node.js 필요)
npm install -g wscat

# WebSocket 연결
wscat -c ws://localhost:8546

# 연결 후 새 블록 구독
> {"jsonrpc":"2.0","method":"eth_subscribe","params":["newHeads"],"id":1}

모니터링용 스크립트

동기화 진행률 확인

#!/bin/bash
# check_sync.sh

while true; do
  SYNC=$(curl -s -H "Content-Type: application/json" \
    -X POST \
    --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' \
    http://localhost:8545)
  
  if [[ $SYNC == *"false"* ]]; then
    echo "✅ Fully synced!"
    break
  else
    CURRENT=$(echo $SYNC | grep -oP '"currentBlock":"0x\K[^"]*')
    HIGHEST=$(echo $SYNC | grep -oP '"highestBlock":"0x\K[^"]*')
    CURRENT_DEC=$((16#$CURRENT))
    HIGHEST_DEC=$((16#$HIGHEST))
    PERCENT=$(awk "BEGIN {printf \"%.2f\", ($CURRENT_DEC/$HIGHEST_DEC)*100}")
    echo "⏳ Syncing: $CURRENT_DEC / $HIGHEST_DEC ($PERCENT%)"
  fi
  
  sleep 10
done

피어 연결 모니터링

#!/bin/bash
# check_peers.sh

while true; do
  PEERS=$(curl -s -H "Content-Type: application/json" \
    -X POST \
    --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' \
    http://localhost:8545 | grep -oP '"result":"0x\K[^"]*')
  
  PEERS_DEC=$((16#$PEERS))
  echo "🌐 Connected Peers: $PEERS_DEC"
  sleep 5
done

블록 생성 모니터링

#!/bin/bash
# watch_blocks.sh

PREV_BLOCK=0

while true; do
  BLOCK=$(curl -s -H "Content-Type: application/json" \
    -X POST \
    --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
    http://localhost:8545 | grep -oP '"result":"0x\K[^"]*')
  
  BLOCK_DEC=$((16#$BLOCK))
  
  if [ $PREV_BLOCK -gt 0 ]; then
    DIFF=$((BLOCK_DEC - PREV_BLOCK))
    echo "📦 Block: $BLOCK_DEC (+$DIFF)"
  else
    echo "📦 Block: $BLOCK_DEC"
  fi
  
  PREV_BLOCK=$BLOCK_DEC
  sleep 3
done

외부 서버에서 테스트

22. 외부 IP로 접근 (0.0.0.0:8545 노출 시)

# 서버 IP로 접근
curl -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
  http://YOUR_SERVER_IP:8545

23. 방화벽 확인

# RPC 포트가 열려있는지 확인
nc -zv YOUR_SERVER_IP 8545

# 또는
telnet YOUR_SERVER_IP 8545

문제 해결

RPC 연결 실패

증상:

curl: (7) Failed to connect to localhost port 8545

해결:

  1. 컨테이너 상태 확인
docker ps | grep bsc
docker logs bsc-node --tail 50
  1. 포트 바인딩 확인
netstat -tuln | grep 8545
# 또는
lsof -i :8545

RPC 응답 없음

증상:

{
  "error": {
    "code": -32700,
    "message": "Parse error"
  }
}

해결:

  • JSON 형식 확인 (따옴표, 쉼표)
  • Content-Type 헤더 확인

동기화가 안 됨

증상:

{
  "result": {
    "currentBlock": "0x0",
    "highestBlock": "0x0"
  }
}

해결:

  1. 피어 연결 확인
curl -s -X POST -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' \
  http://localhost:8545
  1. 부트노드 연결 확인
docker logs bsc-node | grep "Looking for peers"

유용한 도구

jq로 JSON 포맷팅

# jq 설치
sudo apt install jq  # Ubuntu
brew install jq      # Mac

# 사용 예
curl -s -H "Content-Type: application/json" \
  -X POST \
  --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
  http://localhost:8545 | jq '.'

Python으로 RPC 호출

import requests
import json

url = "http://localhost:8545"
headers = {"Content-Type": "application/json"}

# 최신 블록 조회
payload = {
    "jsonrpc": "2.0",
    "method": "eth_blockNumber",
    "params": [],
    "id": 1
}

response = requests.post(url, headers=headers, data=json.dumps(payload))
result = response.json()
block_hex = result['result']
block_dec = int(block_hex, 16)

print(f"Latest Block: {block_dec}")

JavaScript (Node.js) 예제

const axios = require('axios');

const rpcUrl = 'http://localhost:8545';

async function getBlockNumber() {
  const response = await axios.post(rpcUrl, {
    jsonrpc: '2.0',
    method: 'eth_blockNumber',
    params: [],
    id: 1
  });
  
  const blockHex = response.data.result;
  const blockDec = parseInt(blockHex, 16);
  
  console.log(`Latest Block: ${blockDec}`);
}

getBlockNumber();

Web3 라이브러리 사용

Web3.js

const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');

// 블록 번호
web3.eth.getBlockNumber().then(console.log);

// 잔액 조회
web3.eth.getBalance('0xYOUR_ADDRESS').then(balance => {
  console.log(web3.utils.fromWei(balance, 'ether'), 'BNB');
});

// 체인 ID
web3.eth.getChainId().then(console.log);  // 56

Ethers.js

const { ethers } = require('ethers');
const provider = new ethers.JsonRpcProvider('http://localhost:8545');

// 블록 번호
provider.getBlockNumber().then(console.log);

// 잔액 조회
provider.getBalance('0xYOUR_ADDRESS').then(balance => {
  console.log(ethers.formatEther(balance), 'BNB');
});

// 네트워크 정보
provider.getNetwork().then(network => {
  console.log('Chain ID:', network.chainId);  // 56n
});

참고 사항

BSC RPC 메서드

BSC는 Ethereum JSON-RPC와 호환되므로 대부분의 eth_* 메서드를 지원합니다:

  • eth_blockNumber - 최신 블록
  • eth_getBalance - 잔액 조회
  • eth_call - 컨트랙트 읽기 호출
  • eth_sendRawTransaction - 서명된 트랜잭션 전송
  • eth_getTransactionReceipt - 트랜잭션 영수증
  • eth_getLogs - 이벤트 로그 조회
  • net_version - 네트워크 ID
  • net_peerCount - 피어 수
  • web3_clientVersion - 클라이언트 버전

추가 BSC 전용 메서드

  • parlia_getSnapshot - Parlia 합의 스냅샷
  • parlia_getValidators - 현재 검증자 목록

전체 RPC API 문서: BSC JSON-RPC

bsc 다른 챕터