[NeoX 튜토리얼] Python으로 MultiCall 컨트랙트 사용하기

네오 블록체인·2025년 4월 18일

NeoX

목록 보기
4/12

소개

이번 튜토리얼에서는 NeoX 블록체인에서 MultiCall 컨트랙트를 Python으로 다루는 방법을 소개합니다.
블록체인이 익숙하지 않은 개발자분들도 이해할 수 있도록 친절하게 설명하겠습니다. 천천히 따라와 주세요!

여러 지갑의 ERC20 토큰 잔액을 한 번에 조회하는 방법

1. 기본 개념 이해하기

ERC20 토큰에서는 balanceOf 함수를 사용해 특정 지갑 주소의 잔액을 조회할 수 있습니다.

function balanceOf(address account) external view returns (uint256);

즉, 지갑 주소 하나를 입력하면 해당 주소가 보유한 토큰 수량을 확인할 수 있습니다.

“그럼 여러 지갑의 잔액을 알고 싶으면?”

✅ 각 지갑에 대해 balanceOf를 반복 호출하면 됩니다.
하지만 하나하나 따로 호출해야 하니, 속도도 느리고 비용도 많이 듭니다.

MultiCall이란?

이를 위해 MultiCall 을 이용하게 됩니다.
Multicall 은 여러 개의 스마트 컨트랙트 호출을 하나의 트랜잭션으로 묶어 처리할 수 있도록 도와주는 기능입니다.

원래라면 각각 따로 요청해야 할 데이터를 "한 번에 묶어서" 가져올 수 있습니다.
주로 읽기 전용 함수 호출(예: view, pure)을 위해 사용됩니다.
실제 블록체인 상태를 변경하지 않기 때문에 트랜잭션 실패나 롤백에 대한 걱정 없이 사용할 수 있습니다.

MultiCall을 써야하는 이유

  • 네트워크 비용 절감: 여러 번의 호출을 한 번에 묶어 처리하므로 가스비를 크게 줄일 수 있습니다.
  • 속도 향상: 여러 데이터를 병렬로 받아오기 때문에 전체 조회 시간이 짧아집니다.
  • 편리성: 하나의 응답으로 여러 데이터를 받아오므로 코드가 간결하고 관리가 쉬워집니다.

multicall 에 대한 자세한 내용 : https://github.com/makerdao/multicall

준비할 것들

  • RPC URL : NeoX 메인넷 또는 테스트넷 연결 주소
  • MultiCall 컨트랙트 주소
  • WAGAS 토큰 컨트랙트 주소
    필요한 정보는 NeoX 블록체인 공식 문서나 블록 탐색기에서 쉽게 찾을 수 있습니다.

Python 코드 구성하기

1. 필요한 라이브러리 설치

pip install web3 web3-multicall

2. 필요한 라이브러리 설치

from web3 import Web3
from web3multicall.multicall import Multicall

RPC_URL = "https://neoxsepolia-rpc.banlabs.org"
WAGAS_HASH = "0x444f15910d18b5d4cb808b2cfa1b2de9df6b6572"
MULTICALL_HASH = "0xe0090e2d1051d8f595da4582a8f59f6f1e646f27"

ADDRESSES = [
    "0x9f73b1546f2d7b9a2ccf7a361f6f3fc9614e184e",
    "0x5ff3d7d82e96fcf9e5dce1e4fcadb508ff44f3e7",
    "0x98255ad4b15f2ad5d0c6ad8b6f2e95f34435b844",
]

3. Web3 연결 & MultiCall 설정

w3 = Web3(Web3.HTTPProvider(RPC_URL))
w3_multicall = Multicall(w3, address=MULTICALL_HASH)

4. 호출할 함수 준비하기

for address in ADDRESSES:
    w3_multicall.add_call(
        WAGAS_HASH,
        'balanceOf(address)(uint256)',
        address
    )

5. 결과 받아오기

results = w3_multicall.call()

for idx, balance in enumerate(results):
    print(f"주소 {ADDRESSES[idx]} 의 WAGAS 보유량: {balance}")

전체 코드 모아보기

최종 전체 코드를 한 번에 보면 다음과 같습니다.

from web3 import Web3
from web3multicall.multicall import Multicall

RPC_URL = "https://neoxsepolia-rpc.banlabs.org"
WAGAS_HASH = "0x444f15910d18b5d4cb808b2cfa1b2de9df6b6572"
MULTICALL_HASH = "0xe0090e2d1051d8f595da4582a8f59f6f1e646f27"

ADDRESSES = [
    "0x9f73b1546f2d7b9a2ccf7a361f6f3fc9614e184e",
    "0x5ff3d7d82e96fcf9e5dce1e4fcadb508ff44f3e7",
    "0x98255ad4b15f2ad5d0c6ad8b6f2e95f34435b844",
]

w3 = Web3(Web3.HTTPProvider(RPC_URL))
w3_multicall = Multicall(w3, address=MULTICALL_HASH)

for address in ADDRESSES:
    w3_multicall.add_call(WAGAS_HASH, 'balanceOf(address)(uint256)', address)

results = w3_multicall.call()

for idx, balance in enumerate(results):
    print(f"주소 {ADDRESSES[idx]} 의 WAGAS 보유량: {balance}")

마무리

Multicall은 여러 컨트렉트를 한번에 조회해야 할 경우 빠르고 효율적으로 해결할 수 있는 솔루션으로, 현업에서도 많이 사용되고 있습니다.

Neo N3 네트워크는 EVM 기반이 아니라서 Multicall 이 아닌 다른 방식으로 다중 조회를 처리해야 했지만, NeoX 체인은 EVM 이기 때문에 MultiCall 사용이 가능합니다.

오늘 다룬 Python + MultiCall을 이용해 NeoX 체인에서 여러분만의 Dapp을 만들어보는건 어떠신가요?

profile
스마트 이코노미를 위한 퍼블릭 블록체인, 네오에 대한 모든것

0개의 댓글