Blockchain

Web3j 스터디 (7) 네이티브 코인 트랜잭션 조회

lemon- 2025. 12. 19. 21:27
1. 지갑 주소 생성 (Private Key, Public Key)
1.1 Private Key로 Public Key 추출
1.2 생성된 주소 메타마스크에 등록해보기
1.3 Private Key로 서명 생성

2. 단위 변환 (wei, gwei, eth)
2.1 wei → eth
2.2 eth → wei

3. 네이티브 코인 전송
3.1 네이티브 코인 전송 (from, to, amount)
3.2 네이티브 코인 트랜잭션 조회

 

 

네이티브 코인 트랜잭션이란?

 

네이티브 코인 트랜잭션은
지갑에서 지갑으로 네트워크의 기본 화폐를 직접 전송하는 트랜잭션이다.

이더리움 기준으로는 다음과 같다.

  • 네이티브 코인: ETH
  • 스마트 컨트랙트 호출 없음
  • 전송 정보는 Transaction 객체에 직접 기록됨
  • Receipt 로그(logs)는 비어 있음

네이티브 코인 전송은
ERC-20, ERC-721 토큰 전송과 달리 컨트랙트 실행이 필요 없다는 특징이 있다.


트랜잭션 조회에 필요한 정보

트랜잭션 조회를 위해 다음 정보들을 사용한다.

 

  • 트랜잭션 해시(transaction hash) : 하나의 트랜잭션을 식별하는 고유 ID 값이다.
  • 블록 해시(block hash) : 해당 트랜잭션이 포함된 블록을 식별하는 고유 ID 값이다.
  • 블록 번호(block number) : 제네시스 블록부터 몇 번째 블록인지 나타내는 번호(높이)이다.
  • 블록 내 트랜잭션 인덱스(transaction index) : 블록 내부에서 트랜잭션이 몇 번째 순서인지 나타내는 값이다.

해당 값들은 Etherscan 탐색기에서 확인할 수 있다.

 


Web3j 연결

먼저 Infura RPC를 통해 Sepolia 테스트넷에 연결한다.

String infuraKey = System.getenv("INFURA_PROJECT_ID");
String sepoliaUrl = "https://sepolia.infura.io/v3/" + infuraKey;

Web3j web3 = Web3j.build(new HttpService(sepoliaUrl));

 

조회만 수행하므로 개인키나 Credentials는 필요하지 않다.


트랜잭션 조회 방법

Web3j에서는 트랜잭션을 조회하는 방법이 여러 가지 있다.


1) 트랜잭션 해시로 조회

가장 일반적이고 많이 사용하는 방식이다.

EthTransaction ethTransaction =
    web3.ethGetTransactionByHash(transactionHash).send();

Transaction transaction =
    ethTransaction.getTransaction().get();

조회 가능한 정보는 다음과 같다.

  • hash
  • nonce
  • from
  • to
  • value
  • blockNumber
  • gasPrice

-> 트랜잭션 성공 여부나 실제 가스 사용량은 포함되지 않는다.


2) 블록 해시 + 트랜잭션 인덱스로 조회

특정 블록의 N번째 트랜잭션을 조회할 때 사용한다.

web3.ethGetTransactionByBlockHashAndIndex(
    blockHash,
    transactionIndex
).send();

블록 단위로 트랜잭션을 순회할 때 사용하는 방식이다.


3) 블록 번호 + 트랜잭션 인덱스로 조회

블록 해시 대신 블록 번호를 사용하는 방식이다.

web3.ethGetTransactionByBlockNumberAndIndex(
    DefaultBlockParameter.valueOf(blockNumber),
    transactionIndex
).send();

개념적으로는 2번 방식과 동일하다.


Transaction과 TransactionReceipt의 차이

트랜잭션을 제대로 이해하려면 Transaction과 TransactionReceipt의 차이를 구분해야 한다.

Transaction

Transaction 객체는 트랜잭션 생성 시점의 정보를 담고 있다. 포함되는 주요 정보는 다음과 같다.

  • 보내는 주소 (from)
  • 받는 주소 (to)
  • 전송 금액 (value)
  • nonce
  • gasPrice
  • blockNumber

하지만 다음 정보는 알 수 없다.

  • 트랜잭션 성공 여부
  • 실제 가스 사용량
  • 실행 결과 로그

TransactionReceipt

트랜잭션의 실행 결과는 TransactionReceipt에서 확인한다.

TransactionReceipt receipt =
    web3.ethGetTransactionReceipt(transactionHash)
         .send()
         .getTransactionReceipt()
         .get();

Receipt에는 다음 정보가 포함된다.

  • status (0x1 성공, 0x0 실패)
  • gasUsed
  • effectiveGasPrice
  • logs

가스비 계산

EIP-1559 이후에는 단순 gasPrice가 아닌 effectiveGasPrice를 사용해야 한다.

총 수수료 = gasUsed × effectiveGasPrice

 

이는 트랜잭션 실행으로 실제로 차감된 네이티브 코인 금액이다.


네이티브 코인 vs ERC20 토큰

네이티브 코인과 ERC20 토큰 트랜잭션의 차이는 다음과 같다.

구분 네이티브 코인 ERC20 토큰
전송 방식 지갑 → 지갑 스마트 컨트랙트 호출
Transaction.value 전송 금액 기록 항상 0
로그 없음 Transfer 이벤트 존재
가스 소모 적음  상대적으로 큼

 

ERC20 토큰의 실제 전송 정보는TransactionReceipt.logs에서 확인한다.


핵심 정리

  • 네이티브 코인 트랜잭션은 컨트랙트 호출 없이 전송된다.
  • 트랜잭션 조회 방법은 3가지가 있다.
  • Transaction은 전송 정보, Receipt는 실행 결과이다.
  • 성공 여부와 가스 사용량은 Receipt에서만 확인 가능하다.
  • ERC20 토큰은 로그를 통해 전송 정보를 확인한다.