独自EXTトークン作成ツール「EXT Token Tool」|EXT-ExtendableToken規格について
この記事は「Deploy your tokens for free using our EXT standard and new online interface」「Toniq-Labs/extendable-token」を日本語翻訳した記事です。
ToniqLabsで構築しているものの1つ(そして-助成金を受けています-みんなありがとう!)はEXT-ExtendableToken規格です。ここで何度か言及したことは知っていますが、ユーザーと開発者に多大なメリットをもたらすと思われるユースケースについて説明したいと思います。
私たちの規格は、マルチトークン規格であるERC1155(実際にはそれに基づいています)に似ています。これは、単一のキャニスターから実行するトークン、NFT、または従来のトークンをいくつでも持つことができることを意味します。VM / VPSを考えてください-1つの専用マシンから実行される複数の仮想マシン。
・ポイント
1 ストレージコストの削減(コードベースの1インスタンス)
2 同じキャニスター上のトークンなど、「sister」トークンとの相互運用性が向上します。1回のアトミックコールで交換を完了できます。
3 上記のようなもののためのより低い計算コスト
4 キャニスターのセキュリティ監査を1回完了するだけで済みます
いくつかの欠点があります-最大のものは誰がサイクルにお金を払うのですか?これはチェーンでも処理できるものだと信じています(そしてすでにソリューションを構築しています)-特定のトークンにtx料金を請求し、LP / AMMを使用してサイクル/ WTCと交換します。
独自のトークンをデプロイするために使用できるキャニスターをデプロイしました:https://k6exx-uqaaa-aaaah-qadba-cai.raw.ic0.app/ 51
トークンの作成コストは6000万サイクル未満なので、お楽しみください!
EXTインターフェイスを使用してこのトークンを統合できます。また、これを支援するライブラリとCLIツールを開発しています。Stoicにトークンを追加して、統合も確認します。
The extendable token standard
このトークン規格は、トークンの目的に基づいて機能を追加できる拡張機能を備えたERC1155 /マルチトークンのようなアプローチを提供します。EXT Standardでは、次の機能が可能です。
① 1つのキャニスター内の複数のトークン(代替可能と代替不可能などの組み合わせ)。これにより、計算/ガスの節約が向上し、複雑さを軽減できます。
②より合理化された使用法のための一括転送通知(例:transferAndCallと同様)。
③ ネイティブのAccountIdentifiers(64個の長い16進文字列)とプリンシパルの両方をサポートします。 EXTは、両方のアドレススタイルとうまく統合されているため、エンドユーザーが簡単に操作できます。
④ トークンとの通信方法の決定を支援するためにトークンの機能を照会するメソッドを備えた拡張可能な規格(サードパーティツールとのより良い統合)。
⑤ キャニスターIDとキャニスター内のトークンインデックスを使用して構築されたキャニスター(例:cnvzt-kikor-uwiaa-aaaaa-b4aah-eaqca-aaaaa-a)を使用して、トークンごとに一意のTokenIdentifierが生成されます。 0インデックストークンを指すキャニスターIDを使用することもできます(erc20の例のように単一のトークンがある場合に最適です)
⑥ WIP:交換メカニズムをコアトークン規格に直接組み込むために、exchangeという名前の新しいコアエントリポイントを構築します
これが私たちが取り組んでいる初期の拡張機能のいくつかです:
allowance-ERC20のようなアローワンス
archive-トランザクションアーカイブ
batch-バッチ転送/バランス機能
common-いくつかの一般的なトークンメソッド(メタデータ、サプライ)
fee-規格料金を提供する方法
ledger-ICP元帳のようなインターフェイス
operator-トークンを使うためのオペレーター
secure-一般的なクエリに対するAddの更新呼び出し(より安全)
subscribe-通知サブスクリプションのインターフェイスを提供します
詳細はこちらでご覧いただけます。
コメントし、PRを送信し、独自の拡張機能を公開し、私たちと協力してこの規格を構築してください。
Examples
examplesディレクトリで使用できる例がいくつかあります。これらはすべてEXTインターフェイスで機能し、Stoicなどのサポートウォレットに追加できま
ERC20-非常に基本的なERC20のような規格
ERC721-特にNFTを除いて、上記のとおり
Standard-通知付きの標準的なシングルトークンの実装
Advanced-高度なマルチトークン実装
理論的根拠
トークンは、暗号通貨の元帳からゲーム内のアセットなど、さまざまな状況で使用できます。これらのトークンはさまざまな目的に使用できるため、さまざまな機能を使用できるようにする必要があります。一方、トークンと統合する必要があるサードパーティのツールは、標準化されたインターフェイスの恩恵を受けます。
EXT Standardは、拡張機能と共通コアを使用したトークンのモジュラー開発を促進します。トークン開発者は、正確なユースケースに基づいてトークンを開発できます。サードパーティの開発者は、規格化されたインターフェイスを使用して、これらのトークンを中心にツールを構築できます。
このリポジトリには、コア規格といくつかの初期拡張機能が含まれています。これらのモジュールの完全なmotokoライブラリを追加し、いくつかの例を提供しました。また、EXTをアプリケーションと簡単に統合するための基本的なJSライブラリも開発しています。
インターフェイス仕様
ext-core規格では、次のパブリックエントリポイントが必要です。
type Token = actor {
extensions : shared query () -> async [Extension];
balance: shared query (request : BalanceRequest) -> async BalanceResponse;
transfer: shared (request : TransferRequest) -> async TransferResponse;
};
タイプ
Native ICP Ledger types
type AccountIdentifier = Text;
type SubAccount = [Nat8];
ICP Ledger AccountIdentifier(64個の長い16進アドレス)およびSubAccounts(プリンシパルのインデックス)の基本的なサポート。
User
type User = {
#address : AccountIdentifier;
#principal : Principal;
}
EXTは、ネイティブAccountIdentifier(64個の長い16進アドレス)とPrincipalの両方をサポートします。EXTには、同等性をチェックしてユーザーのハッシュを生成するメソッドが含まれています。プリンシパルは(デフォルトの0インデックスを使用して)簡単に1に変換できるため、AccountIdentifierに対する残高を保存することをお勧めします。
Balance
type Balance = Nat;
バランスとは、特定の量を指しTokenIdentifierます。代替不可能なトークンの場合、これは0またはになり1ます。
TokenIdentifier
// \x0Atid" + canisterId + 32 bit index
type TokenIdentifier = Text;
TokenIdentifier特定のトークンの一意のIDであり、トークンが存在するキャニスタ、並びにトークンコンテナ内のインデックスを反映しています。TokenIdentifierはaに似ておりPrincipal、キャニスターのID、キャニスター内のトークンのインデックス、およびドメイン区切り文字を表します。
TokenIndex
type TokenIndex = Nat32;
これにより、1つのキャニスター(40億以上)内で2 ** 32の一意のトークンが可能になります。これは、特定のキャニスター内の個々のトークンのインデックスを表します。
Extension
type Extension = Text;
拡張機能は、「バッチ」、「共通」、「アーカイブ」などの単なるテキストフィールドです。
Memo
type Memo : Blob;
トランザクションに添付できる「支払い」メモ/データを表します。ネイティブのシリアル化/逆シリアル化を利用して、より高度なデータをこのように保存できるようになることを願っています。
NotifyService
type NotifyCallback = shared (TokenIdentifier, User, Balance, Memo) -> async ?Balance;
type NotifyService = actor { tokenTransferNotification : NotifyCallback) -> async ?Balance)};
//e.g. (tokenId, from, amount, memo)
これは、転送通知を受信するためにキャニスターに含める必要のあるパブリックコールです。返される金額は、実際に受け入れられた残高です。トランザクション要求がnotifytrueに設定されているが、受信者に正しいNotifyCallbackがない場合、txはキャンセルされます。
Common Error
type CommonError = {
#InvalidToken: TokenIdentifier;
#Other : Text;
};
上記は、返される可能性のある一般的なエラーを表しています。
Entry Points
extensions (query)
extensions : shared query () -> async [Extension];
Extensionキャニスターがサポートするsの配列を返すパブリッククエリ。
balance (query)
type BalanceRequest = {
user : User;
token: TokenIdentifier;
};
type BalanceResponse = Result<Balance, CommonError>;
balance: shared query (request : BalanceRequest) -> async BalanceResponse;
Balance要求されたのを返すパブリッククエリUser。それ以外の場合は、失敗するとエラーになります。
transfer
type TransferRequest = {
from : User;
to : User;
token : TokenIdentifier;
amount : Balance;
memo : ?Memo;
notify : ?Bool;
subaccount : ?SubAccount;
};
type TransferResponse = Result<Balance, {
#Unauthorized: AccountIdentifier;
#InsufficientBalance;
#Rejected; //Rejected by canister
#InvalidToken: TokenIdentifier;
#CannotNotify: AccountIdentifier;
#Other : Text;
}>;
transfer: shared (request : TransferRequest) -> async TransferResponse;
この関数は、オプションのメモ(トランザクションに固有の追加データ)を使用して、2人のユーザー間でトークンの量を転送しようとします。
notifyがtrueの場合、キャニスターはトランザクションの受信者への通知を試みます(応答を返す必要があります)。これにより、受信者は必要に応じてトランザクションを拒否することができます。受信者は、トークンの部分的な転送のみを受け入れることを選択することもできます。拒否されたトークンは送信者に返金されます。
参考文献