電通総研 テックブログ

電通総研が運営する技術ブログ

Web3開発入門 with Algorand-支払い

電通国際情報サービス、オープンイノベーションラボの比嘉康雄です。

Web3開発入門シリーズ with Algorand(アルゴランド)、今回のテーマは、支払いです。

今回の記事のGoogle Colab用のノートブックはこちらになります。ブラウザだけでブロックチェーンに対するコードを、実際に動かしながら試せるので、おすすめです。

Web3開発入門 with Algorandの全てのコンテンツ

今回は、アカウント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を指定していますね。これによりAlgoexplorerTestNetのノードに接続します。

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で執筆されました