### ウォレットとして必要な機能
– 秘密鍵、公開鍵の作成、保存
– ブロックチェーン残高の表示
– トランザクションの送信、受信
– ブロックチェーン価格のマーケットデータ表示
※ステーキング、スワッピング、dAppsなど応用機能もある
### 前準備
$ pip install flask
$ pip install web3
$ pip install requests
from aiohttp import request
from flask import Flask, jsonify, render_template, session
from web3 import Web3
import requests
import jsonify
app = Flask(__name__)
infura_url = 'https://mainnet.infura.io/v3/fuga'
app.config['SECRET_KEY'] = 'hoge'
@app.route('/new_account', methods=['GET'])
def new_account():
account = web3.eth.account.create('hogehoge')
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'], 'either'),
'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 = 'coingecho_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(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)
なるほど、walletのエッセンスは理解できました。Pythonでは”web3″のライブラリでかなり抽象化されているのがわかります。
balanceのところはUTXOにするか、Account型にするかで変わってきますね。
マーケットデータは一旦スタック。
テストネット、メインネットの概念はもう少し深掘りする