🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

RPC 엔드포인트 접근 및 테스트 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 2. · 20 Views

RPC 엔드포인트 접근 및 테스트 완벽 가이드

이더리움 노드와 통신하기 위한 RPC 엔드포인트의 기초부터 실전 테스트까지 다룹니다. JSON-RPC API를 이해하고 curl과 web3.js를 활용하여 블록체인 데이터를 조회하는 방법을 배워봅니다.


목차

  1. 서비스_포트_확인하기
  2. JSON-RPC_API_기초
  3. eth_blockNumber_호출_테스트
  4. eth_getBalance로_잔액_조회
  5. curl로_RPC_호출하기
  6. web3.js와_ethers.js_연결_테스트

1. 서비스 포트 확인하기

입사 첫 주, 김개발 씨는 블록체인 팀에 배정되었습니다. 선배가 건넨 첫 번째 과제는 "로컬에서 돌아가는 이더리움 노드에 접속해보세요"였습니다.

그런데 노드가 어디서 돌아가고 있는지, 어떤 포트를 사용하는지 전혀 감이 잡히지 않았습니다.

RPC 포트란 이더리움 노드가 외부 요청을 받아들이는 통신 창구입니다. 마치 은행 창구 번호와 같아서, 올바른 창구를 찾아가야만 서비스를 받을 수 있습니다.

기본적으로 이더리움 노드는 8545번 포트를 HTTP RPC용으로, 8546번 포트를 WebSocket용으로 사용합니다.

다음 코드를 살펴봅시다.

// 포트 확인을 위한 다양한 방법들
// 1. 리눅스/맥에서 열린 포트 확인
// $ netstat -tlnp | grep 8545
// $ lsof -i :8545

// 2. Node.js로 포트 연결 테스트
const net = require('net');

function checkPort(host, port) {
  return new Promise((resolve) => {
    const socket = new net.Socket();
    socket.setTimeout(3000);
    socket.on('connect', () => {
      socket.destroy();
      resolve(true);
    });
    socket.on('error', () => resolve(false));
    socket.on('timeout', () => resolve(false));
    socket.connect(port, host);
  });
}

// 사용 예시
checkPort('localhost', 8545).then(isOpen => {
  console.log(`포트 8545: ${isOpen ? '열림' : '닫힘'}`);
});

김개발 씨는 입사 첫 주부터 난관에 부딪혔습니다. 블록체인 개발을 시작하려면 먼저 이더리움 노드에 연결해야 하는데, 도대체 어디로 연결해야 하는지 막막했습니다.

선배 개발자 박시니어 씨가 다가와 물었습니다. "혹시 포트 번호는 확인해봤어요?" 김개발 씨는 고개를 갸웃거렸습니다.

포트 번호라니, 그게 뭔가요? 박시니어 씨가 웃으며 설명을 시작했습니다.

"컴퓨터 네트워크에서 포트는 마치 아파트 동 번호 같은 거예요. IP 주소가 아파트 단지라면, 포트 번호는 그 안의 각 동을 구분하는 번호인 셈이죠." 이더리움 노드도 마찬가지입니다.

하나의 서버에서 여러 서비스가 동시에 돌아갈 수 있는데, 각 서비스는 자신만의 포트 번호를 가지고 있습니다. 이더리움의 경우 HTTP RPC는 8545번, WebSocket은 8546번이 기본값입니다.

그렇다면 포트가 제대로 열려있는지 어떻게 확인할 수 있을까요? 리눅스나 맥에서는 터미널 명령어 한 줄이면 됩니다.

netstat 명령어를 사용하면 현재 열려있는 모든 포트를 확인할 수 있고, lsof 명령어로는 특정 포트를 사용 중인 프로세스를 찾을 수 있습니다. 위 코드 예제에서는 Node.js의 net 모듈을 활용한 방법을 보여드렸습니다.

소켓 연결을 시도해보고, 성공하면 포트가 열려있는 것이고, 실패하면 닫혀있거나 접근이 불가능한 것입니다. 실무에서 이 작업이 중요한 이유가 있습니다.

개발 환경에서 테스트할 때 로컬 노드의 포트를, 운영 환경에서는 Infura나 Alchemy 같은 원격 서비스의 엔드포인트를 사용하게 됩니다. 환경마다 접속 정보가 다르기 때문에 항상 먼저 연결 가능 여부를 확인해야 합니다.

초보 개발자들이 자주 하는 실수 중 하나는 방화벽 설정을 확인하지 않는 것입니다. 노드가 분명히 실행 중인데도 연결이 안 된다면, 방화벽이 해당 포트를 차단하고 있을 가능성이 높습니다.

김개발 씨는 터미널을 열고 명령어를 입력했습니다. 화면에 8545 포트가 LISTEN 상태로 표시되었습니다.

드디어 첫 관문을 통과한 것입니다.

실전 팁

💡 - Geth 노드 실행 시 --http.port 옵션으로 포트 변경 가능

  • 원격 접속 허용 시 --http.addr 0.0.0.0 설정 필요하나 보안에 주의

2. JSON-RPC API 기초

포트를 확인한 김개발 씨는 이제 실제로 노드와 대화를 나눌 차례가 되었습니다. 그런데 노드에게 어떤 언어로 말을 걸어야 할까요?

박시니어 씨가 알려준 답은 JSON-RPC였습니다.

JSON-RPC는 JSON 형식으로 원격 프로시저를 호출하는 프로토콜입니다. 쉽게 말해 노드에게 명령을 내리는 표준화된 대화 방식입니다.

모든 요청과 응답이 JSON 형태로 오가기 때문에 어떤 프로그래밍 언어에서든 쉽게 사용할 수 있습니다.

다음 코드를 살펴봅시다.

// JSON-RPC 요청의 기본 구조
const rpcRequest = {
  jsonrpc: "2.0",        // 프로토콜 버전 (항상 "2.0")
  method: "eth_blockNumber",  // 호출할 메서드 이름
  params: [],            // 메서드에 전달할 파라미터
  id: 1                  // 요청 식별자 (응답 매칭용)
};

// JSON-RPC 응답의 기본 구조
const rpcResponse = {
  jsonrpc: "2.0",
  result: "0x10d4f",     // 성공 시 결과값
  id: 1
};

// 에러 응답의 구조
const rpcError = {
  jsonrpc: "2.0",
  error: {
    code: -32601,        // 에러 코드
    message: "Method not found"  // 에러 메시지
  },
  id: 1
};

김개발 씨는 포트 확인을 마치고 의기양양해졌습니다. 그러나 다음 질문이 떠올랐습니다.

포트를 알았다 한들, 노드에게 뭐라고 말해야 하죠? 박시니어 씨가 화이트보드 앞으로 걸어갔습니다.

"사람들이 대화할 때 공통 언어가 필요하듯이, 컴퓨터 간 통신에도 약속된 형식이 필요해요. 이더리움 노드와 대화할 때 사용하는 약속이 바로 JSON-RPC입니다." JSON-RPC를 이해하려면 먼저 두 단어를 분해해봐야 합니다.

JSON은 데이터를 표현하는 형식이고, RPC는 Remote Procedure Call, 즉 원격 프로시저 호출의 약자입니다. 마치 전화로 은행 업무를 보는 것과 비슷합니다.

고객이 "제 계좌 잔액 좀 알려주세요"라고 요청하면, 은행 직원이 조회 후 "123만원입니다"라고 응답합니다. JSON-RPC도 마찬가지로, 정해진 양식에 맞춰 요청을 보내면 정해진 양식으로 응답이 돌아옵니다.

요청 메시지에는 네 가지 필수 요소가 있습니다. 첫째, jsonrpc는 프로토콜 버전입니다.

현재는 거의 모든 곳에서 "2.0"을 사용합니다. 둘째, method는 호출하고 싶은 기능의 이름입니다.

이더리움 API에는 수십 가지 메서드가 정의되어 있습니다. 셋째, params는 메서드에 전달할 매개변수들입니다.

빈 배열일 수도 있고, 여러 값을 담을 수도 있습니다. 넷째, id는 요청 식별자입니다.

여러 요청을 동시에 보냈을 때 어떤 응답이 어떤 요청에 대한 것인지 구분하는 데 사용됩니다. 응답도 비슷한 구조를 따릅니다.

성공했다면 result 필드에 결과가 담기고, 실패했다면 error 필드에 에러 정보가 담깁니다. 실무에서 자주 마주치는 에러 코드들이 있습니다.

-32700은 파싱 에러로 JSON 형식이 잘못되었을 때 발생합니다. -32601은 존재하지 않는 메서드를 호출했을 때, -32602는 잘못된 파라미터를 전달했을 때 나타납니다.

김개발 씨가 고개를 끄덕였습니다. "아, 그러니까 이 규칙만 지키면 어떤 프로그래밍 언어로든 노드와 대화할 수 있다는 거군요!" 박시니어 씨가 미소 지었습니다.

"정확해요. 그래서 curl로도, Python으로도, JavaScript로도 똑같이 이더리움 노드에 접근할 수 있는 거예요."

실전 팁

💡 - id 값은 숫자뿐 아니라 문자열도 사용 가능

  • 배치 요청으로 여러 RPC 호출을 한 번에 보낼 수 있음

3. eth blockNumber 호출 테스트

이론을 배운 김개발 씨는 이제 직접 실습해볼 시간이 되었습니다. 가장 간단한 API부터 시작하자고 박시니어 씨가 제안했습니다.

현재 블록 번호를 조회하는 eth_blockNumber가 바로 그것입니다.

eth_blockNumber는 현재 블록체인의 최신 블록 번호를 반환하는 메서드입니다. 파라미터가 필요 없어서 가장 먼저 테스트해보기 좋은 API입니다.

반환값은 16진수 문자열 형태로 오기 때문에 10진수로 변환해서 사용해야 합니다.

다음 코드를 살펴봅시다.

// Node.js에서 eth_blockNumber 호출하기
const https = require('https');

const requestBody = JSON.stringify({
  jsonrpc: "2.0",
  method: "eth_blockNumber",
  params: [],
  id: 1
});

const options = {
  hostname: 'mainnet.infura.io',
  path: '/v3/YOUR_PROJECT_ID',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': requestBody.length
  }
};

const req = https.request(options, (res) => {
  let data = '';
  res.on('data', chunk => data += chunk);
  res.on('end', () => {
    const result = JSON.parse(data);
    // 16진수를 10진수로 변환
    const blockNumber = parseInt(result.result, 16);
    console.log(`현재 블록 번호: ${blockNumber}`);
  });
});

req.write(requestBody);
req.end();

김개발 씨는 드디어 첫 번째 실습에 돌입했습니다. 목표는 간단합니다.

이더리움 메인넷의 현재 블록 번호를 조회하는 것입니다. 박시니어 씨가 설명을 덧붙였습니다.

"블록 번호를 조회하는 건 마치 도서관에서 최신 입고된 책 번호를 확인하는 것과 같아요. 새 책이 계속 들어오니까 번호도 계속 올라가겠죠?" 이더리움 블록체인에서도 마찬가지입니다.

약 12초마다 새로운 블록이 생성되고, 블록 번호는 0부터 시작해서 계속 증가합니다. 2024년 기준으로 이더리움 메인넷의 블록 번호는 이미 1800만을 넘어섰습니다.

eth_blockNumber 메서드는 파라미터가 필요 없는 가장 단순한 API입니다. 그래서 RPC 연결 테스트용으로 가장 먼저 사용하기 좋습니다.

연결이 제대로 되었는지, 응답이 정상적으로 오는지 확인하는 용도로 딱입니다. 코드를 살펴보겠습니다.

먼저 요청 본문을 JSON 형식으로 만듭니다. method에 "eth_blockNumber"를 지정하고, params는 빈 배열로 둡니다.

이 요청을 HTTPS POST로 노드 엔드포인트에 전송합니다. 응답이 도착하면 흥미로운 점을 발견할 수 있습니다.

result 값이 "0x115c72f" 같은 형태로 옵니다. 앞에 붙은 0x는 이 값이 16진수임을 나타냅니다.

왜 16진수로 올까요? 이더리움은 내부적으로 모든 숫자를 16진수로 처리합니다.

네트워크 효율성과 일관성을 위한 설계 결정입니다. 따라서 우리가 읽기 편한 10진수로 변환하려면 parseInt 함수에 기수 16을 지정해주어야 합니다.

실무에서 주의할 점이 있습니다. 블록 번호 조회는 빈번하게 일어나는 작업이지만, 매번 API를 호출하면 불필요한 비용이 발생할 수 있습니다.

Infura나 Alchemy 같은 서비스는 일일 요청 한도가 있기 때문입니다. 따라서 블록 번호를 캐싱하거나, WebSocket을 통해 새 블록 이벤트를 구독하는 방식을 권장합니다.

김개발 씨가 코드를 실행했습니다. 콘솔에 "현재 블록 번호: 18390831"이 출력되었습니다.

첫 번째 RPC 호출 성공입니다!

실전 팁

💡 - 테스트넷(Sepolia, Goerli)에서 먼저 연습하면 실수해도 안전함

  • 블록 번호 대신 'latest', 'pending', 'earliest' 문자열도 사용 가능

4. eth getBalance로 잔액 조회

블록 번호 조회에 성공한 김개발 씨는 자신감이 붙었습니다. 이번에는 조금 더 실용적인 API를 시도해보기로 했습니다.

특정 지갑 주소의 이더리움 잔액을 조회하는 eth_getBalance입니다.

eth_getBalance는 특정 이더리움 주소의 잔액을 조회하는 메서드입니다. 주소와 블록 태그 두 가지 파라미터가 필요합니다.

반환값은 Wei 단위의 16진수이므로, 사람이 읽기 쉬운 ETH 단위로 변환해야 합니다.

다음 코드를 살펴봅시다.

// eth_getBalance로 지갑 잔액 조회하기
async function getBalance(address) {
  const response = await fetch('https://mainnet.infura.io/v3/YOUR_PROJECT_ID', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: "2.0",
      method: "eth_getBalance",
      params: [
        address,      // 조회할 지갑 주소
        "latest"      // 블록 태그: latest, earliest, pending
      ],
      id: 1
    })
  });

  const data = await response.json();
  // Wei를 ETH로 변환 (1 ETH = 10^18 Wei)
  const weiBalance = BigInt(data.result);
  const ethBalance = Number(weiBalance) / 1e18;

  console.log(`잔액: ${ethBalance.toFixed(4)} ETH`);
  return ethBalance;
}

// 비탈릭 부테린의 공개 지갑 주소로 테스트
getBalance('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045');

김개발 씨는 블록 번호 조회로 워밍업을 마쳤습니다. 이제 박시니어 씨가 새로운 미션을 던졌습니다.

"특정 지갑에 이더가 얼마나 있는지 조회해볼까요?" 잔액 조회는 블록체인 개발에서 가장 흔히 쓰이는 기능 중 하나입니다. 지갑 앱, 거래소, DeFi 서비스 등 거의 모든 이더리움 관련 서비스에서 사용됩니다.

eth_getBalance 메서드는 두 개의 파라미터를 받습니다. 첫 번째는 조회하고 싶은 주소이고, 두 번째는 블록 태그입니다.

블록 태그로는 'latest'(최신 블록), 'earliest'(첫 블록), 'pending'(대기 중인 트랜잭션 포함) 또는 특정 블록 번호를 16진수로 지정할 수 있습니다. 응답값을 보면 또다시 16진수가 등장합니다.

예를 들어 "0x1bc16d674ec80000" 같은 값이 반환됩니다. 하지만 이번에는 단순히 10진수로 바꾸는 것만으로는 부족합니다.

이더리움의 잔액은 Wei라는 최소 단위로 표현됩니다. 마치 원화의 최소 단위가 1원인 것처럼, 이더리움의 최소 단위가 1 Wei입니다.

그리고 1 ETH는 무려 10의 18승 Wei와 같습니다. 숫자로 쓰면 1,000,000,000,000,000,000입니다!

왜 이렇게 작은 단위를 사용할까요? 블록체인에서는 소수점 연산이 정확하지 않을 수 있기 때문입니다.

정수로만 계산하면 이런 문제를 피할 수 있습니다. 사람에게 보여줄 때만 ETH 단위로 변환하면 됩니다.

코드에서 BigInt를 사용한 이유도 여기에 있습니다. JavaScript의 일반 숫자는 안전하게 표현할 수 있는 범위가 제한되어 있습니다.

10^18 수준의 큰 숫자를 다룰 때는 BigInt를 써야 정확한 계산이 가능합니다. 실무에서 흔히 하는 실수가 있습니다.

주소를 입력할 때 대소문자 체크섬을 무시하는 것입니다. 이더리움 주소는 대소문자를 섞어서 쓰면 체크섬 역할을 합니다.

잘못된 주소를 입력하면 엉뚱한 곳에 자산을 보내는 사고가 날 수 있으니 항상 주소 검증을 거치는 것이 좋습니다. 김개발 씨가 비탈릭 부테린의 공개 지갑 주소로 테스트를 돌렸습니다.

콘솔에 상당한 양의 ETH가 표시되었습니다. "와, 진짜 잔액이 조회되네요!"

실전 팁

💡 - 토큰 잔액 조회는 eth_call과 ERC-20 컨트랙트를 활용해야 함

  • 잔액이 0인지 확인할 때는 BigInt 비교를 사용하세요

5. curl로 RPC 호출하기

김개발 씨가 Node.js 코드를 열심히 작성하고 있을 때, 옆자리 선배가 터미널 창 하나만 열고 똑같은 결과를 얻어내는 모습을 보았습니다. 비밀은 바로 curl 명령어였습니다.

curl은 명령줄에서 HTTP 요청을 보낼 수 있는 도구입니다. 복잡한 코드 없이 터미널 한 줄로 RPC 호출이 가능해서 빠른 테스트와 디버깅에 매우 유용합니다.

개발 중 API 응답을 즉시 확인하고 싶을 때 가장 먼저 손이 가는 도구입니다.

다음 코드를 살펴봅시다.

# 현재 블록 번호 조회
curl -X POST https://mainnet.infura.io/v3/YOUR_PROJECT_ID \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

# 잔액 조회 (더 보기 좋게 jq로 파싱)
curl -X POST https://mainnet.infura.io/v3/YOUR_PROJECT_ID \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc":"2.0",
    "method":"eth_getBalance",
    "params":["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","latest"],
    "id":1
  }' | jq .

# 가스 가격 조회
curl -X POST https://mainnet.infura.io/v3/YOUR_PROJECT_ID \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}'

# 네트워크 ID 확인
curl -X POST https://mainnet.infura.io/v3/YOUR_PROJECT_ID \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}'

코드를 작성하고, 저장하고, 실행하고... 간단한 API 테스트 하나에도 이런 과정이 필요하다면 너무 번거롭지 않을까요?

박시니어 씨가 김개발 씨에게 귀띔했습니다. "급하게 뭔가 확인하고 싶을 때는 curl이 최고예요.

터미널만 있으면 어디서든 바로 테스트할 수 있거든요." curl은 Command-line URL의 줄임말로, 1997년에 처음 만들어진 유서 깊은 도구입니다. HTTP, HTTPS, FTP 등 다양한 프로토콜로 데이터를 주고받을 수 있습니다.

대부분의 리눅스와 맥에 기본으로 설치되어 있고, 윈도우도 최신 버전에는 포함되어 있습니다. curl 명령어의 구조를 살펴보겠습니다.

-X POST는 HTTP POST 메서드를 사용하겠다는 의미입니다. RPC 호출은 항상 POST로 이루어집니다.

-H는 헤더를 추가하는 옵션으로, JSON을 보낸다는 것을 서버에 알려줍니다. -d는 요청 본문을 지정합니다.

여기에 JSON-RPC 요청을 넣으면 됩니다. 응답이 한 줄로 길게 나와서 읽기 불편할 때가 있습니다.

이럴 때 jq라는 도구를 파이프로 연결하면 JSON이 보기 좋게 정렬되어 출력됩니다. jq는 JSON 전용 명령줄 파서로, 필드 추출이나 필터링 같은 고급 기능도 제공합니다.

curl의 진정한 가치는 디버깅 상황에서 빛을 발합니다. 프로덕션 서버에서 문제가 발생했을 때, SSH로 접속해서 curl 한 줄이면 바로 원인을 파악할 수 있습니다.

Node.js나 Python 환경을 세팅할 필요가 없습니다. 또한 curl 명령어는 문서화하기도 좋습니다.

API 사용법을 설명할 때 curl 예제를 첨부하면, 읽는 사람이 바로 복사해서 테스트해볼 수 있습니다. 실제로 많은 블록체인 서비스의 공식 문서가 curl 예제를 포함하고 있습니다.

주의할 점도 있습니다. 윈도우 명령 프롬프트에서는 작은따옴표(') 대신 큰따옴표(")를 사용해야 합니다.

또한 JSON 내부의 큰따옴표는 이스케이프 처리가 필요합니다. 이런 차이 때문에 윈도우에서는 Git Bash나 WSL을 사용하는 것이 편합니다.

김개발 씨가 터미널에 curl 명령어를 입력했습니다. 엔터를 누르자 즉시 결과가 출력되었습니다.

"이거 정말 편하네요!"

실전 팁

💡 - curl -s 옵션으로 진행 상황 출력을 숨길 수 있음

  • 환경변수에 API 키를 저장해두면 명령어가 더 짧아짐

6. web3.js와 ethers.js 연결 테스트

curl과 순수 HTTP 요청으로 기초를 다진 김개발 씨에게 박시니어 씨가 새로운 세계를 열어주었습니다. "실제 프로젝트에서는 라이브러리를 쓰는 게 훨씬 편해요." 그렇게 web3.jsethers.js를 만나게 되었습니다.

web3.jsethers.js는 이더리움과 상호작용하기 위한 JavaScript 라이브러리입니다. JSON-RPC를 직접 다루지 않아도 직관적인 메서드로 블록체인 데이터에 접근할 수 있습니다.

web3.js는 이더리움 재단이 관리하고, ethers.js는 더 가볍고 현대적인 대안으로 인기를 얻고 있습니다.

다음 코드를 살펴봅시다.

// ethers.js v6 사용 예제 (권장)
import { ethers } from 'ethers';

// 프로바이더 연결
const provider = new ethers.JsonRpcProvider(
  'https://mainnet.infura.io/v3/YOUR_PROJECT_ID'
);

// 다양한 정보 조회
async function testConnection() {
  // 현재 블록 번호
  const blockNumber = await provider.getBlockNumber();
  console.log(`블록 번호: ${blockNumber}`);

  // 잔액 조회 (자동으로 BigInt 반환)
  const address = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
  const balance = await provider.getBalance(address);
  console.log(`잔액: ${ethers.formatEther(balance)} ETH`);

  // 가스 가격
  const feeData = await provider.getFeeData();
  console.log(`가스 가격: ${ethers.formatGwei(feeData.gasPrice)} Gwei`);

  // 네트워크 정보
  const network = await provider.getNetwork();
  console.log(`체인 ID: ${network.chainId}`);
}

testConnection();

지금까지 김개발 씨는 JSON-RPC의 원리를 직접 체험했습니다. 요청을 만들고, 응답을 파싱하고, 16진수를 변환하고...

교육적으로는 훌륭했지만, 매번 이렇게 하기에는 번거롭습니다. 박시니어 씨가 말했습니다.

"원리를 이해했으니 이제 편한 도구를 쓸 때가 됐어요. 자동차 운전을 배웠다고 매번 엔진 구조부터 설명하진 않잖아요?" web3.js는 이더리움 생태계에서 가장 오래된 JavaScript 라이브러리입니다.

이더리움 재단이 직접 관리하며, 풍부한 기능과 방대한 커뮤니티를 자랑합니다. 하지만 번들 크기가 크고 의존성이 많다는 단점이 있습니다.

ethers.js는 web3.js의 대안으로 등장했습니다. 더 작은 번들 크기, 더 깔끔한 API, TypeScript 지원 등으로 최근 많은 프로젝트에서 선호하고 있습니다.

특히 ethers v6부터는 ESM 지원과 더 나은 타입 시스템을 갖추게 되었습니다. 코드를 보면 차이가 확연합니다.

JSON-RPC를 직접 호출할 때는 요청 객체를 만들고, fetch로 보내고, 응답을 파싱하고, 16진수를 변환해야 했습니다. ethers.js를 사용하면 provider.getBlockNumber() 한 줄이면 됩니다.

라이브러리가 모든 복잡한 작업을 대신 처리해줍니다. formatEtherformatGwei 같은 유틸리티 함수도 편리합니다.

Wei에서 ETH로, Wei에서 Gwei로 변환하는 계산을 직접 하지 않아도 됩니다. 반대로 ETH를 Wei로 변환하는 parseEther도 있습니다.

프로바이더 개념도 중요합니다. 프로바이더는 블록체인 네트워크와의 연결을 추상화한 객체입니다.

로컬 노드든, Infura든, Alchemy든 프로바이더만 바꾸면 나머지 코드는 그대로 사용할 수 있습니다. 이런 설계 덕분에 환경별로 코드를 수정하지 않아도 됩니다.

어떤 라이브러리를 선택해야 할까요? 새 프로젝트를 시작한다면 ethers.js를 권장합니다.

더 현대적이고, 번들 크기가 작고, 문서도 잘 정리되어 있습니다. 기존 프로젝트가 web3.js를 사용 중이라면 굳이 마이그레이션할 필요는 없습니다.

김개발 씨가 ethers.js 예제를 실행했습니다. 몇 줄의 코드로 블록 번호, 잔액, 가스 가격, 네트워크 정보가 깔끔하게 출력되었습니다.

"이렇게 간단해도 되는 건가요?" 박시니어 씨가 웃으며 대답했습니다. "원리를 알고 쓰면 라이브러리가 도구가 되고, 모르고 쓰면 블랙박스가 됩니다.

김개발 씨는 이제 두 가지 모두 할 수 있게 되었네요."

실전 팁

💡 - ethers.js v6과 v5는 API가 상당히 다르니 문서 버전 확인 필수

  • 프로덕션에서는 여러 프로바이더를 폴백으로 구성하는 것이 안정적

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Ethereum#JSON-RPC#web3.js#ethers.js#curl#블록체인API#Blockchain,Ethereum

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.