電通国際情報サービス、オープンイノベーションラボの比嘉康雄です。
Web3開発入門シリーズ with Algorand(アルゴランド)、今回のテーマは、支払い
です。
今回の記事のGoogle Colab用のノートブックはこちらになります。ブラウザだけでブロックチェーンに対するコードを、実際に動かしながら試せるので、おすすめです。
Web3開発入門 with Algorandの全てのコンテンツ
- py-algorand-sdkのインストール
- アカウントAの作成
- アカウントAにAlgorand Dispenserを使って入金する
- アカウントBの作成
- ALGO残高の確認
- AlgodClientオブジェクトの作成
- PaymentTxnオブジェクトの作成
- 署名
- トランザクションをAlgorandに送る
- トランザクションが確定するのを待つ
- ALGO残高の再確認
- まとめ
- 仲間募集
今回は、アカウントAからアカウントBに1 ALGO
を支払う支払いトランザクションを実行してみましょう。
py-algorand-sdkのインストール
py-algorand-sdk
をインストールします。
下記のコードを実行してください。
!pip3 install py-algorand-sdk
アカウントAの作成
アカウントAを作成しましょう。
下記のコードを実行してください。
from algosdk import account a_private_key, a_address = account.generate_account() print("AccountA Address:", a_address)
出力結果の例です
AccountA Address: QLK6LJT2CWOV5XIILG5XRSM6QLOMLYG77YLE3F5EFIQU37BY3WKL2HPYEM
アカウントAにAlgorand Dispenserを使って入金する
アカウントAがアカウントBに送金するためには、ALGO
の残高がなければいけません。
TestNet
では、Algorand Dispenserのサイトで、ALGO
を無料でゲットできます。
AccountA Address:
の後ろの部分のアドレスをコピーしてください。
Algorand Dispenserのサイトにアクセスし、I'm not a roboot
をチェックし、target address
の入力エリアに先ほどコピーしたアドレスをペーストします。
Dispense
のボタンをクリックしてください。
Status: Code 200 success
のように表示されればOKです。
アカウントBの作成
アカウントBを作成しましょう。
下記のコードを実行してください。
from algosdk import account b_private_key, b_address = account.generate_account() print("AccountB Address:", b_address)
出力結果の例です。
AccountB Address: JO7RPRV36UVWWEAUA5JMXTPX62REHXFY5EYGNX3RBCSCITOO76PZCI2Y6E
ALGO残高の確認
アカウントAとアカウントBの残高を確認してみましょう。
TestNetのAlgoexplorerのサイトにアクセスし、一番上の真ん中の検索エリアに、アカウントAのアドレスをコピー&ペーストして実行してください。
Balances(残高)に10
と表示されていますね。
アカウントBの残高も同様に確認してみましょう。一度、ブラウザでページをリロードし、アカウントBのアドレスをコピー&ペーストして実行してください。ページをリロードしないとたまに変になることがあります。
Balances(残高)は-
つまり0
ですね。
AlgodClientオブジェクトの作成
Algorand
にアクセスするために、AlgodClient
オブジェクトを作成します。
下記のコードを実行してください。
from algosdk.v2client.algod import AlgodClient algod = AlgodClient("", "https://node.testnet.algoexplorerapi.io:443")
AlgodClient
オブジェクトを作成するときに、https://node.testnet.algoexplorerapi.io:443
を指定していますね。これによりAlgoexplorer
のTestNet
のノードに接続します。
PaymentTxnオブジェクトの作成
あるアカウントが別のアカウントへALGOを支払うためには、PaymentTxn
オブジェクトを作成します。
下記のコードを実行してください。
from algosdk.future.transaction import PaymentTxn sp = algod.suggested_params() txn = PaymentTxn(sender=a_address, sp=sp, receiver=b_address, amt=1000000)
このトランザクションの差出人(sender)はアカウントA(a_address)です。
このトランザクションの受取人(receiver)はアカウントB(b_address)です。
金額(amt)は、1000000 micro ALGO = 1.0 ALGOになります。
spは気にしなくても大丈夫です。
署名
トランザクションは、確かに差出人はアカウントAであるということと、トランザクションが作成されてから変更されていないことを検証するために、そのアカウントの秘密キーで署名をする必要があります。
下記のコードを実行してください。
signed_txn = txn.sign(a_private_key)
アカウントAの秘密キー(a_private_key)で署名(sign)していますね。
トランザクションをAlgorandに送る
署名したトランザクションをAlgorand
に送り出しましょう
それを行うのが、AlgodClientオブジェクト.send_transactions()
になります。
下記のコードを実行してください。
tx_id = algod.send_transactions([signed_txn])
トランザクションをAlgorand
に送るとトランザクションID(tx_id)がふられ、Algoexplorer
などで検索可能になります。正確には、次で説明するトランザクションの確定後、検索可能になります。
トランザクションが確定するのを待つ
トランザクションをAlgoland
に送っても、それでトランザクションが確定されたわけではありません。トランザクションがブロックに取り込まれるのを待つ必要があります。
Algorand
の場合、トランザクションがブロックに取り込まれた
== トランザクションが確定された
という意味になります。
Algorand
の場合、3.8秒ほどでトランザクションが確定します。
トランザクションが確定されるのを待つには、wait_for_confirmation()
を呼び出します。
下記のコードを実行してください。
from algosdk.future.transaction import wait_for_confirmation wait_for_confirmation(algod, tx_id, 10)
3つ目の引数の10は、どれくらいのラウンドを待つのかの指定になります。ここで指定されたラウンドでトランザクションが確定しない場合、wait_for_confirmation()
の呼び出しから処理が返ってきます。Algorand
に何らかの問題があったときに、無限に待ち続けないためのパラメータです。
ラウンドとは、一つのブロックが作成される時間帯です。前のブロックが作成されてから、今回のブロックが作成されるまでの時間が一つのラウンドになります。
ALGO残高の再確認
アカウントAとアカウントBの残高をもう一度確認してみましょう。
TestNetのAlgoexplorerのサイトにアクセスし、一番上の真ん中の検索エリアに、アカウントAのアドレスをコピー&ペーストして実行してください。
Balances(残高)に8.999
と表示されていますね。
10
の状態から、1
支払ったので、9
になりそうですが、0.001
足りません。
0.001
はトランザクション手数料として支払った分です。
アカウントBの残高も同様に確認してみましょう。一度、ブラウザでページをリロードし、アカウントBのアドレスをコピー&ペーストして実行してください。ページをリロードしないとたまに変になることがあります。
Balances(残高)は予想通りに1
と表示されていますね。
まとめ
今回は、支払い
を学びました。
トランザクションを作成した後の、「トランザクションに署名する」、「署名したトランザクションをAlgorand
に送り出す」の処理はどのトランザクションでも同じです。
トランザクション処理の山は今回でこえましたよ。
なにか感想があれば、Twitter
で@yasuo_algo
にメンションしてつぶやいてください。
次回は、アセットの作成です。
仲間募集
私たちは同じグループで共に働いていただける仲間を募集しています。
現在、以下のような職種を募集しています。
執筆:@higa、レビュー:Ishizawa Kento (@kent) (Shodoで執筆されました)