このページは、トークンを作成・上場・インデックス化する前に、このチェーンでトークンとは何かを理解するためのものです。RPL は Rand のトークン規格で、chain 14 で新たに導入されました。トークンはシールドされたネイティブアセットです。台帳レジストリの 1 エントリであり、残高は RAND と同じコミットメントツリー内の通常のノートとして保持されます。コントラクトではありません。手順に沿って作成するには、RPL トークンのデプロイを参照してください。
理由は構造的なものです。Call が書き込むのはレシートだけなので、ERC-20 型のコントラクトには残高を保持する場所がありませんでした。また、公開の残高テーブルを使うと、トークンはシールドされたチェーン上で唯一の透明なアセットになってしまいます。そこで RPL は、トークンを台帳の第一級オブジェクトにしました。Chain 20 では RPL-2(v0.6.8)が加わり、プログラムは公開のステートセルと公開のボールトを持てるようになり、自身のトークンのミント権限者にもなれます(後述)。ただし、個人が保有する残高は引き続きノートです。
トークンはレジストリのエントリである
TokenRegistry(crates/randprotocol-core/src/ledger/tokens.rs)は、ネイティブかブリッジ経由かを問わず、すべてのトークンが共有する 1 つのテーブルです。ブリッジがアセットのインデックスを解決するのも、このレジストリです。各エントリは次のとおりです。
| フィールド | ルール |
|---|---|
id | アセット ID。32 バイトで、コンテンツアドレス方式 |
index | u32。ノートの asset ワードが持つ値で、1 から登録順に割り当てられる連番。インデックス 0 は RAND で、登録されることはない |
name | UTF-8 で 1〜32 バイト。スペース可、変更不可 |
symbol | ASCII の図形文字(0x21..=0x7e、空白なし)で 1〜12 バイト、変更不可 |
decimals | 0〜9、変更不可 |
authority | ミント権限者(後述) |
mint_nonce | Key 権限者のリプレイカウンタ |
total_supply | u64、オーバーフロー検査付きの演算。オーバーフローするとミントは拒否される。chain 15 以降は 2^63 未満に保たれる(後述) |
registered_at | 登録時のブロック高 |
decimals が 9 までなのは、金額が u64 だからです。18 桁の小数では u64 が保持できるのは 18.4 トークンだけで、9 は RAND 自身の精度でもあります。ブリッジ経由のトークンは、元のコインの桁数にかかわらず、常に decimals 8 で登録されます。
レジストリは、bridge や aggregation と同様に、ジェネシスファイルの tokens セクションで有効になります。このセクションがない場合、トークンに関するアクションはすべて、他の検査より前に拒否されます(TokenError::Disabled)。Chain 20 のジェネシスにはこのセクションがあり、トークンを 1 つ、すなわち 7 つのバッキングを持つ zUSD を載せています。これは chain 14 から各カットを通じて引き継がれてきたもので、チェーン上のそれ以外のトークンはすべてトランザクションで登場します。(chain 14 のジェネシスには 1 つも載っていませんでした。)このゲートが有効な場合、tokens_root(インデックス順に並べた blake3("rand-token-leaf-1", bincode(TokenInfo)) のリーフのマークルルート)がステートルートに組み込まれます。ルートのドメインは、後続の機能が何も有効でないチェーンでは rand-state-4 です。Chain 20 のルートは、faucet とボンドキューの状態、現行のガス価格、プログラムステートルートも含み、rand-state-8 のもとでハッシュされ、さらに承認済みバリデータ集合によってもう一度ラップされます(コンセンサス)。
tokens セクションを持つチェーンでは、ジェネシスの alloc ノートもすべてオープニング(pk、time、r)を持つ必要があります。ノードはコミットメントを再計算し、一致しないファイルを拒否します。コミットメントはアセット 0 のものですが、オープニングが同じジェネシスに載っているトークンのインデックスを指定している場合は、そのトークンのものになります。Chain 20 にはそのようなノートが 2 つ(インデックス 1 の zUSD、10 と 89)あります。また、載っているトークンごとに、ジェネシスのノートの合計は、そのバッキングが locked として開始する額と一致していなければなりません。ノートの asset ワードがトークンを指せるようになった以上、オープニングのないジェネシスのコミットメントがあると、裏付けのない任意のアセットのノートを無検査でプールに入れられる唯一の経路になってしまいます。
アセット ID、インデックス、rpl1…
トークンには 2 つの名前があり、RPC は両方を返します。
- アセット ID は 32 バイトで、プログラム ID と同様にコンテンツアドレス方式です。ネイティブトークンの ID は
blake3("rand-rpl-asset", bincode(name, symbol, decimals, authority, initial, salt))です。ここでsaltは作成者が選ぶ 32 バイト、initialは最初のミント全体(ある場合)です。ブリッジ経由のトークンの ID はblake3("rand-rpl-asset", bincode(name, symbol, 8, salt))です。すでに存在する ID の登録は拒否されます(TokenError::AlreadyRegistered)。 - インデックスは、ノートが実際に持つ値です。32 バイトの ID は 1 ワードに収まらないためです。これは略称であり、このチェーン上でのみ意味を持ちます。
- テキスト形式の
rpl1…は、32 バイトの ID に対する bech32m(BIP-350)で、human-readable part はrplです。データ部は 52 文字、チェックサムは 6 文字で、合計 62 文字です。トークンが示される場所では必ず 64 桁の 16 進 ID と並べて表示され、トークンを検索する場所では必ず受け付けられます。16 進も引き続き受け付けられます。パースは厳格です。チェックサムの誤り、プレフィックスの誤り、ペイロードが正確に 32 バイトでないこと、大文字と小文字の混在はいずれも拒否されるため、タイプミスによって別のトークンに解決されることはありません。
シンボルは一意ではありません。 ERC-20 や SPL と同様に、トークンの同一性はアセット ID であり、名前やティッカーではありません。
rand_bridgeAssetId が計算し、rand_getAssets がバッキングの行ごとに出力する、(chain, token) ごとの従来の値は、ブリッジのワイヤ形式のためのより限定的な識別子であり、トークン自身の ID ではありません。
ミント権限者
| 権限者 | 誰がユニットを発行できるか | 備考 |
|---|---|---|
None | 登録後は誰も発行できない | 固定供給。初期ミントは必須で、それが将来にわたる供給のすべてになる |
Key(PublicKey) | 1 つの Dilithium2 鍵の保有者 | 後から署名によって再度ミントできる。権限を別の鍵に移すことも、放棄することもできる |
Bridge { backings } | ブリッジのロックとリリースのみ | 直接のミントは行わない。ブリッジのガバナンスアクションを通じてのみ存在する |
Program(ProgramId) | そのプログラムの Invoke のみ(RPL-2) | program_state セクションを持つチェーン(chain 20)では、初期ミントなしで登録されるため供給はゼロから始まり、プログラムの証明が裏付ける遷移によってのみミントまたはバーンされる(rand token create --program <id>)。このセクションのないチェーンでは、登録時に拒否される |
Bridge を指定した RegisterToken は拒否されます(TokenError::AuthorityNotAllowed)。初期ミント付きで、または program_state のないチェーンで Program を指定したものも同様です。Key 権限者はちょうど 1 つの Dilithium2 公開鍵です。他のバイト長の鍵は拒否されます(TokenError::BadAuthorityKey)。ミントにおける受取人の ML-KEM 鍵も、同様に長さが固定されています。どちらもコンセンサスステートであるか、固定手数料で購入されるブロック空間であるため、任意に大きくしてはならないのです。
トークンの作成
作成にパーミッションは不要です。Action::RegisterToken { name, symbol, decimals, authority, initial, salt, index } は通常の RAND 手数料バンドルに載せられ、BUNDLE_BASE にレジストリの registration_fee を加えた額を支払います。登録手数料はジェネシスのパラメータで、1 RAND から 10,000 RAND の範囲に制限されているため、スパムトークンには常に何らかのコストがかかります。Chain 20 では 1 RAND なので、登録には 1.001 RAND かかります。chain 20 は、chain 15 以降のすべてのチェーンと同様に、これをバーンします。プロポーザは、バンドルのベース分だけを受け取ります(後述)。
index は、作成者が初期ノートを封印した対象のレジストリインデックスを指定します。別の登録が先にそのインデックスを取った場合、ノートが宙に浮かないよう、トランザクションは拒否されます(TokenError::IndexMismatch)。作成者は次のインデックスで改めて証明を行います。
ミントされるノートはチェーンが計算するもので、送信者が選ぶものではありません。note_commitment(recipient.pk, MINT_FROM, amount, index, time, r) です。金額と受取人の pk はワイヤ上で公開されているため、封印されたエンベロープが壊れていても、受取人はトランザクション自身のフィールドからノートを再構築できます。ブリッジのデポジットにも同じ防御があります。
ID が初期ミント全体を束縛する理由
RegisterToken には署名がありません。トランザクションバインディングは、証明済みのコピーが改ざんされることを防ぎますが、新しいコピーが何を指定してよいかについては何も言いません。もし ID が初期金額だけを対象としていたなら、保留中の登録を観測した者が、受取人を変えたコピーを送信して同じ ID で登録し、先にコミットすることで、固定供給トークンの全供給を奪えたでしょう。ID が初期ミント全体(金額、受取人、r、time、エンベロープ)を対象としているため、リダイレクトされたコピーは別のアセット ID にハッシュされます。つまり、同じシンボルを持つ別のトークンになりますが、これは一意でないシンボルがすでに許していることです。元の登録は、1 回の再証明のコストで次のインデックスに登録されます。
転送は RAND と同じバンドルである
Chain 14 以降、価値を動かすトランザクションはすべて、ちょうど 1 つのバンドル、すなわち固定の 4 入力 4 出力の隠蔽アセット形式を持ちます(トランザクションとアクション)。スロット 0〜1 はプライベートなアセット(RAND または任意の RPL トークン)を運び、回路はそれがどれなのかを知ることはありません。スロット 2〜3 は常に RAND を運びます。あらゆるアセットの転送は Action::None であり、これは通常の RAND 支払いが使うアクションです。トークン転送専用のアクションはなく、トークンを指す公開フィールドもありません。
トークン転送を観測者が見ると、RAND の支払いが公開するものと全く同じものが見えます。アンカー、4 つのナリファイア、4 つのコミットメント、RAND の fee、burn_a = burn_r = burn_asset = 0、time、4 つのエンベロープ暗号文、そしてバンドル証明です。chain 17(分割認可)以降は、すべてのバンドルに auth_commit と、より小さな 2 つ目の認可証明も付きます。これもアセットによらず同一です。chain 20 では各エンベロープはちょうど 1,860 バイトで、暗号化メモ(rand send --memo)を入れる余地があり、メモを送るかどうかにかかわらずこのサイズです。送信者、受取人、金額、どのアセットが動いたか、どのスロットがダミーだったか、おつりは、観測者には見えません。
ウォレットは、スロット 0〜1 でそのトークンのノートを最大 2 つ、スロット 2〜3 で手数料用の RAND ノートを最大 2 つ使用します。手数料は常に RAND なので、トークンを持っていても RAND を持たない保有者は、証明を生成する前に拒否されます。コストは RAND の支払いと同じです(手数料)。chain 20 では、送信者のマシンで 2 つの STARK 証明を生成します。支出認可(tier 10、約 7 秒、約 1.37 MB)とバンドル(tier 14、約 100 秒、約 1.5 MB)で、合わせて約 2.85 MB がネットワーク上を流れます。それぞれがチェーンの 1 証明あたりの上限 4 MiB を下回っています。chain 17 より前は、転送はバンドル証明のみを運び、当時の測定で約 1.42 MB でした。
ミントと権限
TokenMint { asset, amount, recipient, r, time, envelope, nonce, signature } は、Key 権限のトークンを追加でミントします。SetAuthority { asset, new, nonce, signature } は権限を別の鍵に移し、new を省略すると権限を放棄します。放棄後は、どの鍵もそのトークンを二度とミントできません。権限が Key ではないトークンに対してどちらの操作を行っても拒否されます(TokenError::NotKeyAuthority)。
権限者は blake3("rand-rpl-mint-1" | "rand-rpl-authority-1", chain_id ‖ asset_id ‖ nonce ‖ body) に署名します。nonce はトークンの mint_nonce と等しくなければならず、使用後にインクリメントされます。そのため、署名済みのミントをこのチェーンで再送することも、別のチェーンへ持ち込むこともできません。ミントの body にはエンベロープのダイジェストが含まれます。コミットメントだけではエンベロープを保護できず、ダイジェストがなければ、第三者がゴシップされたミントのエンベロープを無意味なものに差し替え、nonce を消費させることができてしまうからです。
どちらの操作も、BUNDLE_BASE を支払う RAND 手数料バンドルに載せて送られます。手数料を支払うウォレットとミントを認可する鍵は別のもので、異なる人が持っていてもかまいません。
バーン
Action::TokenBurn { asset, amount } は、同じ単一のバンドルに載ります。バンドルの burn_asset は asset と等しく、burn_a は amount と等しく、burn_r は 0 でなければなりません。トークンはアセット用スロットを通ってプールから出て、RAND 手数料は同じ証明のスロット 2〜3 を通ります。total_supply はちょうど amount だけ減ります。Bridge 権限のトークンはここでは拒否され(TokenError::BridgedToken)、ブリッジのバーンを通じて出ていきます。
手数料
RPL のアクションはすべて RAND で支払います。
| アクション | 手数料の下限 | chain 20 での額 |
|---|---|---|
任意のアセットの転送(Action::None) | BUNDLE_BASE | 0.001 RAND |
RegisterToken | BUNDLE_BASE + registration_fee | 1.001 RAND(うち 1 RAND はバーン) |
TokenMint | BUNDLE_BASE | 0.001 RAND |
SetAuthority | BUNDLE_BASE | 0.001 RAND |
TokenBurn | BUNDLE_BASE | 0.001 RAND |
chain 20 のジェネシスには gas セクションがありますが、価格が付くのはプログラムの呼び出し(call と invoke)だけです。ここに挙げた下限は定額で、どの RPL アクションもガスやバイト数による課金はありません。
公開されるものと秘匿されるもの
| 公開 | 秘匿 | |
|---|---|---|
| 登録 | 名前、シンボル、小数桁数、権限、アセット ID、初回ミントの金額と受取人 | なし。これにより、トークンの供給量は最初のブロックから監査できます |
| 追加のミント | 金額、受取人の shielded アドレス、新しいノートのフィールド | RAND 手数料を支払った人 |
| 転送 | トークンが動いたことを示すものは一切ありません | 送信者、受取人、金額、どのアセットか |
| バーン | アセットと金額 | バーンされたノートを保有していた人 |
| 権限の変更 | 新しい鍵、または放棄されたこと | — |
したがって total_supply は常に監査できます。登録時と各ミントで加算された量から、すべてのバーンを差し引いたものです。保有者間の転送は何も明かしません。RAND ではなくトークンが渡されたという事実さえ分かりません。
開示の仕組みは RAND と同じです。ノートの平文にはアセットが含まれるため、取引ごとの鍵(rand tx-key <hash>)や閲覧鍵は、RAND のノートを開くのと全く同じようにトークンのノートを開きます。rand_checkTransaction と rand_getViewingNotes は、開示するノートに asset を含めて返します。そのような鍵が与えられると、randscan はインデックスをレジストリと照合し、転送を名前の付いたトークンのものとして表示します。同じ取引の公開ページには、そのどれも表示されません。
ブリッジされたトークン
Bridge 権限のトークンも RPL トークンです。レジストリのエントリも、秘匿された転送も、バーンの仕組みも同じです。供給量が動くのは、ソースチェーン上でのロック(BridgeAttest)か、リリース(BridgeBurn)を通じてのみです。ブリッジされた 1 つのトークンは複数の裏付けを持つことができ、それぞれが (chain, token) の組で、独自のソース側の小数桁数、ロック量、ミント上限を持ちます。total_supply は常に、各裏付けがロックしている量の合計に等しくなります。ブリッジされたトークンの登録と裏付けの追加は、ブリッジのポスト量子ガーディアンのクォーラムの下でのみ行えます。
chain 20 では、レジストリの最初のトークンは zUSD(“Shielded USD”)で、インデックスは 1、小数桁数は 8、ジェネシスファイルに 7 つの裏付けとともに記載されています(Ethereum、Binance Smart Chain、Solana 上の USDT と USDC、および Tron 上の USDT)。chain 14 で高さ 256 のトランザクションにより登録されたときのアセット ID を引き継いでおり、chain 15 から 20 までは、いずれもジェネシスで同じ名前、シンボル、salt の下に記載されています。chain 20 は、2 つのジェネシスノート(10 と 89)で 99 zUSD から始まり、Ethereum 上でロックされた 22 USDT、Binance Smart Chain 上の 22 USDT、Tron 上の 30 USDT、Solana 上の 25 USDT に裏付けられていました。これは chain 19 のブリッジ状態から引き継いだものです。chain 19 は、Solana 上の 10 USDT に裏付けられた 10 zUSD から始まり、chain 18 は、Tron 上でロックされた 9 USDT と Solana 上の 1 USDT から始まりました。総供給量は裏付けがロックしている量に等しく、入金と償還のたびに変動します。その ID は rpl1xtj6k2x8strx8c2d5fjs50ltztck5ykms4ve7nmzmstf6fhn0v0spelqtx です。裏付け、リリース単位、ミント上限、一時停止、共同署名についてはブリッジをご覧ください。
zUSD は 7 つの別々の請求権ではなく、バスケットです。 裏付けは額面でプールされるため、保有者が負うのは、預け入れたコインのリスクではなく、記載されたすべての裏付けのリスクです。ペッグを失った裏付けを額面どおりに預け入れ、zUSD をバーンして健全な裏付けから引き出すことができ、健全な裏付けが枯渇するまでそれが続きかねません。損失を抑えるのは、ローリングのミントウィンドウ(chain 20 では、裏付けごとの 100,000 zUSD とは別に、全裏付けの合計で 24 時間あたり 4,000 zUSD)と、実際にロックされているカストディです。ウィンドウは速度を制限し、ミントを一時停止する時間を稼ぎますが、総額の上限にはなりません。裏付けが記載されるのはポスト量子ガーディアンのクォーラムの下に限られ、ミントが一時停止されている間は記載されません。
ブリッジの手数料(zUSD建て、chain 20)。 chain 20 のジェネシスは bridge.fees を定めています。入金に 10 bps、バーンに 10 bps で、いずれも裏付けのリリース単位の整数に切り捨てられます(6 桁の USDT では 100 基本単位)。手数料は、ジェネシスが指定するトレジャリーアドレスへ zUSD のノートとして支払われます(v0.6.8、fullnode の docs/bridge.md §25)。g の入金では 2 つのノートが追加されます。入金者の g − fee と、トレジャリーの fee です。1 USDT を入金すると、入金者には 0.999 zUSD が渡ります。amount のバーンでは、fee がトレジャリーのノートとして残り、amount − fee がソースチェーン上でリリースされます。ガーディアンが署名するのはこのリリース額で、rand_getBridgeBurn は amount、release_amount、fee を返します。手数料ノートは発行され、裏付けもあるため、total_supply は引き続き各裏付けの locked の合計に等しくなります。入金は両方を g だけ動かし、バーンは両方を amount − fee だけ減らします。手数料ノートにエンベロープはありません。そのすべての要素が公開されているため(金額はトランザクションとジェネシスのレートから、アセットと time、アテステーションのダイジェストまたはバーンのトランザクション ID から導かれるブラインディング、所有者はジェネシスから)、トレジャリーのウォレットは公開フィールドからそれを再構築できます(ノート)。バーンがプロポーザーに支払う 0.01 RAND の BRIDGE_BURN_FEE は変わりません。chain 14 から 19 には、Rand 上のブリッジ手数料はありませんでした。
chain 15 以降のレジストリ
chain 15 以降、ジェネシスは chain 14 にはなかった 3 つのレジストリルールを有効にしており、chain 20 のジェネシスも同じ 3 つの値を設定しています。それぞれがジェネシスハッシュとトークンルートにコミットされています。
| genesis field | chain 20 | effect |
|---|---|---|
tokens.max_tokens | 4096 | レジストリはこれを超えて保持しません。上限に達すると RegisterToken と RegisterBridgedToken は RegistryFull で拒否されます。ListBacking はトークンを追加しないため、影響を受けません |
tokens.burn_registration_fee | true | 登録の registration_fee はプロポーザに支払われず、焼却されます。プロポーザが受け取るのは fee − registration_fee です。rand_getSupply はこれを burned と registration_fees_burned に計上します(Supply) |
tokens.bound_note_value | true | 2^63 以上の TokenMint、初回ミント、またはブリッジ入金は AmountTooLarge で拒否され、トークンの total_supply が 2^63 に達する、またはそれを超えることになるものは SupplyTooLarge で拒否されます |
ノート価値に上限があるのは、バンドル回路がすべての金額を 63 ビットに範囲チェックするためです。2^63 以上の価値を持つノートはコミットできても使用できず、それでいてトークンの供給量には算入され続けます。このため、すべてのノードは、genesis の設定にかかわらず、どのチェーンでも受け付けの時点でそのような金額を拒否します。
RPC と CLI
| method | params | result |
|---|---|---|
rand_getTokens | [from_index, limit]、省略可、デフォルトは 0 と 1000、1000 に丸められます | { enabled, registration_fee, next_index, max_tokens, burn_registration_fee, bound_note_value, tokens }。index の昇順で、from_index からの範囲読み取りです |
rand_getToken | [token]:index、64 桁の 16 進 id、または rpl1… | 1 つのトークンの行、または null。不正な形式の id は -32602 です |
rand_getTokenSupply | [token]、同じ形式 | { total_supply, backings }。ネイティブトークンでは backings は空です |
これらの結果に含まれる金額(total_supply、registration_fee、backing の locked、mint_cap_per_day、minted_today)はすべて 10 進数の文字列です。JSON の数値は 2⁵³ を超えると正確ではないためです。index、next_index、mint_day、max_tokens は通常の整数です(上限のないチェーンでは max_tokens は null です)。burn_registration_fee と bound_note_value は真偽値です。行の authority は、{"kind":"none"}、{"kind":"key","key","address"}、{"kind":"bridge","backings":[…]}、{"kind":"program","program"} のいずれかです。詳細は JSON-RPC を参照してください。
プライバシー。 rand_getTokens は、呼び出し側がどのトークンを念頭に置いていても、同じコストです。rand_getToken と rand_getTokenSupply は、呼び出し側がどのトークンに関心を持っているかをノードに伝えます。エクスプローラーには問題ありませんが、これから送金するウォレットには不適切です。そのためウォレットは、すべての --asset を一覧全体から解決し、数値の index がノードに届くことは一切ありません。
| command | what it does |
|---|---|
rand token create | レジストリの次の index にトークンを登録します(固定供給、または Key 承認) |
rand token mint | Key 承認のトークンを追加でミントします。権限キーで署名します |
rand token set-authority | 権限を別のキーに引き渡す(--new-key)か、放棄します(--renounce) |
rand token burn <ASSET> <AMOUNT> | このウォレットが保有するユニットを焼却します |
rand token info <ASSET> | 1 つのトークンの完全な行 |
rand token list | レジストリの 1 ページ分 |
rand send <TO> <AMOUNT> --asset <INDEX|rpl1…|hex> | 1 つのバンドルでトークンを送ります。--asset がなければ RAND を送ります。証明の前に、受取人のフィンガープリントと金額を表示し、send? [y/N] と確認します(--yes で確認を省略できます) |
rand asset-balance [INDEX] | このウォレットが 1 つのアセットを保有する量、またはアセットごとの行 |
rand token register-bridged, rand token list-backing | ブリッジの 2 つの登録アクションです。それぞれ PQ ガーディアンのクォーラムファイルが必要です |
v0.5.10 以降、rand send --asset、rand token mint、rand token burn の金額は、トークンの表示単位で指定します。読み取りにはレジストリの行自身の decimals が使われます。小数 6 桁のトークンの 1.5 は、最小単位の 1,500,000 です。トークンが持つ桁数を超える小数は拒否されます。send の確認画面には両方が表示されます(1.500000 USDX (1500000 units))。rand token create の --fixed-supply と --initial は、rand bridge-burn と同様、引き続き最小単位の整数で指定します。rand asset-balance は最小単位で表示します。チェーン上では、金額は常に最小単位の整数です。フラグとデフォルト値は Command line にあります。
ERC-20 および SPL との違い
| ERC-20 / SPL | RPL | |
|---|---|---|
| balances | 公開のマッピングまたはアカウント | シールドされたノート。鍵の保有者だけが見られます |
| transfer events | 公開。送信者、受取人、金額が分かります | なし。送金は、他と区別できるものを何も公開しません |
| per-token code | 可能:税、リベース、フック、凍結 | なし。すべてのトークンが同じ固定ルールに従います |
| holding by a program | 可能 | チェーン 20(RPL-2):プログラムの公開 vault。invoke の burn フィールドで入金され、チェーンが計算したノートとして払い出されます |
| amounts | 最大 256 ビット(ERC-20)、64 ビット(SPL) | u64、小数は最大 9 桁 |
| receiving | ERC-20 は設定不要。SPL は associated token account が必要です | 設定不要。シールドアドレスはどんなものでも受け取れます |
| cost of a transfer | 通常の EVM または SVM の実行 | 送信者が証明します。共有の hidden-asset バンドルに加え、チェーン 17 以降は小さな認可証明が付きます |
| approvals | approve / transferFrom | 未対応 |
| metadata | 実装によっては変更可能 | チェーン上にあり、変更できません |
| freeze, blacklist | 一部のトークンでは可能 | 設計上、対象外です |
既知の制限
- allowance はありません。
approveとtransferFromは、RPL 仕様では取り置き型の allowance アカウントとして設計されていますが、実装されていません。 - プログラムの保有分は公開です。 チェーン 20 では、プログラムは vault にトークンを保有でき、自身のトークンをミントできます(RPL-2)が、vault の残高はトークンの供給量と同じく公開です。非公開なのはノートだけです。チェーン 20 より前には、プログラムの状態そのものがありませんでした。
- 手数料は RAND のみです。 トークンは自身の手数料を支払えません。トークンしか持たないウォレットは動かせません。
u64の金額と最大 9 桁の小数。 18 桁の小数を持つ元のコインは、より低い精度で表現されます。ブリッジは、8 桁の小数と backing ごとの償還単位でこれを処理します。- すべての送金に証明が必要です。 送信者のマシンで約 100 秒と数 GB のメモリを要します。トークンに RAND より安価な経路はありません。
- ネイティブトークンには凍結、ブラックリスト、一時停止がありません。 これは意図的な決定です。ブリッジのミント一時停止は、ブリッジ経由のミントにのみ適用されます。
- トークンごとの照会は関心を漏らします。
rand_getToken、rand_getTokenSupply、エクスプローラーの/tokens/:idは、どのトークンが照会されたかをサーバーに伝えます。