Crypto OS
Technical Crypto OS第2段階 · スマートコントラクト開発

T11 · Token Program

Solana の Token が独立コントラクトでない理由は?

この章を 3D で体験する →
練習する能力
Builder
実践
Devnet で Mint を作成し、2 つのウォレットそれぞれに ATA を作って送金する。
AI Lab
AI に Token-2022 の拡張機能を説明させ、一般的なウォレットで表示異常を起こす拡張を確認する。

現実の問題

EVM での発行は、コードを作り配備してアドレスを得て、残高を mapping に保存する流れです。自分の通貨は自分のコードです。

Solana では三つ驚きます。

第一:プログラムを配備せず一取引で作れ、総量、精度、発行者を設定でき、書いたコードはゼロです。

第二:友人に百単位送ると、対応アカウントがなく失敗します。代わりに口座を開き、預託金を払います。

第三:1% の手数料など自分の送金ロジックを書く場所がありません。

どこで、誰のコードが動いているのでしょう。

思考実験

二方式を比較します。

A は通貨ごとに銀行を建てます。

建物が配備、帳簿が mapping です。千通貨なら千の建物と帳簿、ほぼ同じコードが千個です。

ウォレットが千種類のトークンに対応するには、理屈の上では千棟の銀行を知る必要があります。ただし建物の形は T9 の標準に沿って似ているため、共通インターフェースで問い合わせできます。その類似性は強制されないため、T9で見た三日間の事故が起きます。

B は世界共通の銀行ソフトです。

各通貨は総量、精度、発行権限、凍結権限という発行情報です。残高は持ち主別の独立アカウントで、通貨、所有者、数量を記録します。

結果を導くと章全体が分かります。

  1. 一プログラムを知れば全通貨に対応できます。 表示、送金、許可を統一します。
  2. 作者に独自コードを書く場所がありません。 送金は共有コードなので、T9 の手数料や自動残高変動は基本モデルでは存在できません。
  3. 残高アカウントの作成が必要です。 独立した保存場所なので作成者と預託金が必要です。
  4. 独自挙動は共有プログラムの拡張点だけです。 新版と拡張が生まれます。

共有で T9 の問題群をなくし、制御された拡張で一部を戻します。 これが面白い点です。

あなたが決める

多くが未保有の五百人へ配布します。

結果を観察する

保存用預託金の支払者と受益者が共通の問いです。

方法支払者所有先失敗リスク用途
直接送るなし—高い、未作成で失敗既存を確認済み
運営が作る運営ユーザー低い高転換の配布
自分で作るユーザーユーザー低い請求型
冪等作成指定先ユーザー最低ほぼ全用途の基本

覚えるべき結論です。

EVM で送金者が Gas として消費する保存費用が、Solana では所有者へ返せる預託金になります。

安さより、費用の場所と利用できる人が違います。配布後の閉鎖で回収する行為は、最初から消費する EVM にはありません。

払った預託が最終的に誰に渡るかを、全配布のリスク表へ入れます。

モデルを作る

二種のアカウント

T10 の通常アカウントで、owner は共有プログラムです。

Mint(通貨ごとに一つ)
 ├─ supply             現在の総量
 ├─ decimals           精度
 ├─ mintAuthority      発行権限。なしにすれば以後発行不可
 └─ freezeAuthority    凍結権限。なしにもできる

Token(人と通貨ごとに一つ)
 ├─ mint               対象通貨
 ├─ owner              持ち主
 ├─ amount             残高
 ├─ delegate           許可先と額
 └─ state              通常/凍結

関連アカウントは持ち主、プログラム、Mint から導きます。T10 の導出により、誰でも照会せず場所を計算できます。

ウォレットの一覧は owner で保有アカウントを絞ります。

ERC20 との比較

繰り返し見るべき中心の表です。

問いERC20Solana
コード各通貨の独自コード共通プログラム
発行コントラクト配備Mint 作成取引
残高内部 mapping独立アカウント
受取準備不要作成と預託
独自挙動可能、T9 の原因基本なし、新版拡張だけ
許可approve 額delegate は同時に一つ
保存費送金者の Gas作成者の返還可能な預託
名前や図コード内別プログラムか拡張
追加発行コード放棄可能な Mint フィールド
凍結独自拒否リストfreezeAuthority があれば基本機能

発行と凍結は公開フィールドで一目で調べられます。 EVM のソースコードを読む代わりに、mintAuthority と freezeAuthority の空を見ます。

権限をコードに隠すより、データにすると監査しやすくなります。

新版と拡張

統一は硬直も生みます。新版は同モデルで、Mint 作成時に拡張を明示的に選びます。

手数料、譲渡不可、初期凍結、Mint 内メタデータ、利息、外部への送金フックなどがあります。

ここで立ち止まります。

手数料、残高変動、外部実行は、T9 の事故の種類そのものです。

コードに隠れず明示フィールドになったことが違いです。受け入れる前に拡張を読んで対応を決め、プログラムで検査できます。

リスクは残ります。

  • 各拡張への対応が必要です。 珍しい拡張は表示異常や未表示になります。
  • フックは外部コードを実行します。 T9 のコールバックと同じく信頼しない呼び出しです。
  • 旧連携は拡張を知りません。 古い仮定なら手数料で記帳を誤ります。

共有で予測不能を減らし、拡張で宣言し検査できる形に戻します。検査可能は安全ではなく、検査を可能にしただけです。

何と呼ぶか

Token Programトークンプログラム

作成、発行、送金、許可、凍結、焼却を共通定義します。

一度の対応で全通貨を扱えます。作者はコードでなくデータを作ります。

Mintミントアカウント

総量、精度、発行権限、凍結権限の情報です。

一般に通貨のアドレスとはこれを指します。

Token Accountトークンアカウント

持ち主と通貨、量、許可、状態を記録します。

N 種なら N 個あり、それぞれ預託が必要です。

ATA関連トークンアカウント

持ち主と通貨から計算する、誰でも指定できるアカウントです。

照会や索引表なしで場所を決めます。PDA の最も成功した実用例の一つです。

Mint / Freeze Authority発行と凍結の権限

Mint の二フィールドで、永久放棄できます。

調査の最初に読みます。残っていれば総量や送金可否を発行者が変えられます。

Transfer Hook送金フック

送金中に指定の外部プログラムを呼ぶ新版拡張です。

独自挙動と信頼できない実行を戻すので、通常送金でなく外部呼び出しとして扱います。

実践

実践Devnet で Mint と二ウォレットの ATA を作り送金するSolana CLI + spl-token CLI0 円。Devnet 通貨はフォーセットから

コードを書かず 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

AI LabAI の拡張一覧と、実ウォレットの表示対応を照合するLevel 2 · AI Copilot

第三が成果物になる三段階です。

第一段階:
新版Solanaトークンプログラムが提供する拡張を列挙してください。各拡張について、
変える挙動、有効化が必要な時点、後から無効化できるかを説明してください。
存在が不確かな拡張は、そのことを明記してください。

第二段階:
これらのうち、古い仮定に基づく統合側を誤らせる拡張はどれですか。
どの処理段階で誤り、どういう結果として表れるか具体的に説明してください。

第三段階:
これらの拡張とERC20の非標準実装の対照表を作ってください。
同じ問題の二つの形態はどれで、Solana固有の問題はどれですか。

各名を公式文書で調べます。 一覧の多くは合っても、一、二のもっともらしい不存在が混じりがちです。

推論の第二は通常よくできるので、正確な記憶は確認し、分類と推論はモデルに使います。T9 と同じ境界です。

同じ取捨選択を別に配置した二モデルだと第三で分かります。一方は開放から慣行で統一、一方は統一から拡張します。両側とも受け入れる前に挙動を調べます。

複数拡張を Devnet で作り、二、三のウォレットでスクリーンショットを比べます。毎週変わる対応状況は実測が必要です。

AI の回答後、自分で必ず検証すること

  • 各拡張名を公式文書で確認し、創作を見つける
  • 対応するとの主張を Devnet の実ウォレットで試す
  • 既定でなく Mint 作成時に明示して選ぶと説明する
  • 使用版の --help で全 CLI 引数を確認する
  • 受取額を変える拡張と変えないものを区別する
  • ERC20 の非標準実装と比較し、なければ追加で聞く

実例

取引所がアカウント作成を忘れる

出金に送金だけを使い、未作成を扱いませんでした。

多数が失敗し再試行と問い合わせが増え、成功扱いしたシステムでは記帳も合いません。

全出金で、相手にあるか、なければ誰が作るかを答えます。 EVM にはない必須の問いです。

手数料拡張が記帳を狂わせる

送信額で記帳するプロトコルが拡張を扱わず、受取が不足しました。

T9 とまったく同じ事故です。

ただし Mint を読めば発見できました。検査できても、検査する人は必要です。

凍結権限を残す通貨

発行者が任意保有者の送金を止められます。

規制対応型には必要でも、分散型を名乗る場合は見落とされる裏口です。

一秒で公開確認できます。Mint の freezeAuthority を最初に読みます。

閉鎖の預託回収が狙われる

ゼロ残高の口座は閉鎖して所有者へ返金できます。

運営負担の配布を、スクリプトで受取、売却、閉鎖して回収する行為が増え、SOL が流出しました。

最終受取人を費用モデルへ入れます。

変数を一つ変える

もし発行権限を放棄しない

固定総量の評価や分配の約束は、変更可能な言葉です。

継続的報酬なら必要でも、明示して開示します。ユーザーに発見させるだけでは不十分です。

他の指標より先に確認します。

もし凍結権限を発行者が持つ

DeFi の預け分も止められます。

必要な瞬間に清算が凍ります。 T9 の停止と同じリスクを、コードでなくフィールドで表します。

もしDEX が入力額を使い、手数料拡張がある

受取不足が毎回漏れになります。

主張額でなく残高差を記帳します。 チェーンが変わっても本質が同じなので対処も同じです。

もしユーザーがアカウントを閉じる

消え、預託が戻り、次の送金で未作成になります。

アドレスをキャッシュして永久存在を仮定すると壊れます。存在確認か冪等作成を使います。

作成と消去がある、mapping にはない状態です。

持ち帰る問い

3
なぜトークンが必要なのか?

Token は共有コードが解釈するデータだけでも成り立ちます。独自コントラクトと思うものの多くは、共通データ形式だけで足ります。

5
誰が支払っているか?

預託の支払者と受益者は別人になれます。 全配布と報酬の費用に、独立項目として入れます。

9
誰がリスクを負うか?

発行、凍結、フックの権限は発行者が持ち、結果は保有者が負います。一照会で読めるデータでも、多くは調べません。

章末チェック

要点

トークンは全員が共有するプログラムと、各保有者が所有するアカウント群だ。

この章の実践課題を終えたらチェックしてください進捗をすべて見る

このページの内容