電通国際情報サービス、オープンイノベーションラボの比嘉康雄です。
Web3開発入門シリーズ with Algorand(アルゴランド)、今回のテーマは、アセットの作成です。
今回の記事のGoogle Colab用のノートブックはこちらになります。ブラウザだけでブロックチェーンにアクセスするコードを、実際に動かしながら試せるので、おすすめです。
Ethereumなどのブロックチェーンでは、貨幣的な価値を持つトークンであるFungible Token(FT)や代替不可能なトークンであるNon Fungible Token(NFT)が存在します。Algorandでは、FTとNFTを統合したものをアセットと呼んでいます。
もう一つ理解しておきたいことは、Algorandのアセットは、Ethereumのようにスマートコントラクトではないということです。
アセットに対する基本的な操作は、Algolandの機能として実装されているので、個別のアセットで実装する必要がないのです。
もちろん、アセット固有のロジックがある場合は、スマートコントラクトで個別に実装することもできます。
Web3開発入門 with Algorandの全てのコンテンツ
- py-algorand-sdkのインストール
- アカウントの作成
- アカウントにAlgorand Dispenserを使って入金する
- AlgodClientオブジェクトの作成
- AssetConfigTxnオブジェクトの作成
- 署名
- トランザクションを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を指定しています。これによりAlgoexplorerのTestNetのノードに接続します。
AssetConfigTxnオブジェクトの作成
アセットを作成するためには、AssetConfigTxnオブジェクトを作成します。
AssetConfigTxnオブジェクトを作成するときのパラメータを説明します。
asset_nameは、アセットの名前です。32バイト以内である必要があります。
unit_nameは、アセットの単位名です。8バイト以内である必要があります。
totalは、どれだけアセットを作成するか指定します。例えば、1000000を指定した場合、百万個のアセットを作成することになります。
decimalsは小数点以下の桁数です。例えば、3を指定した場合、このアセットの最小の単位は、0.001になります。
ややこしいのは、totalがdecimalsの影響を受けることです。totalが1000000でdecimalsが3の場合、市場に流通するアセットは1000.000になります。
decimalsが3の場合、アセットの最小単位は、0.001なので、それがtotalで1000000個、市場に出回るので、市場で流通するアセットの量は、0.001 x 1000000で1000.000になるということです。
default_frozenについて説明する前に、アセットの凍結(frozen)について説明します。
アカウントAがアセットZを2つ作成し、一つをアカウントBに、もう一つをアカウントCに売ったとします。その後、アカウントBが良くない行動をとっていることが判明したため、アカウントBのアセットZを凍結します。
凍結されたアセットZは、売ることができなくなります。
アセットの凍結はアカウント単位です。アカウントBのアセットZは凍結されているので、売ることはできませんが、アカウントCのアセットZは自由に売ることができます。
default_frozenにTrueを指定すると、凍結された状態でアセットが作成されます。
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のサイトにアクセスし、一番上の真ん中の検索エリアにコピーして実行してください。
真ん中の方にTransactionsとAssetsのタブがあるので、Assetsのタブをクリックします。
先ほど作成したアセットのBalanceが1000になってますね。
なにか感想があれば、Twitterで@yasuo_algoにメンションしてつぶやいてください。
仲間募集
私たちは同じグループで共に働いていただける仲間を募集しています。
現在、以下のような職種を募集しています。

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



