T11 · Token Program
Solana の Token が独立コントラクトでない理由は?
- 練習する能力
- Builder
- 実践
- Devnet で Mint を作成し、2 つのウォレットそれぞれに ATA を作って送金する。
- AI Lab
- AI に Token-2022 の拡張機能を説明させ、一般的なウォレットで表示異常を起こす拡張を確認する。
現実の問題
EVM での発行は、コードを作り配備してアドレスを得て、残高を mapping に保存する流れです。自分の通貨は自分のコードです。
Solana では三つ驚きます。
第一:プログラムを配備せず一取引で作れ、総量、精度、発行者を設定でき、書いたコードはゼロです。
第二:友人に百単位送ると、対応アカウントがなく失敗します。代わりに口座を開き、預託金を払います。
第三:1% の手数料など自分の送金ロジックを書く場所がありません。
どこで、誰のコードが動いているのでしょう。
思考実験
二方式を比較します。
A は通貨ごとに銀行を建てます。
建物が配備、帳簿が mapping です。千通貨なら千の建物と帳簿、ほぼ同じコードが千個です。
ウォレットが千種類のトークンに対応するには、理屈の上では千棟の銀行を知る必要があります。ただし建物の形は T9 の標準に沿って似ているため、共通インターフェースで問い合わせできます。その類似性は強制されないため、T9で見た三日間の事故が起きます。
B は世界共通の銀行ソフトです。
各通貨は総量、精度、発行権限、凍結権限という発行情報です。残高は持ち主別の独立アカウントで、通貨、所有者、数量を記録します。
結果を導くと章全体が分かります。
- 一プログラムを知れば全通貨に対応できます。 表示、送金、許可を統一します。
- 作者に独自コードを書く場所がありません。 送金は共有コードなので、T9 の手数料や自動残高変動は基本モデルでは存在できません。
- 残高アカウントの作成が必要です。 独立した保存場所なので作成者と預託金が必要です。
- 独自挙動は共有プログラムの拡張点だけです。 新版と拡張が生まれます。
共有で T9 の問題群をなくし、制御された拡張で一部を戻します。 これが面白い点です。
あなたが決める
多くが未保有の五百人へ配布します。
結果を観察する
保存用預託金の支払者と受益者が共通の問いです。
| 方法 | 支払者 | 所有先 | 失敗リスク | 用途 |
|---|---|---|---|---|
| 直接送る | なし | — | 高い、未作成で失敗 | 既存を確認済み |
| 運営が作る | 運営 | ユーザー | 低い | 高転換の配布 |
| 自分で作る | ユーザー | ユーザー | 低い | 請求型 |
| 冪等作成 | 指定先 | ユーザー | 最低 | ほぼ全用途の基本 |
覚えるべき結論です。
EVM で送金者が Gas として消費する保存費用が、Solana では所有者へ返せる預託金になります。
安さより、費用の場所と利用できる人が違います。配布後の閉鎖で回収する行為は、最初から消費する EVM にはありません。
払った預託が最終的に誰に渡るかを、全配布のリスク表へ入れます。
モデルを作る
二種のアカウント
T10 の通常アカウントで、owner は共有プログラムです。
Mint(通貨ごとに一つ)
├─ supply 現在の総量
├─ decimals 精度
├─ mintAuthority 発行権限。なしにすれば以後発行不可
└─ freezeAuthority 凍結権限。なしにもできる
Token(人と通貨ごとに一つ)
├─ mint 対象通貨
├─ owner 持ち主
├─ amount 残高
├─ delegate 許可先と額
└─ state 通常/凍結関連アカウントは持ち主、プログラム、Mint から導きます。T10 の導出により、誰でも照会せず場所を計算できます。
ウォレットの一覧は owner で保有アカウントを絞ります。
ERC20 との比較
繰り返し見るべき中心の表です。
| 問い | ERC20 | Solana |
|---|---|---|
| コード | 各通貨の独自コード | 共通プログラム |
| 発行 | コントラクト配備 | Mint 作成取引 |
| 残高 | 内部 mapping | 独立アカウント |
| 受取準備 | 不要 | 作成と預託 |
| 独自挙動 | 可能、T9 の原因 | 基本なし、新版拡張だけ |
| 許可 | approve 額 | delegate は同時に一つ |
| 保存費 | 送金者の Gas | 作成者の返還可能な預託 |
| 名前や図 | コード内 | 別プログラムか拡張 |
| 追加発行 | コード | 放棄可能な Mint フィールド |
| 凍結 | 独自拒否リスト | freezeAuthority があれば基本機能 |
発行と凍結は公開フィールドで一目で調べられます。 EVM のソースコードを読む代わりに、mintAuthority と freezeAuthority の空を見ます。
権限をコードに隠すより、データにすると監査しやすくなります。
新版と拡張
統一は硬直も生みます。新版は同モデルで、Mint 作成時に拡張を明示的に選びます。
手数料、譲渡不可、初期凍結、Mint 内メタデータ、利息、外部への送金フックなどがあります。
ここで立ち止まります。
手数料、残高変動、外部実行は、T9 の事故の種類そのものです。
コードに隠れず明示フィールドになったことが違いです。受け入れる前に拡張を読んで対応を決め、プログラムで検査できます。
リスクは残ります。
- 各拡張への対応が必要です。 珍しい拡張は表示異常や未表示になります。
- フックは外部コードを実行します。 T9 のコールバックと同じく信頼しない呼び出しです。
- 旧連携は拡張を知りません。 古い仮定なら手数料で記帳を誤ります。
共有で予測不能を減らし、拡張で宣言し検査できる形に戻します。検査可能は安全ではなく、検査を可能にしただけです。
何と呼ぶか
作成、発行、送金、許可、凍結、焼却を共通定義します。
一度の対応で全通貨を扱えます。作者はコードでなくデータを作ります。
総量、精度、発行権限、凍結権限の情報です。
一般に通貨のアドレスとはこれを指します。
持ち主と通貨、量、許可、状態を記録します。
N 種なら N 個あり、それぞれ預託が必要です。
持ち主と通貨から計算する、誰でも指定できるアカウントです。
照会や索引表なしで場所を決めます。PDA の最も成功した実用例の一つです。
Mint の二フィールドで、永久放棄できます。
調査の最初に読みます。残っていれば総量や送金可否を発行者が変えられます。
送金中に指定の外部プログラムを呼ぶ新版拡張です。
独自挙動と信頼できない実行を戻すので、通常送金でなく外部呼び出しとして扱います。
実践
コードを書かず CLI で、モデルを具体物にします。
Devnet へ切り替え取得します。
solana config set --url devnet
solana address
solana airdrop 2
solana balance実資産のウォレットは使いません。 専用鍵を作ります。
Mint を作ります。
spl-token create-token --decimals 6出力を記録します。アカウントだけを作り、プログラムは配備していません。
読みます。
solana account <MINT アドレス>
spl-token display <MINT アドレス>mintAuthority と freezeAuthority を確認します。
自分のアカウントと通貨を作ります。
spl-token create-account <MINT アドレス>
spl-token mint <MINT アドレス> 1000
spl-token balance <MINT アドレス>預託額と前後の solana balance を見ます。消えず、新アカウントにあります。
第二ウォレットへ送ります。
solana-keygen new --no-bip39-passphrase -o ./wallet2.json
solana address -k ./wallet2.jsonまず追加引数なしで失敗を見ます。
spl-token transfer <MINT アドレス> 10 <WALLET2 アドレス>相手の未作成が、第二の驚きの実演です。
作成もする引数を付けます。
spl-token transfer <MINT アドレス> 10 <WALLET2 アドレス> --fund-recipient成功し、自分の SOL が預託分減ります。
関連アドレスの計算を確かめます。
spl-token address --token <MINT アドレス> --owner <WALLET2 アドレス> --verbose
spl-token accounts --owner <WALLET2 アドレス>相手が何もしなくても分かります。導出の価値です。
発行権限を放棄して再試行します。
spl-token authorize <MINT アドレス> mint --disable
spl-token mint <MINT アドレス> 1第二は失敗し、spl-token display の mintAuthority は空です。
調査者が最初に見るフィールドです。 公開で不可逆の約束をしました。
新版でも試します。 引数を読みます。
spl-token create-token --help新版指定と拡張を調べ、手数料などを選んで二通貨目を作ります。同じ過程を経て、普通のウォレットで表示を比較します。
対応差を次の AI Lab で照合します。
AI Lab
第三が成果物になる三段階です。
第一段階:
新版Solanaトークンプログラムが提供する拡張を列挙してください。各拡張について、
変える挙動、有効化が必要な時点、後から無効化できるかを説明してください。
存在が不確かな拡張は、そのことを明記してください。
第二段階:
これらのうち、古い仮定に基づく統合側を誤らせる拡張はどれですか。
どの処理段階で誤り、どういう結果として表れるか具体的に説明してください。
第三段階:
これらの拡張とERC20の非標準実装の対照表を作ってください。
同じ問題の二つの形態はどれで、Solana固有の問題はどれですか。各名を公式文書で調べます。 一覧の多くは合っても、一、二のもっともらしい不存在が混じりがちです。
推論の第二は通常よくできるので、正確な記憶は確認し、分類と推論はモデルに使います。T9 と同じ境界です。
同じ取捨選択を別に配置した二モデルだと第三で分かります。一方は開放から慣行で統一、一方は統一から拡張します。両側とも受け入れる前に挙動を調べます。
複数拡張を Devnet で作り、二、三のウォレットでスクリーンショットを比べます。毎週変わる対応状況は実測が必要です。
AI の回答後、自分で必ず検証すること
- 各拡張名を公式文書で確認し、創作を見つける
- 対応するとの主張を Devnet の実ウォレットで試す
- 既定でなく Mint 作成時に明示して選ぶと説明する
- 使用版の --help で全 CLI 引数を確認する
- 受取額を変える拡張と変えないものを区別する
- ERC20 の非標準実装と比較し、なければ追加で聞く
実例
出金に送金だけを使い、未作成を扱いませんでした。
多数が失敗し再試行と問い合わせが増え、成功扱いしたシステムでは記帳も合いません。
全出金で、相手にあるか、なければ誰が作るかを答えます。 EVM にはない必須の問いです。
発行者が任意保有者の送金を止められます。
規制対応型には必要でも、分散型を名乗る場合は見落とされる裏口です。
一秒で公開確認できます。Mint の freezeAuthority を最初に読みます。
ゼロ残高の口座は閉鎖して所有者へ返金できます。
運営負担の配布を、スクリプトで受取、売却、閉鎖して回収する行為が増え、SOL が流出しました。
最終受取人を費用モデルへ入れます。
変数を一つ変える
固定総量の評価や分配の約束は、変更可能な言葉です。
継続的報酬なら必要でも、明示して開示します。ユーザーに発見させるだけでは不十分です。
他の指標より先に確認します。
DeFi の預け分も止められます。
必要な瞬間に清算が凍ります。 T9 の停止と同じリスクを、コードでなくフィールドで表します。
受取不足が毎回漏れになります。
主張額でなく残高差を記帳します。 チェーンが変わっても本質が同じなので対処も同じです。
消え、預託が戻り、次の送金で未作成になります。
アドレスをキャッシュして永久存在を仮定すると壊れます。存在確認か冪等作成を使います。
作成と消去がある、mapping にはない状態です。
持ち帰る問い
Token は共有コードが解釈するデータだけでも成り立ちます。独自コントラクトと思うものの多くは、共通データ形式だけで足ります。
預託の支払者と受益者は別人になれます。 全配布と報酬の費用に、独立項目として入れます。
発行、凍結、フックの権限は発行者が持ち、結果は保有者が負います。一照会で読めるデータでも、多くは調べません。
章末チェック
送金、発行、許可、凍結の全ロジックが共通プログラムにあるためです。
新通貨は情報の作成で、独自コードの場所はありません。
統一と一度の対応を得ても、追加機能は共有側の提供が必要です。
残高は表でなく独立保存領域で、維持に預託が必要です。
閉鎖で戻る保証金で、手数料ではありません。
同取引の冪等作成と、支払者の決定で扱います。
本質的な差はなく、アドレスの慣行です。
計算可能なのでウォレットやスクリプトが基本にします。
同通貨に複数口座を持てても ATA は一つで、ほかは自分で住所を記録します。
統一と独自挙動は両立の難しい取捨選択です。
拡張は統一へ制御し明示する入口を開けます。
コードに隠れた挙動がデータになり、発見しやすくなることは進歩でも、対応の判断は連携側です。
唯一の正解はありません。参考にします。
mintAuthorityが空か、誰か、複数署名か。freezeAuthorityが空か、プールを止められるか。- 旧版か新版、拡張は何か。
- 手数料を残高差で扱うか。
- フックの作者と能力は何か。
- 精度を固定していないか。
- メタデータの提供者と変更可否。
- 大口割合と単一集中。
T9 と同じ問いです。チェーンを変えても、問うことは変えません。
要点
トークンは全員が共有するプログラムと、各保有者が所有するアカウント群だ。