電通総研 テックブログ

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

Web3開発入門 with Algorand-アセットの作成

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

Web3開発入門シリーズ with Algorand(アルゴランド)、今回のテーマは、アセットの作成です。

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

Ethereumなどのブロックチェーンでは、貨幣的な価値を持つトークンであるFungible Token(FT)や代替不可能なトークンであるNon Fungible Token(NFT)が存在します。Algorandでは、FTNFTを統合したものをアセットと呼んでいます。

もう一つ理解しておきたいことは、Algorandのアセットは、Ethereumのようにスマートコントラクトではないということです。

アセットに対する基本的な操作は、Algolandの機能として実装されているので、個別のアセットで実装する必要がないのです。

もちろん、アセット固有のロジックがある場合は、スマートコントラクトで個別に実装することもできます。

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

これから、アセットを作成します。

py-algorand-sdkのインストール

py-algorand-sdkをインストールします。

下記のコードを実行してください。

!pip3 install py-algorand-sdk

アカウントの作成

アセットを作成するアカウントを作成しましょう。

下記のコードを実行してください。

from algosdk import account

private_key, address = account.generate_account()
print("Account Address:", address)

出力結果の例です。

Account Address: H7BCYZGX4J6QKXEG5TYMMVQVSTRHWL4WWQQVBGH725HHIYL2R72RDSMNN4

アカウントにAlgorand Dispenserを使って入金する

アセットを作成するためには、トランザクション手数料を払う必要があります。

TestNetでは、Algorand Dispenserのサイトで、ALGOを無料でゲットできます。

Account Address:の後ろの部分のアドレスをコピーしてください。

Algorand Dispenserのサイトにアクセスし、I'm not a robootをチェックし、target addressの入力エリアに先ほどコピーしたアドレスをペーストします。

Dispenseのボタンをクリックしてください。 Status: Code 200 successのように表示されればOKです。

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のノードに接続します。

AssetConfigTxnオブジェクトの作成

アセットを作成するためには、AssetConfigTxnオブジェクトを作成します。

AssetConfigTxnオブジェクトを作成するときのパラメータを説明します。

asset_nameは、アセットの名前です。32バイト以内である必要があります。

unit_nameは、アセットの単位名です。8バイト以内である必要があります。

totalは、どれだけアセットを作成するか指定します。例えば、1000000を指定した場合、百万個のアセットを作成することになります。

decimalsは小数点以下の桁数です。例えば、3を指定した場合、このアセットの最小の単位は、0.001になります。

ややこしいのは、totaldecimalsの影響を受けることです。total1000000decimalsが3の場合、市場に流通するアセットは1000.000になります。

decimalsが3の場合、アセットの最小単位は、0.001なので、それがtotal1000000個、市場に出回るので、市場で流通するアセットの量は、0.001 x 10000001000.000になるということです。

default_frozenについて説明する前に、アセットの凍結(frozen)について説明します。

アカウントAがアセットZを2つ作成し、一つをアカウントBに、もう一つをアカウントCに売ったとします。その後、アカウントBが良くない行動をとっていることが判明したため、アカウントBのアセットZを凍結します。

凍結されたアセットZは、売ることができなくなります。

アセットの凍結はアカウント単位です。アカウントBのアセットZは凍結されているので、売ることはできませんが、アカウントCのアセットZは自由に売ることができます。

default_frozenTrueを指定すると、凍結された状態でアセットが作成されます。

managerには、作ったアセットを修正したり、削除したりすることができるアドレスを指定します。

reserveは、ほとんど使われていないので、気にしなくても大丈夫です。

frozenには、作ったアセットを凍結することのできるアドレスを指定します。

clawbackには、作ったアセットを自由に移動(Transfer)させることのできるアドレスを指定します。

このclawbackは非常に強力で、アカウントAがアカウントCにアセットを売ったあと、アカウントCが持っているアセットを強制的にアカウントAのものにすることもできます。

さらに、強力なことに、凍結されたアセットも自由に動かすことができます。

ただし、clawbackは悪いことをするために用意されているわけではなく、スマートコントラクトのaddressを指定することがよく行われます。

特定の条件を満たしたときだけ、スマートコントラクトがアセットを移動できるようにするためです。

それでは、AssetConfigTxnオブジェクトを作成しましょう。

下記のコードを実行してください。

from algosdk.future.transaction import AssetConfigTxn

sp = algod.suggested_params()

txn = AssetConfigTxn(
    sender=address,
    sp=sp,
    asset_name="Test",
    unit_name="Test",
    total=1000,
    decimals=0,
    default_frozen=False,
    manager=address,
    reserve=address,
    freeze=address,
    clawback=address,
)

署名

トランザクションは、差出人の秘密キーで署名をする必要があります。

下記のコードを実行してください。

signed_txn = txn.sign(private_key)

トランザクションをAlgorandに送る

署名したトランザクションAlgorandに送り出しましょう

それを行うのが、AlgodClientオブジェクト.send_transactions()になります。

下記のコードを実行してください。

tx_id = algod.send_transactions([signed_txn])
print('Transaction ID:', tx_id)

トランザクションが確定するのを待つ

トランザクションAlgolandに送っても、それでトランザクションが確定されたわけではありません。トランザクションが確定されるのを待つ必要があります。

トランザクションが確定されるのを待つには、wait_for_confirmation()を呼び出します。

下記のコードを実行してください。

from algosdk.future.transaction import wait_for_confirmation

wait_for_confirmation(algod, tx_id, 10)

アセットの確認

Algoexplorerでアセットを確認してみましょう。 アカウントのアドレスをコピーしてください。

TestNetのAlgoexplorerのサイトにアクセスし、一番上の真ん中の検索エリアにコピーして実行してください。

真ん中の方にTransactionsAssetsのタブがあるので、Assetsのタブをクリックします。

先ほど作成したアセットのBalance1000になってますね。

なにか感想があれば、Twitterで@yasuo_algoにメンションしてつぶやいてください。

仲間募集

私たちは同じグループで共に働いていただける仲間を募集しています。
現在、以下のような職種を募集しています。

執筆:@higa、レビュー:Ishizawa Kento (@kent)Shodoで執筆されました