Python+Web3.pyでEthereumコントラクト学習 (その2)

Python

はじめに

Python + Web3.pyでEthereumを学習する記事、その2です。

その1では、「Web3.pyとは」「アカウント残高の取得」「スマートコントラクト(ERC-20 トークン)情報の取得」を記事化しました。その2では、「Ethereumの送金」を実施します。

Ethereumの送金

ではいよいよイーサリアムの送金です!とはいっても、価値のあるイーサリアムを実際に使うわけではなく、テスト用のイーサリアム(価値がない)を使っての実験ですので、ご安心ください。

プライベートブロックチェーンネットワークの作成

さて、テスト送金を行うには様々な方法がありますが、今回は、PC内にプライベートブロックチェーンネットワークを構築できる、「Ganache」というアプリケーションを使ってみましょう。

Ganache - Truffle Suite
Quickly fire up a personal Ethereum blockchain which you can use to run tests, execute commands, and inspect state while controlling how the chain operates.

上記のサイトより、アプリケーションをダウンロード、インストールしてください。その後アプリケーションを起動すると、以下のように選択肢が出ますので、「QUICKSTART」を選びましょう

そうすると、以下のように、10個のアドレスと残高等が自動的に用意されます。とても便利ですね。

これらのアドレスの中からどれでもよいので「送信元アドレスとプライベートキー(秘密鍵)」、「送信先アドレス」を決めておきましょう。秘密鍵は、一番右側の鍵マークを押すことで得ることができます。現在はどのアドレスも、残高は100ETHですね。

これで、テスト用のプライベートブロックチェーンネットワークの用意が完了しました。アクセスするためのURLは、画面上部の「RPC SERVER」に記載されている「http://127.0.0.1:7545」になります。

Ethereumの送金

それでは、用意したネットワークを使って、イーサリアムを送金するためのスクリプトを見てみましょう。

# 1. Import Module
import json
from web3 import Web3

# 2. Access Ganache local server
ganache_url = "http://127.0.0.1:7545"
web3 = Web3(Web3.HTTPProvider(ganache_url))

# 3. Account Address, private key
account_0   = '' # Input selected Address
account_1   = '' # Input selected Address
private_key = '' # Input selected Address's private key

# 4. Get nonce value
nonce = web3.eth.getTransactionCount(account_0)

# 5. Transaction data
tx = {
    'nonce': nonce,
    'to': account_1,
    'value': web3.toWei(1, 'ether'),
    'gas': 2000000,
    'gasPrice': web3.toWei('50', 'gwei'),
}

# 6. Generate singed transaction data
signed_tx = web3.eth.account.signTransaction(tx, private_key)

# 7. Ethereum Transaction
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)

# 8. Check Transaction address
print(web3.toHex(tx_hash))

2.にて、GanacheのURLを設定し、web3オブジェクトを取得しています。

3.では、送金元アドレスと秘密鍵、送金先アドレスを記入します。

4.で、アドレスの「ナンス値」を取得します。ナンス値とは、そのアドレスでトランザクションが行われた回数を示しています。現在のアドレスは送金をしていないので、ゼロが入力されます。ちなみに、このナンス値をトランザクションに含めることで、送受信の順番や重複エラーのチェックが行われています

5.はトランザクションのためのデータです。ナンス値、送金先アドレス、送金量(1 ETH)、ガスリミット(2000000)、ガス代金(予定)、を入力します。

6.にて、トランザクションデータとプライベートキーを用いて、データに署名を行います。署名データとは、実際に秘密鍵を有する所有者がこのトランザクション(送金)を行っていることを証明するために付加するデータです。はんこみたいなものですね。

7.にて、イーサリアムの送金が実行されます。署名データとトランザクションデータ、および秘密鍵から生成された公開鍵が、ネットワークに送信されます。ネットワークは、署名データを公開鍵を用いて復号し、データが正当な所有者から送信されていることを確認後、ネットワークにトランザクションを記録します。

8.ではトランザクションIDをサンプルとして出力しています。

0x11bf06154ad50230f9058d2e412fabb57d814569768f60686c500a24b952788e

トランザクション結果の確認

それでは、Ganacheの画面のほうに戻って、送金元アドレス、送金先アドレスのETH残高を確認してみましょう。アドレス0が99ETHになって、アドレス1が101ETHになっていますね!無事に送金することができたようです。

続いて、「LOGS」タブを確認してみましょう。さきほど確認したトランザクションIDにて、トランザクションが行われていることがこちらでも確認ができますね。

[19:24:54] eth_sendRawTransaction
[19:24:55]   Transaction: 0x11bf06154ad50230f9058d2e412fabb57d814569768f60686c500a24b952788e
[19:24:55]   Gas usage: 21000
[19:24:55]   Block Number: 1
[19:24:55]   Block Time: Tue Sep 05 2021 19:24:55 GMT+0900 (日本標準時)
[19:24:55] eth_getBlockByNumber

まとめ

この記事では、テスト用のプライベートブロックチェーンを構成し、イーサリアムを実際に送金するというプログラムを動かしてみました。実際に送金が成功すると、なんだかこの上ない喜びを感じたのは私だけでしょうか笑

次回は最後になりますが、「スマートコントラクト関数の実装、呼び出し」をやっていきます。

タイトルとURLをコピーしました