Python派の私がDapp開発でよく利用するツール

## 一覧

|ツール名|概要|
|--|--|
|[Vyper](https://docs.vyperlang.org/)|スマートコントラクトを記述するPythonライクな言語|
|[web3.py](https://docs.vyperlang.org/)|ブロックチェーンとのやり取りに関するメソッドを提供するPythonライブラリ|
|[Ethers.js](https://docs.ethers.org/)|web.pyのJavaScript版。フロントエンド開発で使う。|
|[Brownie](https://eth-brownie.readthedocs.io/)|スマートコントラクト開発のためのPythonペースなフレームワーク|
|[Alchemy](https://www.alchemy.com/)|DApp開発に関する多様なサービス群|
|Sepolia|公開されているEthereumのテストネットワーク|
|[Sepolia Testnet Explorer](https://sepolia.etherscan.io/)|Sepoliaのトランザクションを閲覧できるWebサービス|
|[MetaMask](https://docs.metamask.io/wallet/)|JavaScriptメソッドを提供するツール。MetaMaskログイン機能などには必要となる|
|[Vercel](https://vercel.com/)|手軽なデプロイを支援するサービス|
|[Animate.css](https://animate.style/)|アニメーション関連のクラスを提供するCSSライブラリ|

以下、もう少し詳しい紹介です。

## Vyper
https://docs.vyperlang.org/

スマートコントラクトを記述するPythonライクな言語。
スマートコントラクトの言語で有名なのは[Solidity](https://solidity-jp.readthedocs.io/ja/latest/#)だが、構文がJavaScriptやC++に似ている。一方でVyperはPythonに似た構文で、Pythonデベロッパーであれば、学習コストを抑えられる。

👇例えば、架空のトークンの送信を記述したVyperコードはこちら

```token.vy
# @version 0.3.7

event Transfer:
    sender: address
    receiver: address
    value: uint256

totalSupply: public(uint256)
balances: public(HashMap[address, uint256])

@external
def __init__(total_supply: uint256):
    assert total_supply > 0

    self.totalSupply = total_supply
    self.balances[msg.sender] = total_supply

@external
def transfer(receiver: address, val: uint256) -> bool:
    assert self.balances[msg.sender] >= val

    self.balances[msg.sender] -= val
    self.balances[receiver] += val

    log Transfer(msg.sender, receiver, val)
    return True
```


## web3.py
https://web3py.readthedocs.io/

ブロックチェーンとのやり取りに関するメソッドを提供するPythonライブラリ。
トランザクションの送信や、スマートコントラクトとのやり取り、ブロックデータの読み込みなどの関数やクラスを提供する。

👇例えば、スマートコントラクトをSepoliaにデプロイする時のpythonスクリプトはこちら。インポートしている`Web3`がweb3.py。

```deploy_to_sepolia.py
import json
import os
from web3 import Web3
from dotenv import load_dotenv

# .env読み込み
load_dotenv()

# Web3クラスのインスタンス作成
NODE_URL = os.getenv("ALCHEMY_URL")
w3 = Web3(Web3.HTTPProvider(NODE_URL))

# スマートコントラクトのインスタンス作成
contract_compiled_file = "../contracts/token.json"

with open(contract_compiled_file, "r") as file:
    data = json.load(file)
    
bytecode = data["token.vy"]["bytecode"]
abi = data["token.vy"]["abi"]

contract = w3.eth.contract(bytecode=bytecode, abi=abi)

# トランザクションの構築
total_supply = 10000
account = os.getenv("METAMASK_ACCOUNT")
nonce = w3.eth.get_transaction_count(account)
tx = contract.constructor(total_supply).build_transaction({'from': account, 'nonce': nonce})
 
# トランザクションの署名
private_key = os.getenv("METAMASK_PRIVATE_KEY")
signed_tx = w3.eth.account.sign_transaction(tx, private_key)

# トランザクションの送信
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)

# トランザクションの完了待ち
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
```

## Ethers.js
https://docs.ethers.org/

ブロックチェーンとのやり取りに関するメソッドを提供するJavaScriptライブラリ。
フロントエンドからサーバを介さずにブロックチェーンにアクセスするには、どうしてもJavaScriptが必要となる。

👇例えば、ユーザーのMetaMaskアカウントを取得するスクリプトはこちら。

```app.js
import { ethers } from "https://cdnjs.cloudflare.com/ajax/libs/ethers/6.7.0/ethers.min.js";

// ブロックチェーンとやり取りするインスタンスを作成
const provider = new ethers.BrowserProvider(window.ethereum);

// signerオブジェクト取得
const signer = await provider.getSigner();

// アカウント取得
const signerAccount = await signer.getAddress();
```

## Brownie
https://eth-brownie.readthedocs.io/

スマートコントラクト開発のためのPythonベースなフレームワーク。

- スマートコントラクトのコンパイル
- コンソールでのスマートコントラクトの動作確認
- スマートコントラクトのテストスクリプト作成
- スマートコントラクトのデプロイ

などを、シンプルなコマンドで実施できる。有名なのは[Hardhat](https://hardhat.org/)だが、JavaScriptベースのフレームワークなので、スクリプトもJavaScriptで書かなきゃいけない。一方でBrownieは、Pythonベースのフレームワーク。Pythonデベロッパーであれば、学習コストを抑えられる。

例えば、以下のようなコマンドを実行すると、Brownieコンソールが起動し、Ganacheと呼ばれるローカル環境でのブロックチェーンが立ち上がり、スマートコントラクトの関数を実行できる。

Brownieコンソールの起動
```terminal
brownie console
```

スマートコントラクトのインスタンス化
```
>>> contract = token.deploy(10000, {'from': accounts[1]})
```

transfer関数の実行
```
>>> contract.transfer(accounts[2], 100, {'from': accounts[1]})
```

## Alchemy
https://www.alchemy.com/

DApp開発に関する多様なサービス群。
例えば、以下のような用途でAlchemyを利用できる。

- ブロックチェーンノードの構築
- テストネットワークのETH取得
- Dappに対するリクエスト数のモニタリング

※ブロックチェーンノードの構築に関しては、[Infura](https://www.infura.io/)というサービスも有名。

## Sepolia / Sepolia Testnet Explorer
https://sepolia.etherscan.io/

Sepoliaは、Ethereumブロックチェーンのテストネットワーク。
テストネットワークと言えど、全世界に公開されており、誰でもスマートコントラクトをSepoliaにデプロイし、運用できる。
Sepolia Testnet Explorerは、Sepolia上での取引情報を確認できるWebサービス。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163239/7ccb0316-b0f6-2bed-fd81-38441a282e6f.png)


Ethereumブロックチェーン上のDapp開発では、一例として次のように開発プロセスを進める。

1. ローカル環境のブロックチェーン"Ganache"にスマートコントラクトをデプロイしてテスト
1. テストネットワークの"Sepolia"にスマートコントラクトをデプロイしてテスト
1. Ethereumメインネットにスマートコントラクトをデプロイしてテスト

## MetaMask
https://docs.metamask.io/wallet/

MetaMaskは、仮想通貨のウォレットとして有名だが、JavaScriptメソッドを提供するツールでもある。MetaMaskログイン機能の実装などには必要となる。

👇例えば以下は、MetaMaskのウォレットアドレスの提供をユーザーに要求するリクエスト

```
await window.ethereum.request({"method": "eth_requestAccounts"});
```

## Vercel
https://vercel.com/

デプロイを支援するサービス。
GitHub（GitLab, BitbucketもOK）と連携するだけで、フロントエンドやAPIをデプロイできる。Dapp開発では、スマートコントラクトをブロックチェーンにデプロイするため、Webへのデプロイはフロントエンドのみとなるケースが多い。ここで、Vercelが用いられることが多い。

## Animate.css
https://animate.style/

アニメーション関連のクラスを提供するCSSライブラリ。多くの場合、ブロックチェーンへのトランザクションは数秒以上の時間がかかります。アニメーションをうまく活用して、待ち時間をいかに伝えるかは、ユーザビリティーの観点で大切なポイントです。

[![Image from Gyazo](https://i.gyazo.com/6e15c207cda951e4e428d125097cd86f.gif)](https://gyazo.com/6e15c207cda951e4e428d125097cd86f)

## おまけ：Pythonライクなツールを利用したDapp開発のUdemyコース
以上のツールを利用したDapp開発のUdemy講座を作りました。JavaScriptが苦手な私は、DApp開発を勉強する時に勉強に苦労しました。Python派の方にとって、すこしでもスムーズに勉強できればと思い、この講座を作りました。Vyperでスマートコントラクトを記述するところまで無料公開しています。もしご興味あれば、ぜひご視聴ください😊

https://www.udemy.com/course/dapp-vyper/?referralCode=D50B5400D6DD442667C2