電通国際情報サービス、オープンイノベーションラボの比嘉康雄です。
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で執筆されました)