블록체인의 꽃이라고 불리는 스마트 컨트랙트, 하지만 이를 직접 사용하고 연결하는 방법은 낯설게 느껴질 수 있습니다. 이 글은 Neo 블록체인의 EVM 사이드체인인 NeoX에서 Python을 활용해 스마트 컨트랙트와 상호작용하는 가장 기초적인 방법을 소개합니다. 🧪
NeoX는 Neo 생태계에서 Solidity 기반 스마트 컨트랙트를 실행할 수 있게 해주는 EVM 호환 사이드체인입니다. 덕분에 기존 이더리움 기반의 프로젝트들도 NeoX로 쉽게 확장할 수 있고, 저렴한 가스비와 빠른 속도를 누릴 수 있습니다.
NeoX의 핵심 특징:
Python은 배우기 쉽고 간결한 문법 덕분에, 블록체인 입문자들이 빠르게 개발 환경을 익히기에 매우 적합한 언어입니다. 따라서 NeoX 체인을 처음 다루는 개발자에게는 Python + web3.py 조합이 좋은 출발점이 될 수 있습니다.

NeoX는 이더리움과 동일한 Web3 RPC 인터페이스를 제공하기 때문에, Python의 web3.py 라이브러리를 이용해 스마트 컨트랙트와 직접 통신할 수 있습니다. web3.py는 이더리움 계열 블록체인과 상호작용하기 위한 Python용 라이브러리로, 트랜잭션 생성, 컨트랙트 함수 호출, 블록 및 이벤트 조회 등 다양한 기능을 제공합니다.
이번 실습에서는 NeoX의 DEX(탈중앙 거래소)인 ForTheWinSwap에서 NDMEME-WGAS 페어의 유동성 리저브 정보를 Python을 통해 조회합니다.
https://mainnet-1.rpc.banelabs.org/0xE1e1cC68841D1fF13bdd8C8fB36E6f91995788f40xE816deE05cf6D0F2a57EB4C489241D8326B5d1060xdE41591ED1f8ED1484aC2CD8ca0876428de60EfFpip install web3 requests
먼저 Python에서 NeoX 체인에 연결하고, 컨트랙트를 불러오기 위한 코드를 작성합니다. 이 과정에서는 필요한 라이브러리를 불러오고, 컨트랙트 주소와 ABI 파일을 지정한 뒤, Web3 객체를 생성해 체인과 연결합니다.
from web3 import Web3
FTW_SWAP_HASH = "0xE1e1cC68841D1fF13bdd8C8fB36E6f91995788f4"
FTW_SWAP_ABI = open("ftw_abi.json").read() #The ABI file
NDMEME_HASH = "0xE816deE05cf6D0F2a57EB4C489241D8326B5d106"
WGAS_HASH = "0xdE41591ED1f8ED1484aC2CD8ca0876428de60EfF"
w3 = Web3(Web3.HTTPProvider(RPC_ENDPOINT))
contract = w3.eth.contract(FTW_SWAP_HASH, abi=FTW_SWAP_ABI)
reserves = contract.functions.getReserves(NDMEME_HASH, WGAS_HASH).call()
이번에는 외부 가격 API를 통해 GAS의 USD 기준 시세를 받아온 후, 이를 기반으로 NDMEME의 상대 가격을 계산해 보겠습니다. 이 계산은 유동성 풀에 쌓인 리저브 값을 활용하여 NDMEME의 가치를 추정하는 방식입니다.
import requests
from web3 import Web3
FTW_SWAP_HASH = "0xE1e1cC68841D1fF13bdd8C8fB36E6f91995788f4"
FTW_SWAP_ABI = open("ftw_abi.json").read()
NDMEME_HASH = "0xE816deE05cf6D0F2a57EB4C489241D8326B5d106"
WGAS_HASH = "0xdE41591ED1f8ED1484aC2CD8ca0876428de60EfF"
FLAMINGO_PRICE_API = "https://neo-api.b-cdn.net/flamingo/live-data/prices/latest"
w3 = Web3(Web3.HTTPProvider('https://mainnet-1.rpc.banelabs.org/'))
contract = w3.eth.contract(FTW_SWAP_HASH, abi=FTW_SWAP_ABI)
reserves = contract.functions.getReserves(NDMEME_HASH, WGAS_HASH).call()
ndmeme_reserve = reserves[2] / 10 ** 18
wgas_reserve = reserves[4] / 10 ** 18
res = requests.get(FLAMINGO_PRICE_API)
gas_price = [x['usd_price'] for x in res.json() if x['symbol'] == 'GAS'][0]
ndmeme_price = gas_price * wgas_reserve / ndmeme_reserve
이처럼 NeoX 체인과 통신하면서 아래와 같이 다양한 서비스를 개발해 볼 수 있습니다. 한번 시도해보는건 어떨까요?
이 튜토리얼에서는 NeoX에서 Python으로 스마트 컨트랙트를 호출하고 데이터를 읽는 기초를 다루었습니다. 다음 글에서는 트랜잭션을 생성하고 서명하여 블록체인에 전송하는 방법도 다룰 예정이니 기대해주세요!
도움이 필요하거나 질문이 있다면 언제든지 Neo Discord에서 문의해보세요 🙌