Aptosデジタル資産スタンダード
NFTの概要
NFTは代替不可能なトークン もしくはデータで、ブロックチェーンへ資産の所有権が一位に定義され保存されます。NFTはまずEIP-721へ定義され、後でEIP-1155で拡張されます。 NFTは一般的に以下の項目を使用して定義されます。
name
: 資産の名前。コレクション内で一意である必要が有ります。description
: 資産の説明。uri
: 資産の詳細情報のためのオフチェーンへのURLポインター。資産は画像や動画やメタデータ等のメディアも可能。supply
: このNFTの総ユニット数。多くのNFTはひとつの供給のみですが、複数供給の物はエディションとして参照されます。
殆どのNFTはコレクションや、共通の属性(例えばテーマ、作成者、最小限のコントラクト等)のNFTのセットの一部です。各コレクションは同様の属性のセットが有ります。
name
: コレクションの名前。名前は作成者のアカウト内で一意である必要が有ります。description
: コレクションの説明。uri
: 資産の情報のためのオフチェーンのURLポインター。資産は画像、動画、メタデータ等のメディアが適用可能です。supply
: このコレクション内の NFT の総数。maximum
: このコレクションが保持できる最大のNFT数。maximum
を0で設定した場合、供給は追跡されません。
設計原則
The Aptosデジタル資産スタンダードは、以下の点でAptosトークン標準を改良して構築されました。
- 柔軟性 - NFTは柔軟性があり、あらゆる創造的なデザインに合わせてカスタマイズできます。
- 構成可能性 - 最終的なオブジェクトがその部分の合計よりも大きくなる様、複数のNFTを互いに簡単に構成できます。
- スケーラビリティ - トークン間の並列性の向上
基本のトークンは最小限の機能のみを提供し、より多くの機能が追加されて構築されます。これらの全関数は非エントリーであり、オフチェーンから直接呼び出す事は出来ません。作成者はこれらの機能を使用するかフレームワークのノーコードソリューションを使って自分のモジュールを書き込む必要が有ります。解決策の一つはaptos_tokenで、カスタムメタデータ(プロパティーマップ経由)とソウルバウンド等の機能を提供します。
従来のAptosトークン標準との比較
デジタル アセットは、Moveで以前使用されていたアカウントリソースではなく、Aptosオブジェクトを使用します。これにより、アカウントの外部へデータを強化し、柔軟性が追加されます。
- トークンはフレームワークの変更を要求する事なくカスタムデータと機能を簡単に拡張出来ます。
- 送金は単純な参照の更新です。
- オプトイン無しで直接送金が許可されま す。
- NFTは他のNFTを追加を所有、簡単に構成出来ます。
- ソウルバウンドトークンは簡単にサポートされます。
オブジェクトとしてのコレクションとトークン
このトークン標準では、コレクションとトークンのどちらとも別個のオブジェクトとなります。これらは各自別のアドレスを持ち、オンチェーンでもオフチェーンでもアドレスによって参照出来ます。 各オブジェクトは複数のリソースを含む事が出来、コレクションとトークンはデフォルトで拡張可能で作成者はフレームワークを変更せずカスタムデータと機能を追加出来ます。
オンチェーンでは、別の構造体が以下の様なコレクションやトークンオブジェクトの参照を含む事が出来ます。
struct ReferenceExample has key {
my_collection: Object<Collection>,
my_token: Object<Token>,
}
my_collection
とmy_token
は両方とも(Object<>
ラッパー付き)へ位置します。
オフチェーンでは、オブジェクトのアドレスはトランザクシ ョン作成によって呼び出されるエントリー関数のオブジェクトの引数を交換して渡されます。引数として、例えば
public entry fun my_function(my_collection: Object<Collection>) {
// Do something with the collection
}
コレクションとトークンアドレスは、フルノードAPIを介して全てのリソースを取得、もしくはindexingサービスに対してデータのクエリでも使用されます。
ロイヤリティー
オブジェクトの拡張パターンに従い、ロイヤリティーはコレクションやトークンへ追加されます。ロイヤリティーモジュールが供給する関連機能を持ったリソースとして追加されます。ロイヤリティーはMutatorRef
に限って更新され、保存可能な構造物であり、権限を付与し、作成時間に生成され保存されます。MutatorRef
の保存と使用方法についての例はAptosトークンを御覧下さい。もしコレクションと違うロイヤリティー構成なら、ロイヤリティーはトークン上で直接設定出来ます。
トークンのライフサイクル
全てのデジタルアセットモジュールは予約されたフレームワークアドレス0x4
へデプロイされます。
コレクションの作成
全てのトークンはコレクションへ属します。開発者はまず以下を利用してコレクションを作成する必要が有ります。
- 固定最大供給量。現在の供給は追跡され、最大設定値を超越する事は出来ません。
use aptos_token_objects::collection;
public entry fun create_collection(creator: &signer) {
let max_supply = 1000;
collection::create_fixed_collection(
creator,
"My Collection Description",
max_supply,
"My Collection",
royalty,
"https://mycollection.com",
);
}
- 無制限の供給。現在の供給は追跡されていますが、最大値は強制されません。
public entry fun create_collection(creator: &signer) {
collection::create_unlimited_collection(
creator,
"My Collection Description",
"My Collection",
royalty,
"https://mycollection.com",
);
}
どちらも現在の供給を追跡するのでご注意下さい。コレクションを作成した後は最大供給は変更出来ません。コレクションは無限にコンバート出来ません又は逆に固定供給も出来ません。
コレクションには次の属性があります。
- コレクション名 - 各アカウントで一意。一人の作成者アカウントは同じアカウント名で 複数のコレクションを作成出来ないという意味です。
- 説明 -
MutatorRef
で2048もじ未満で変更可能。 - URIの長さ -
MutatorRef
で512文字未満で変更可能。 - ロイヤリティ - 販売価格の何%を作成者のコレクションへ支払うのか指定する。これはロイヤリティーモジュールで生成される
MutatorRef
で変更出来ます。
MutatorRef
、変更を許可する保存可能な構造体で、コレクションが作成される時のみ生成される。作成されると、MutatorRef
の保有者はdescription
と コレクションのURI length
を変更出来ます。
public entry fun create_collection(creator: &signer) {
let collection_constructor_ref = &collection::create_unlimited_collection(
creator,
"My Collection Description",
"My Collection",
royalty,
"https://mycollection.com",
);
let mutator_ref = collection::get_mutator_ref(collection_constructor_ref);
// Store the mutator ref somewhere safe
}