암호화폐 세계에서는 블록체인 네트워크와 상호 작용하는 능력이 중요하며, 이러한 상호 작용을 촉진하는 주요 구성 요소 중 하나는 암호화폐 지갑(crypto wallet)입니다. 파이썬을 사용하여 이더리움 네트워크와 상호 작용하기 위한 암호화 지갑을 구축하는 방법을 소개합니다.
※ 이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.
- 원문: Developers’ Guide: How to Build a Crypto Wallet Using Python
- URL: https://www.coingecko.com/learn/build-crypto-wallet-python
기능 수준
먼저 암호화폐 지갑의 주요 기능을 검토해 보겠습니다.
- 키 생성 및 저장: 지갑은 새로운 공개 키와 개인 키 쌍을 생성할 수 있습니다. 지갑 주소라고도 알려진 공개 키는 자금을 받는데 사용되고 개인 키는 거래에 서명하는 데 사용됩니다.
- 잔액 표시: 지갑은 입력된 주소와 계약을 기반으로 사용자의 Ether 잔액을 표시하고 계약에 대한 과거 시장 차트 데이터를 표시할 수 있습니다.
- 거래 보내기 및 받기: 지갑은 Ether를 다른 Ethereum 주소로 보내고 자동으로 들어오는 거래를 받을 수 있습니다. 거래 세부정보는 사용자의 개인 키로 서명되고 Infura API를 통해 전송됩니다. 거래를 추적하는 데 사용되는 거래 해시가 반환됩니다. 이 기능을 완전히 테스트하려면 테스트 Ether(테스트 네트워크용) 또는 실제 Ether(Ethereum 메인넷용)가 필요합니다.
- 시장 차트 보기: 애플리케이션은 특정 계약에 대한 시장 차트 데이터를 USD로 가져와 표시할 수 있습니다. CoinGecko API를 사용하여 시장 차트 데이터를 가져옵니다.
[Disclamer] 이는 기본 지갑이며 스테이킹, 교환 또는 분산 애플리케이션(dApp)과의 상호 작용과 같은 고급 기능이 없습니다.
지갑은 JSON-RPC를 통해 이더리움 블록체인과 상호 작용할 수 있는 Python 라이브러리인 web3.py와 이더리움 노드에 대한 액세스를 제공하는 서비스인 Infura API를 사용하여 네트워크에 연결하고 트랜잭션을 수행합니다.
지갑의 프런트 엔드는 웹 브라우저에서 실행되며 HTML, CSS 및 JavaScript를 사용하여 인터페이스와 기능을 생성합니다. 프런트엔드는 웹 애플리케이션 구축을 가능하게 하는 웹 프레임워크인 Flask를 사용하여 Python으로 작성될 백엔드와 통신합니다
필수 구성 요소 및 필수 Python 라이브러리 설치
빌드하기 전에 갖춰야 할 몇 가지 전제 조건이 있습니다.
- Python: Python을 사용하여 백엔드 코드를 작성하므로 시스템에 Python이 설치되어 있어야 합니다. 공식 Python 웹사이트에서 다운로드할 수 있습니다.
- Flask: Flask는 Python용 경량 웹 프레임워크이며, 웹 애플리케이션을 만드는 데 사용됩니다. Python용 패키지 관리자인 pip를 사용하여 Flask를 설치할 수 있습니다.
- Web3.py: Web3.py는 Ethereum과 상호 작용하기 위한 Python 라이브러리입니다. 이는 계정을 생성하고 이더리움 블록체인과 상호 작용할 수 있게 해주기 때문에 이 프로젝트의 중요한 부분입니다. pip를 사용하여 web3.py를 설치할 수 있습니다.
- Infura 계정: Infura는 Ethereum 네트워크에 대한 액세스를 제공하는 서비스입니다. Infura 프로젝트 ID를 얻으려면 Infura에 계정을 만들고 새 프로젝트를 만들어야 합니다.
- CoinGecko API: 여기서는 CoinGecko API를 사용하여 암호화폐에 대한 시장 차트 데이터를 가져옵니다. CoinGecko API에는 분당 30회 호출 속도 제한과 월 최대 10,000회 호출로 모든 사용자가 액세스할 수 있는 무료 데모 계획이 있습니다. CoinGecko 계정에 가입하고 데모 플랜을 신청하여 무료 API 키를 생성하세요.
- 텍스트 편집기 또는 IDE: 코드를 작성하려면 텍스트 편집기 또는 통합 개발 환경(IDE)이 필요합니다. 인기 있는 선택으로는 Sublime Text, Atom, Visual Studio Code 및 PyCharm이 있습니다.
필수는 아니지만 암호화폐와 이더리움 블록체인의 작동 방식에 대한 기본적인 이해가 있으면 암호화폐 지갑의 코드와 작동 방식을 이해하는 데 도움이 됩니다.
코드를 실행하기 전에 필요한 Python 라이브러리도 설치해야 합니다. 방법은 다음과 같습니다.
(1) 터미널이나 명령 프롬프트를 엽니다.
(2) 다음 명령을 입력하고 Enter 키를 눌러서 Flask를 설치합니다.
pip install flask
(3) 다음 명령을 입력하고 Enter 키를 눌러 web3.py를 설치합니다.
pip install web3
(4) 다음 명령을 입력하고 Enter 키를 눌러 requests를 설치합니다.
pip install requests
Python 2와 Python 3이 모두 포함된 시스템을 사용하는 경우 pip 대신 pip3을 사용해야 할 수도 있습니다.
이더리움에서 암호화폐 지갑을 구축하는 방법
개발자는 백엔드(블록체인 상호작용을 위한 web3 라이브러리와의 통합)와 프런트엔드(사용자 인터페이스를 위한 Flask) 모두에 Python을 사용하여 이더리움에 암호화폐 지갑을 구축할 수 있습니다. 다음은 예시입니다.
from aiohttp import request
from flask import Flask, jsonify, render_template, session
from web3 import Web3
import requests
import json
app = Flask(__name__)
infura_url = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID '
web3 = Web3(Web3.HTTPProvider(infura_url))
app.config['SECRET_KEY'] = 'your-secret-key' # replace with your secret key
@app.route('/new_account', methods=['GET'])
def new_account():
account = web3.eth.account.create('YOUR_PASSWORD')
session['account'] = {
'privateKey': account.key.hex(),
'address': account.address
}
return jsonify(session['account'])
with open('erc20_abi.json') as f:
erc20_abi = json.load(f)
@app.route('/balance/<contract_address>', methods=['GET'])
def get_balance(contract_address):
address = session.get('account').get('address')
checksum_address = Web3.to_checksum_address(address)
print(checksum_address)
contract = web3.eth.contract(address=contract_address, abi=erc20_abi)
balance = contract.functions.balanceOf(checksum_address).call()
return jsonify({'balance': balance})
@app.route('/send_transaction', methods=['POST'])
def send_transaction():
data = request.get_json()
nonce = web3.eth.getTransactionCount(session['account']['address'])
txn_dict = {
'to': data['to'],
'value': web3.toWei(data['amount'], 'ether'),
'gas': 2000000,
'gasPrice': web3.toWei('40', 'gwei'),
'nonce': nonce,
'chainId': 3
}
signed_txn = web3.eth.account.signTransaction(txn_dict, session['account']['privateKey'])
txn_hash = web3.eth.sendRawTransaction(signed_txn.rawTransaction)
return jsonify({'transaction_hash': txn_hash.hex()})
@app.route('/market_chart/<contract_address>/<days>', methods=['GET'])
def get_market_chart(contract_address, days):
api_key = 'coingecko_api_key' # replace this with your own API key
response = requests.get(f'https://api.coingecko.com/api/v3/coins/ethereum/contract/{contract_address}/market_chart?vs_currency=usd&days={days}&api_key={api_key}')
market_chart = response.json()
return jsonify(market_chart)
@app.route('/')
def home():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
이 Flask 애플리케이션에는 네 가지 경로가 있습니다.
- /new_account: 새로운 이더리움 계정을 생성하고 개인 키와 주소를 반환합니다.
- /balance/<contract_address>: Web3 패키지를 이용하여 새로 생성된 계정 주소와 contract_address의 잔액을 가져와서 반환합니다.
- /send_transaction: 이 엔드포인트를 사용하면 지갑이 Ether를 다른 Ethereum 주소로 보낼 수 있습니다. 수신자의 주소와 보낼 금액을 입력으로 받아 사용자의 개인 키로 거래에 서명하고 Infura API를 통해 보냅니다. 트랜잭션 해시가 반환되며, 이 해시는 Ethereum 네트워크에서 트랜잭션을 추적하는 데 사용할 수 있습니다.
- /market_chart/<contract_address>/<days>: CoinGecko API를 사용하여 지정된 일수 동안 지정된 계약 주소에 대한 시장 차트 데이터를 가져와 반환합니다. contract_address ERC20 컨트랙트의 주소이며, 시장 days차트 데이터를 가져오는 데 걸린 지난 일수입니다.
[팁] 이더리움에서 이 패키지가 반환하는 주소는 대문자와 소문자의 혼합을 포함하는 체크섬 주소입니다. 체크섬은 주소의 유효성을 검사합니다. 잘못된 체크섬으로 인해 오류가 발생합니다. 체크섬 검사를 우회하려면 주소에 소문자 또는 대문자를 모두 사용하십시오.
Python 스크립트를 실행하고 웹 브라우저에서 경로에 액세스하거나 컬 또는 Postman과 같은 도구를 사용하여 이 애플리케이션을 로컬로 실행할 수 있습니다.
실제 Infura 프로젝트 ID(또는 API 키)와 보안 비밀번호로 YOUR_INFURA_PROJECT_ID 및 를 바꿔야 합니다. YOUR_PASSWORD항상 개인 키와 비밀번호를 안전하게 보관하고 누구와도 공유하지 마세요.
HTML 및 ERC20 코드 참조
이 프로젝트의 코드는 사용자 인터페이스용 HTML과 이더리움 블록체인의 ERC20 토큰 상호 작용을 모두 포함하여 매우 광범위합니다. 코드에 대한 자세한 내용은 [여기]를 참고하세요.
저장소에는 프로젝트 작업을 이해하는 데 필요한 모든 파일과 지침이 포함되어 있습니다. 여기에는 사용자 인터페이스용 HTML 코드와 Web3 라이브러리를 사용하여 ERC20 토큰과 상호 작용하기 위한 Python 코드가 포함되어 있습니다. 저장소는 프로젝트를 이해하고 실행하는 데 대한 포괄적인 가이드 역할을 합니다.
웹 브라우저에서 지갑 실행
다음 단계에 따라 브라우저에서 지갑을 실행해 보겠습니다.
- app.py라는 이름으로 코드를 저장합니다.
- 터미널이나 명령 프롬프트를 엽니다.
- app.py 파일이 저장된 디렉토리로 이동합니다.
- python app.py 명령을 입력하고 Enter 키를 눌러 파일을 실행합니다.
- Flask 애플리케이션이 실행 중임을 나타내는 출력이 표시됩니다. 웹 브라우저를 열고 http://localhost:5000으로 이동하여 애플리케이션과 상호 작용할 수 있습니다.
위 프로그램은 0x6B175474E89094C44Da98b954EedeAC495271d0FDAI Stablecoin의 컨트랙트 주소로 테스트되었습니다. 표시된 잔액은 0입니다. 이는 새로 생성된 계정에 DAI 토큰이 전혀 없음을 나타냅니다. 시장 차트 데이터는 CoinGecko API를 사용하여 표시되며 DAI의 가격 내역을 USD로 나타냅니다.
거래의 경우 사용자는 수신자의 주소와 보낼 이더리움 양을 입력할 수 있습니다. [Send Transaction] 버튼을 클릭하면 수신자의 주소와 금액을 데이터로 엔드포인트 /send_transaction로 POST 요청이 이루어집니다.
고급 암호화폐 지갑 기능 및 추가 고려 사항
이 가이드에서는 기본적인 암호화폐 지갑 개발만 다루고 있지만 지갑 기능을 확장하려는 개발자는 다음 사항을 고려할 수 있습니다.
- 토큰 교환: 한 유형의 토큰을 다른 유형의 토큰으로 교환하는 기능을 구현합니다. 여기에는 Uniswap 또는 SushiSwap과 같은 분산형 교환 프로토콜과의 통합이 포함될 수 있습니다.
- 스테이킹 및 수확량 파밍: 사용자가 토큰을 스테이킹하거나 유동성을 제공하여 보상을 얻을 수 있습니다. 여기에는 다양한 DeFi 프로토콜과의 상호작용이 포함됩니다.
- NFT 지원: NFT(Non-Fungible Token)를 지원하도록 지갑을 확장합니다 . 이를 통해 사용자는 고유한 디지털 자산을 보유하고 전송할 수 있습니다.
CoinGecko 데모 API 기능과 함께 활용할 수 있는 암호화폐 대시보드 구축은 다음과 같습니다.
- 암호화폐 가격 알림: 암호화폐 가격이 특정 수준에 도달하면 사용자에게 알리고 /simple/price 엔드포인트를 사용하여 대시보드에 표시합니다.
- 암호화폐 뉴스 및 동향: /search/* 및 /coins/categories/* 엔드포인트를 사용하여 암호화폐 공간의 최신 뉴스, 인기 코인 및 인기 카테고리를 대시보드에 표시합니다.
- 암호화폐 시장 데이터: /global/* 및 /coins/markets/* 엔드포인트를 사용하여 대시보드에서 시가총액, 거래량, 유동성, 지배력, 심리 등 다양한 시장 데이터를 사용자에게 제공합니다.
Plotly나 Dash와 같은 라이브러리를 사용하여 대시보드용 대화형 차트와 그래프를 만들 수도 있습니다. 고급 기능을 개발하려면 이더리움, 스마트 계약 및 상호 작용하게 될 다양한 프로토콜에 대한 깊은 이해가 필요합니다. 항상 사용자 자금의 보안을 최우선으로 생각하고 블록체인 업계의 모범 사례를 준수하세요.
결론
Web3 Python 라이브러리와 CoinGecko API를 사용하여 이더리움 네트워크용 기본 암호화폐 지갑을 구축하는 것은 블록체인 거래가 어떻게 작동하는지 이해하고 분석하는 좋은 방법입니다. 이 지갑은 스테이킹 또는 교환 기능이 있는 지갑, 다중 네트워크 지원 또는 NFT 데이터 표시와 같은 보다 복잡한 애플리케이션의 기반 역할을 할 수 있습니다.
'Python' 카테고리의 다른 글
데이터 통합을 위한 상위 10개 Python ETL 솔루션 (0) | 2023.12.14 |
---|---|
새로 출시된 장고(Django) 5.0의 주요 특징과 기능 (0) | 2023.12.10 |
모든 프로그래머가 알아야 할 10가지 기본 프로그래밍 원칙 (2) | 2023.12.03 |
Python에서 데이터 분석을 위해 Pandas를 사용하는 방법 (45) | 2023.12.03 |
Python If-Else 문을 사용하는 방법 (2) | 2023.12.01 |