見出し画像

超簡単! PythonによるBSC DeFi bot作り① ~送金する~

納豆男爵です。2021年4月頃からDeFiをさわり始め、6月頃からbot作りを始めました。bot作り歴は非常に浅いですが、初心者向けにPythonによるbotの作り方を紹介します。
Pythonに詳しい方はWeb3.pyの情報をご自身で検索すれば簡単に習得可能かと思いますが、プログラミングに慣れていない人に向けて簡単な操作から紹介していきます。
まずは、Web3.0の超基本操作「送金」から始めます。厳密にはDeFiと関係ないですが、少しずつレベルを上げていきましょう。

※この記事で公開するプログラムを実行することによって資産を失う恐れがあります。この記事によって生じた損失について当方では一切の保証をいたしません。各自の責任によってお試しいただくようお願いいたします。

概要

以下の順番で進めます。すでにPythonコーディング経験・環境のある方は②から読んでください。

①Pythonの実行環境を整える。
②BSCのウォレット情報を取得する。
③送金のコードを動かす。

① Pythonの実行環境を整える

Pythonのインストールについては初心者向けの記事が多数ネットに転がっています。改めてまとめるものでもないので以下に記事を紹介します。
 Pythonの開発環境を用意しよう!(Windows)
上記記事ではPythonをインストールしているだけです。最低限それだけで十分ですが,プログラムを書くためのツールも用意しておくと良いでしょう。例えばエディタとしてVSCodeを用いてPythonプログラムを動かしている記事を紹介しておきます。
 VSCode|Visual Studio CodeでPythonを動かしてみよう!

・・・

無事Hello Worldできましたでしょうか?
Pythonが動くようになったら次はWeb3.pyというライブラリをインストールします。コマンドプロンプトかVSCodeの"ターミナル"で以下のコマンドを入れてライブラリをインストールできます。

pip install web3

試しにWeb3.pyを使ってBSCにつないでみましょう。
以下のコードを適当なファイル(bsc_test.pyとか)に保存して実行してみましょう。

from web3 import Web3

web3 = Web3(Web3.HTTPProvider("https://bsc-dataseed.binance.org/"))
isConnected = web3.isConnected()

if isConnected:
    print('Connected to BSC')

無事'Connected to BSC'と表示されましたか?

② BSCのウォレット情報を取得する

操作する対象のウォレット情報を用意します。
ウォレットアドレスはもちろん、トランザクションの承認に使う秘密鍵も用意しましょう。秘密鍵を表示する方法はそれぞれのウォレットアプリで違います。MetaMaskで秘密鍵を取得するには以下の記事を参考にしてください。
MetaMask(メタマスク)のウォレット使い方
”Export Private Key"から秘密鍵を表示できます。各ウォレットで秘密鍵出力の方法を調べてみてください。SafePalはかなり難しそうなので、出力できなければ新しくMetaMaskでウォレットを作りましょう。秘密鍵は他人に知られてしまうとウォレットの中身をごっそり奪われる危険な情報です。厳密に管理するように気を付けましょう。
ちなみに、今回試すのは送金操作なので送り先のウォレットアドレスもあると良いでしょう。送り先は秘密鍵不要です。

③ 送金のコードを動かす

さぁ 、いよいよ本番です。Pythonのプログラムを書いて送金をしてみましょう。いきなりですが、送金する実際のコードを見てみましょう。以下のコードはウォレットAからウォレットBに0.01BNBを送金しています。

from web3 import Web3

bsc_rpc = "https://bsc-dataseed.binance.org/"

wallet_A = '*** ウォレットAのアドレス ***'
wallet_B = '*** ウォレットBのアドレス ***'
key_A = '*** ウォレットAの秘密鍵 ***'

web3 = Web3(Web3.HTTPProvider(bsc_rpc))

nonce = web3.eth.getTransactionCount(wallet_A)

tx = {
        'nonce': nonce,
        'to': wallet_B,
        'value': web3.toWei(0.01, 'ether'),
        'gas': 25000,
        'gasPrice': web3.toWei('5', 'gwei')
    }

signed_tx = web3.eth.account.sign_transaction(tx, key_A)

tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)

print(web3.toHex(tx_hash))

このコードをいきなり動かしてしまうとウォレットAから0.01BNB消えてしまうので注意が必要です。ガス代も消費されます。試しに動かすにしても慎重に行いましょう。
それでは、上記のコードを順番に解説して行きましょう。

from web3 import Web3

bsc_rpc = "https://bsc-dataseed.binance.org/"

wallet_A = '*** ウォレットAのアドレス ***'
wallet_B = '*** ウォレットBのアドレス ***'
key_A = '*** ウォレットAの秘密鍵 ***'

ここまではライブラリWeb3.pyの呼び出しといくつかの変数を設定しているだけです。BSCのRPCである"https://bsc-dataseed.binance.org/"を変数として持っておきます。送金に使うウォレットアドレスと送金元の秘密鍵も変数にしておきます。
※コードに直接秘密鍵を入れておくのは非常に危険です。クラウドサービスなど他人に見られやすい場所に保存しないよう気を付けましょう。

web3 = Web3(Web3.HTTPProvider(bsc_rpc))

次にBSCに接続させます。RPC部分を変えればETHでもPolygonでも同様につながると思いますが、今回はとにかくBSCです。

nonce = web3.eth.getTransactionCount(wallet_A)

次にnonceを取得します。これはトランザクションの整理番号のようなもので、これが小さい値からトランザクションが処理されます。getTransactionCount関数を使うと送金元のウォレットで次に発行するnonceを取得できます。これを変数としてとっておきましょう。

tx = {
        'nonce': nonce,
        'to': wallet_B,
        'value': web3.toWei(0.01, 'ether'),
        'gas': 25000,
        'gasPrice': web3.toWei('5', 'gwei')
    }

次にトランザクションの中身を記述します。トランザクションに必要な要素をPythonの辞書形式で格納していきます。それぞれの要素の意味は以下の通りです。

・'nonce'  : 先ほどの整理番号
・'to'   : 送信先のアドレス
・'value'   : BNBの送金量
・'gas'    : 送金に用いるガス代の最大量(MetaMaskのガスリミット)
・'gasPrice' : 送金に用いるガス代の最小単位(MetaMaskのガスプライス)

ガス代の設定はMetaMask等のウォレットソフトだと自動で設定されるため、手動で入れるのは悩ましいかと思います。どの程度のガス代が良いのかは状況によるのですが、まずはMetaMask等で自動で入力される値を参考に設定してみてください。ウォレットにBNBが十分にないのに高いガス代を設定してしまうと処理されないので気を付けましょう。
valueはBNBの枚数ではなく最小分割単位の数で指定します。BNBは10^-18の単位(wei)でやりとりできるため、0.01BNBを指定したい場合には0.01×10^18weiを設定する必要があります。この変換を自動でする関数としてtoWei関数が使われています。gasPriceもwei単位での指定が必要ですが、こちらでは5gweiをwei単位に変換しています。(gweiは10^9weiです。意味不明かもしれませんが、各種アプリでgasPriceの設定はgwei単位で表示されるため表示に合わせて数字を切り替えれば問題ありません。)

signed_tx = web3.eth.account.sign_transaction(tx, key_A)

次に作成したトランザクションを秘密鍵を使って承認します。signed_txに承認済みのトランザクション情報が入ります。

tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)

print(web3.toHex(tx_hash))

最後に承認したトランザクションを投げます。tx_hashはトランザクションのハッシュ値です。toHex関数によって16進数表記したものをprintしています。出力されたハッシュ値をBSCScanに入力すれば、今回投げたトランザクションの中身を見ることができます。successと表示されていれば成功です。何らかの理由で失敗(fail)することもあります。失敗時のエラーメッセージを参考にコードを見直してみましょう。

以上でPythonによるBSCでの送金プログラムはおしまいです。MetaMask等を使って普段行っている送金作業がPythonコードからも実行できることが実感できたでしょうか。
DeFi botを作るにはまだまだ序盤です。送金ができたら次はコントラクトの操作にチャレンジしましょう。

この記事が気に入ったらサポートをしてみませんか?