見出し画像

初心者必見!プログラミングでブロックチェーンを体験してみよう[Web3py]

はじめに

この記事では、プログラミング言語「Python」と「Web3.py」を使用して、ブロックチェーンとやり取りしていきます。

こちらの記事は有料記事のごく一部を無料公開したものになります。
この記事が面白かったらぜひ有料記事も読んでみてください。

記事の構成
まず初心者でも躓かないようにWeb3.pyやプログラミング環境の説明をしています。


1.Pythonとweb3pyの説明

Web3.pyとは

Web3.pyは、プログラミング言語「Python」でEthereumやその他のEVM(Ethereum Virtual Machine)ベースのブロックチェーンとやり取りするためのライブラリです。

具体的には、Web3.pyを使用することで、PythonのプログラムからEthereumネットワークに接続し、トランザクションの送信やブロックの情報の取得などを行うことができます。
また、スマートコントラクトとのやり取りも可能で、スマートコントラクトの関数を呼び出したり、イベントを監視したりすることができます。

次にPythonを実行する上で、必要な環境構築について話します。



2.環境構築について

今回の記事では、環境構築がかなり楽な「Google Colaboratory」を使っていきます。

2-A「Google Colboratory」にログイン

こちらのリンクからアクセスしてください。

ノートブックを開くというポップアウトがでてくるので、左下の「ノートブックを新規作成」をクリック。

もし新規作成が出てこなかったら、左上の「ファイル」→「ノートブックを新規作成」してください。


2-B 「Google Colboratory」の基本的な使い方

Google colaboratelyはCellと呼ばれる入力フィールドに、プログラムを入力して実行する事が出来ます。
左上の『+ コード』をクリックする事でセルを追加する事が出来ます。

「コーディングを開始するか、AIで生成します。」と書いてあるのがセルです。
こちらをクリックして、早速コードを書いてみましょう。

# 変数を割り当て
food="pizza"

# pizaaと表示
print(food)

Cellを選択して、「Shift + Enter」でプログラムが実行されます。

pizza

と帰ってきたら成功です。
このCellは不要なので消しておきましょう。
Cellをクリックするとゴミ箱マークが出るのでクリックしておいてください。



3. Web3.py基礎

3-A ライブラリのインストールとインポート

今回使うWeb3pyはライブラリといい、いわば拡張機能みたいなものです。
Pythonという本体にオプションが何個もあり、その一つがWeb3pyだと思うとイメージがしやすいと思います。

ライブラリには標準ライブラリと非標準ライブラリがあります。
標準ライブラリはインストールする必要がなく、元から用意されているものになります。
Web3pyは非標準ライブラリなのでインストールする必要があります。
Web3pyをinstall後、他に必要なものと一緒にimportします。

# web3pyをinstall
!pip install web3

# 今回必要なライブラリをimport
from web3 import Web3,HTTPProvider
from web3.middleware import geth_poa_middleware
from eth_account import Account


3-B Web3pyを触ってみる

セルにこれらのコードを入れて実行してみましょう。

最新のブロックの取得

w3.eth.getBlock('latest')

最新のブロックの情報が出て来れば成功です。

現在のガス代を取得

w3.eth.gas_price

現在のガス代が出れば成功です。

さて次の章ではテストネットでBNBの送金に挑戦しましょう。



4 BNBの送金

4-A ブロックチェーンとつながるためにRPCを定義

ネットワーク上で情報の送受信や処理を行うノードとつなぐためにはRPCと呼ばれるものが必要です。
RPCは「MetaMask→設定→ネットワーク」から確認できます。

この章では「BNB Chain Testnet」を用います。
チェーンIDが「97」のやつです。
「新しいRPC URL」に書いてあるURLがRPCになります。
このURLを「ここにRPCを入力してください 」の中に入力してください。

RPC="ここにRPCを入力してください"

私は下記のものを使いました。
人によってRPCのURLは違うかもしれませんが、問題ないです。

RPC="https://data-seed-prebsc-1-s1.binance.org:8545"

下記のコードを実行し、RPCと接続します。

# HTTPプロバイダーを指定してRPCと接続
w3 = Web3(Web3.HTTPProvider(RPC))

# ミドルウェアの注入
w3.middleware_onion.inject(geth_poa_middleware, layer=0)

次にネットワークとつなげているか実行して確認してみましょう。

# コネクトできているならYes 失敗しているならNo
print(w3.is_connected())

# チェーンIDの表示
print(w3.eth.chain_id) 
True 97

が帰ってきたらBsc Testnetと通信できていることが分かります。
エラーが出た場合、RPCの記載が間違っている、あるいは混雑しているのが原因として考えられます。
混雑している場合Chainlistから、チェックマークがついているものをかわりに記述してください。
他のチェーンのRPCにすると、通信先のネットワークが変わります。


4-B アドレスと秘密鍵を割り当てる

ブロックチェーン上でトランザクションを実行するには、そのアカウントに関連付けられたアドレスと秘密鍵が必要です。

今後使いまわしやすいように、生成したアドレスと秘密鍵を変数に割り当てておきます。

# アドレスと秘密鍵を割り当てます
account=w3.to_checksum_address('アドレス')

key="秘密鍵"

アドレスを割り当てるときには
w3.to_checksum_address('生成したアドレス')
としないとエラーが起きます。


4-C Faucet&ガスの確認

ガス代をもらいに行きましょう。
こちらのサイトでアドレスを入力すれば0.3BNBもらえます。


ガスがウォレットに届いたが、残高を取得して確認してみましょう。

#gweiで残高を取得
balance_gwei = w3.eth.get_balance(account)

# 単位をgweiからWeiに変換
balance_wei = w3.from_wei(balance_gwei, 'ether')


# wei
print(balance_wei)
0.3

0.3と表示されていれば、BNBがちゃんと届いています。


4-D BNBの送金

送金先用のアカウントを割り当てて、BNBを送金してみましょう。

# 2つ目のアカウントのアドレスを割り当て
account_2=w3.to_checksum_address('アドレス')

# 2つ目のアカウントの秘密鍵を割り当て
key_2="秘密鍵"

コードを書いていざ送金といいたところですが、コードを書く前にトランザクションを送る過程を理解しましょう。
理解できていないとコードを書く際に混乱してしまいます。


4-E トランザクションの過程

トランザクションを送る過程として、
トランザクションデータを構築→構築したトランザクションデータを秘密鍵で署名→送信という流れになっています。

先にトランザクションの構築に欠かせない要素の一つである「nonce」を解説しておきます。


nonceとは

nonceはいわゆる一意の「トランザクションの番号」で、txにつき一つずつ増えていきます。
この番号を用いて、txの重複チェックが行われています。
まずはnonceを取得しておきましょう。

# nonceの取得
nonce = w3.eth.get_transaction_count(account)

このように記述することで、現在のnonceを取得できます。
nonceはトランザクションごとに必要になります。
トランザクションデータの構築に入ります。


トランザクションデータの構築

トランザクションデータには以下の要素が必要です。

  • ID:ネットワークID

  • from:送信主

  • nonce:トランザクションの番号

  • gasprice: ガスの単価

  • gas: ガスリミット(ガスを払ってもいい上限値)

  • to: 宛先アドレスorコントラクト(コントラクトを実行する場合)

  • value: ガスとは別に使用するETHの量(ネイティブトークン)

  • data: コントラクトに対するトランザクションの場合、呼び出す関数に必要なパラメータ

それぞれ自分が実施したいトランザクションの内容に合わせて値を変える必要があります。
今回は以下のようにしました。


  • chainId
    97 (BNB testnetのID)

  • form
    address(最初に作ったアドレス)

  • nonce
    nonce(先ほど取得)

  • gasprice
    指定してもいいですが、w3.eth.gas_priceとすると現在のガス代を取得してくれます。

  • gas
    100000としておきます。

  • to
    account_2(二つ目のアドレス)

  • value
    0.1

  • data
    0x
    0xは空という意味です。
    空なのはETH(BNB)がネットワーク内の取引に使われるデフォルトの通貨で、BNBの送金は、スマートコントラクトを介さずに直接的に行われるからです。
    ちなみにスマートコントラクトの関数を呼ぶ必要があるのに、空にしたら失敗します。

# トランザクションの構築
transaction = {
    'chainId': 97,                          # チェーンID。実行されるブロックチェーンの識別子
    'nonce': nonce,                         # nonce:トランザクションの一意の識別子。
    'from':account,             # from:txの送り主
    'to': account_2,                        # to:送金先、コントラクトアドレス
    'value': w3.to_wei(0.1, 'ether'),       # value:送信されるETHの量(wei単位)
    'gasPrice': w3.eth.gas_price,           # gasprice:ガスの単価。トランザクションのガス価格(wei単位)
    'gas': 100000,                          # gas:トランザクションのガス上限値
    'data': '0x'                            # データ:コントラクト関数の呼び出しに必要なデータ
}

次にトランザクションの署名と送信を行います。


トランザクションの署名と送信

# トランザクションの署名
signed_tx = w3.eth.account.sign_transaction(transaction, private_key=key)

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

# トランザクションを表示
print(w3.to_hex(tx_hash))

トランザクションが表示されたら、
2つ目に作ったアカウントの数量を見てみましょう。

# 二つ目のアカウントの数量
balance_gwei = w3.eth.get_balance(account_2)

# 単位をgweiからWeiに変換
balance_wei = w3.from_wei(balance_gwei, 'ether')

# wei
print(balance_wei)
0.1

0.1と表示されれば0.1bnbを送信できています。
Ctrl + s 」でファイルを保存できます。

今回作ったコードをアップロードしておくので躓いたら読んでください。


5 最後に

有料記事では、PancekeswapでSwap・My shellでSwap,Stakeしています。
よろしければ読んでください。


よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!