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
해결:
- 컨테이너 상태 확인
docker ps | grep bsc
docker logs bsc-node --tail 50
- 포트 바인딩 확인
netstat -tuln | grep 8545
# 또는
lsof -i :8545
RPC 응답 없음
증상:
{
"error": {
"code": -32700,
"message": "Parse error"
}
}
해결:
- JSON 형식 확인 (따옴표, 쉼표)
- Content-Type 헤더 확인
동기화가 안 됨
증상:
{
"result": {
"currentBlock": "0x0",
"highestBlock": "0x0"
}
}
해결:
- 피어 연결 확인
curl -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' \
http://localhost:8545
- 부트노드 연결 확인
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- 네트워크 IDnet_peerCount- 피어 수web3_clientVersion- 클라이언트 버전
추가 BSC 전용 메서드
parlia_getSnapshot- Parlia 합의 스냅샷parlia_getValidators- 현재 검증자 목록
전체 RPC API 문서: BSC JSON-RPC