Rand Protocol
문서
핵심 개념

RPL 토큰

RPL 토큰 표준입니다. 원장 레지스트리 항목으로서의 토큰, 자산 id, 인덱스와 rpl1 텍스트 형식, 발행 권한, 생성 비용, 토큰 전송이 RAND 결제와 정확히 같아 보이는 이유, 발행과 소각, 그리고 ERC-20 및 SPL과의 차이를 다룹니다.

이 페이지는 이 체인에서 토큰이 무엇인지 이해하기 위한 것으로, 토큰을 생성하거나 상장하거나 인덱싱하기 전에 읽어 보시기 바랍니다. RPL은 Rand의 토큰 표준이며 체인 14에서 새로 도입되었습니다. 토큰은 shielded 네이티브 자산입니다. 원장 레지스트리의 한 항목이며, 잔액은 RAND가 사용하는 것과 동일한 커밋먼트 트리에 일반 note로 보관됩니다. 컨트랙트가 아닙니다. 단계별로 토큰을 생성하려면 RPL 토큰 배포를 참고하십시오.

이유는 구조적입니다. Call은 영수증만 기록하므로 ERC-20 방식의 컨트랙트에는 잔액을 보관할 곳이 없었고, 공개 잔액 테이블을 두면 토큰이 shielded 체인에서 유일하게 투명한 자산이 됩니다. 그래서 RPL은 토큰을 원장의 일급 객체로 만듭니다. 체인 20은 RPL-2(v0.6.8)를 추가합니다. 프로그램은 공개 상태 셀과 공개 볼트를 보관할 수 있고, 자체 토큰의 발행 권한자가 될 수 있습니다(아래). 사람이 보유하는 잔액은 여전히 note입니다.

토큰은 레지스트리 항목입니다

TokenRegistry(crates/randprotocol-core/src/ledger/tokens.rs)는 네이티브 토큰이든 브리지된 토큰이든 모든 토큰이 공유하는 하나의 테이블입니다. 브리지가 자산의 인덱스를 조회하는 레지스트리도 이것입니다. 각 항목은 다음과 같습니다.

필드규칙
id자산 id, 32바이트, 콘텐츠 주소 방식
indexu32, note의 asset 워드가 담는 값. 조밀하며 등록 순서대로 1부터 부여됩니다. 인덱스 0은 RAND이며 등록되지 않습니다
nameUTF-8 1~32바이트, 공백 허용, 변경 불가
symbolASCII 그래픽 문자 1~12바이트(0x21..=0x7e, 공백 불가), 변경 불가
decimals0~9, 변경 불가
authority발행 권한자, 아래 참조
mint_nonceKey 권한자의 재생 방지 카운터
total_supplyu64, 검사된 산술 연산. 오버플로가 발생하면 발행이 거부됩니다. 체인 15부터는 2^63 미만으로 유지됩니다(아래)
registered_at등록된 높이

금액이 u64이기 때문에 decimals는 9까지로 제한됩니다. decimals가 18이면 u64는 토큰 18.4개만 담을 수 있으며, 9는 RAND 자체의 정밀도입니다. 브리지된 토큰은 원천 코인이 어떤 단위를 쓰든 항상 decimals 8로 등록됩니다.

레지스트리는 bridge와 aggregation이 각자의 섹션으로 켜지는 것처럼 제네시스 파일의 tokens 섹션으로 켜집니다. 이 섹션이 없으면 모든 토큰 액션은 다른 어떤 검사보다 먼저 거부됩니다(TokenError::Disabled). 체인 20의 제네시스에는 이 섹션이 있으며, 일곱 개의 백킹을 가진 zUSD 하나가 등록되어 있습니다. 이 토큰은 체인 14에서 이후의 모든 전환을 거쳐 이어져 왔습니다. 체인상의 다른 모든 토큰은 트랜잭션으로 들어옵니다. (체인 14의 제네시스에는 등록된 토큰이 없었습니다.) 게이트가 켜져 있으면 tokens_root(인덱스 순서로 나열된 blake3("rand-token-leaf-1", bincode(TokenInfo)) 리프의 머클 루트)가 상태 루트에 접혀 들어갑니다. 이후 기능이 하나도 켜져 있지 않은 체인에서 이 루트의 도메인은 rand-state-4입니다. 체인 20의 루트에는 faucet 및 본드 큐 상태, 현재 가스 가격, 프로그램 상태 루트도 포함되며 rand-state-8 아래에서 해시되고, 여기에 한 번 더 승인된 validator 집합이 감쌉니다(합의).

tokens 섹션이 있는 체인은 또한 제네시스의 모든 alloc note가 오프닝(pk, time, r)을 담도록 요구하며, 노드는 커밋먼트를 다시 계산하여 일치하지 않는 파일을 거부합니다. 오프닝이 같은 제네시스에 나열된 토큰의 인덱스를 지정하지 않는 한 커밋먼트는 자산 0에 대한 것입니다. 체인 20에는 인덱스 1의 zUSD 10과 89를 담은 그런 note가 두 개 있습니다. 그리고 나열된 토큰마다 제네시스 note의 합은 그 백킹이 locked로 시작하는 값과 같아야 합니다. note에 토큰을 가리킬 수 있는 asset 워드가 생긴 이후로는, 오프닝이 없는 제네시스 커밋먼트가 어떤 자산이든 담보 없는 note를 검사 없이 풀에 넣을 수 있는 유일한 경로가 되기 때문입니다.

자산 id, 인덱스, 그리고 rpl1…

토큰에는 두 가지 이름이 있으며, 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).
  • 인덱스는 note가 실제로 담는 값입니다. 32바이트 id는 한 워드에 들어가지 않기 때문입니다. 이는 이 체인에서만 의미가 있는 약식 표기입니다.
  • **텍스트 형식 rpl1…**은 32바이트 id에 대해 human-readable part rpl을 쓰는 bech32m(BIP-350)입니다. 데이터 문자 52자와 체크섬 6자, 총 62자입니다. 토큰이 언급되는 모든 곳에서 64자리 16진 id 옆에 표시되며, 토큰을 조회하는 모든 곳에서 허용됩니다. 16진 형식도 계속 허용됩니다. 파싱은 엄격합니다. 체크섬 오류, 잘못된 접두사, 정확히 32바이트가 아닌 페이로드, 대소문자 혼용은 거부되므로 오타가 다른 토큰으로 해석될 수 없습니다.

심볼은 고유하지 않습니다. ERC-20 및 SPL과 마찬가지로 토큰의 정체성은 자산 id이며, 이름이나 티커가 아닙니다.

rand_bridgeAssetId가 계산하고 rand_getAssets가 백킹 행마다 출력하는 기존의 (chain, token) 단위 값은 브리지의 전송 포맷을 위한 더 좁은 식별자이며, 토큰 자체의 id가 아닙니다.

발행 권한자

권한자단위를 발행할 수 있는 주체비고
None등록 이후에는 아무도 없음고정 공급량: 최초 발행이 필수이며 앞으로 존재할 전부입니다
Key(PublicKey)Dilithium2 키 하나의 보유자나중에 서명으로 다시 발행할 수 있으며, 권한을 다른 키에 넘기거나 포기할 수 있습니다
Bridge { backings }브리지의 잠금과 해제만직접 발행은 불가하며, 브리지의 거버넌스 액션을 통해서만 존재합니다
Program(ProgramId)해당 프로그램의 Invoke만 (RPL-2)program_state 섹션이 있는 체인(체인 20)에서는 최초 발행 없이 등록되므로 공급량이 0에서 시작하며, 프로그램의 증명이 보증하는 전이로만 발행되거나 소각됩니다(rand token create --program <id>). 해당 섹션이 없는 체인에서는 등록이 거부됩니다

Bridge를 지정한 RegisterToken은 거부되며(TokenError::AuthorityNotAllowed), 최초 발행을 포함하거나 program_state가 없는 체인에서 Program을 지정한 경우도 마찬가지입니다. Key 권한자는 정확히 하나의 Dilithium2 공개 키여야 합니다. 다른 바이트 길이의 키는 거부되며(TokenError::BadAuthorityKey), 발행에서 수신자의 ML-KEM 키도 같은 방식으로 길이가 검사됩니다. 둘 다 합의 상태이거나 정액 수수료로 구매한 블록 공간이므로, 어느 쪽도 임의로 커질 수 없습니다.

토큰 생성

생성에는 허가가 필요 없습니다. Action::RegisterToken { name, symbol, decimals, authority, initial, salt, index }는 일반 RAND 수수료 번들에 실려 전송되며 BUNDLE_BASE에 레지스트리의 registration_fee를 더한 금액을 지불합니다. 등록 수수료는 1 RAND 이상 10,000 RAND 이하로 제한되는 제네시스 파라미터이므로, 스팸 토큰에도 항상 비용이 듭니다. 체인 20에서는 1 RAND이므로 등록 비용은 1.001 RAND이며, 체인 15 이후의 모든 체인과 마찬가지로 체인 20은 이를 소각합니다. 제안자는 번들 기본 수수료만 가져갑니다(아래).

index는 생성자가 최초 note를 봉인할 때 지정한 레지스트리 인덱스입니다. 다른 등록이 먼저 그 인덱스를 차지했다면 note가 묶여 버리는 대신 트랜잭션이 거부되며(TokenError::IndexMismatch), 생성자는 다음 인덱스에 대해 다시 증명합니다.

발행되는 note는 제출자가 고르는 것이 아니라 체인이 계산합니다. note_commitment(recipient.pk, MINT_FROM, amount, index, time, r)입니다. 금액과 수신자의 pk는 와이어상에서 공개이므로, 봉인된 엔벨로프가 쓸모없는 값이더라도 수신자는 트랜잭션 자체의 필드로 note를 다시 구성할 수 있습니다. 브리지 입금에도 같은 방어가 적용됩니다.

id가 최초 발행 전체에 묶이는 이유

RegisterToken은 서명되지 않습니다. 트랜잭션 바인딩은 증명된 사본이 변경되는 것을 막지만, 새 사본이 무엇을 지정할 수 있는지에 대해서는 아무것도 말하지 않습니다. id가 최초 금액만 포함했다면, 대기 중인 등록을 관찰한 누구든 수신자만 다른 사본을 제출해 같은 id로 등록할 수 있었고, 먼저 커밋함으로써 고정 공급 토큰의 전체 공급량을 가져갈 수 있었을 것입니다. id가 최초 발행 전체(금액, 수신자, r, time, 엔벨로프)를 포함하므로, 방향이 바뀐 사본은 다른 자산 id로 해시됩니다. 즉 같은 심볼을 가진 다른 토큰이 되는데, 심볼이 고유하지 않다는 점에서 이는 이미 허용되는 일입니다. 원본은 한 번 다시 증명하는 비용으로 다음 인덱스에 안착합니다.

전송은 RAND와 동일한 번들입니다

체인 14부터 가치를 이동하는 모든 트랜잭션은 정확히 하나의 번들, 즉 고정된 4-in-4-out 숨김 자산 형태를 담습니다(트랜잭션과 액션). 슬롯 0–1은 비공개 자산(RAND 또는 임의의 RPL 토큰)을 담으며, 회로는 그것이 무엇인지 알지 못합니다. 슬롯 2–3은 항상 RAND를 담습니다. 어떤 자산의 전송이든 Action::None입니다. 이는 일반 RAND 지불에 쓰이는 액션과 같습니다. 토큰 전송 액션은 따로 없으며, 토큰을 지정하는 공개 필드도 없습니다.

관찰자가 토큰 전송에서 보는 것은 RAND 결제가 공개하는 것과 정확히 같습니다. 앵커 하나, 널리파이어 네 개, 커밋먼트 네 개, RAND fee, burn_a = burn_r = burn_asset = 0, time, 엔벨로프 암호문 네 개, 그리고 번들 증명입니다. 체인 17(분할 승인)부터는 모든 번들이 auth_commit과 더 작은 두 번째 승인 증명도 함께 담으며, 이 역시 모든 자산에서 동일합니다. 체인 20에서 각 엔벨로프는 정확히 1,860바이트이며, 메모 전송 여부와 관계없이 암호화된 메모(rand send --memo)를 담을 공간이 있습니다. 관찰자는 송신자, 수신자, 금액, 이동한 자산, 어느 슬롯이 더미였는지, 거스름돈을 볼 수 없습니다.

지갑은 슬롯 0–1에서 해당 토큰의 노트를 최대 두 개, 슬롯 2–3에서 수수료용 RAND 노트를 최대 두 개 사용합니다. 수수료는 항상 RAND이므로, 토큰은 있으나 RAND가 없는 보유자는 증명을 생성하기 전에 거부됩니다. 비용은 RAND 결제와 같습니다(수수료). 체인 20에서는 송신자의 기기에서 STARK 증명 두 개를 생성하는 비용입니다. 하나는 지출 승인(티어 10, 약 7초, 약 1.37 MB)이고 다른 하나는 번들(티어 14, 약 100초, 약 1.5 MB)이며, 네트워크로 전송되는 크기는 합쳐서 약 2.85 MB입니다. 각각 증명 하나에 대한 체인의 상한인 4 MiB 미만입니다. 체인 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에는 엔벨로프의 다이제스트가 포함됩니다. 커밋먼트만으로는 엔벨로프를 보호할 수 없으며, 다이제스트가 없으면 제3자가 가십으로 전파된 발행의 엔벨로프를 임의의 값으로 바꿔 씌우고 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로 수수료를 지불합니다.

동작최소 수수료체인 20 기준
모든 자산의 전송(Action::None)BUNDLE_BASE0.001 RAND
RegisterTokenBUNDLE_BASE + registration_fee1.001 RAND, 이 중 1 RAND는 소각됩니다
TokenMintBUNDLE_BASE0.001 RAND
SetAuthorityBUNDLE_BASE0.001 RAND
TokenBurnBUNDLE_BASE0.001 RAND

체인 20의 제네시스에는 gas 섹션이 있으며, 이는 프로그램 호출과 invoke에만 가격을 매깁니다. 위 최소 수수료는 정액이며, 어떤 RPL 동작도 가스나 바이트 단위로 지불하지 않습니다.

공개되는 것과 숨겨지는 것

공개비공개
등록이름, 심볼, 소수 자릿수, 권한, 자산 id, 최초 발행의 금액과 수신자없음. 이로써 토큰의 공급량은 첫 블록부터 감사할 수 있습니다
추가 발행금액, 수신자의 차폐 주소, 새 노트의 필드RAND 수수료를 누가 지불했는지
전송토큰이 이동했다는 사실 자체를 알려 주는 정보는 전혀 없음송신자, 수신자, 금액, 자산
소각자산과 금액소각된 노트를 누가 보유했는지
권한 변경새 키, 또는 포기되었다는 사실—

따라서 total_supply는 항상 감사할 수 있습니다. 등록과 모든 발행이 더한 양에서 모든 소각을 뺀 값입니다. 보유자 간 전송은 RAND가 아니라 토큰이 오갔다는 사실을 포함해 아무것도 드러내지 않습니다.

공개 범위 지정(disclosure)은 RAND와 같은 방식으로 작동합니다. 노트 평문에 자산이 담겨 있으므로, 트랜잭션별 키(rand tx-key <hash>)나 조회 키(viewing key)는 RAND 노트를 여는 것과 똑같이 토큰 노트를 열며, rand_checkTransaction과 rand_getViewingNotes는 공개하는 노트에 asset을 포함해 반환합니다. 이러한 키가 주어지면 randscan은 인덱스를 레지스트리와 대조해 해당 전송을 이름이 있는 토큰의 전송으로 표시하며, 같은 트랜잭션의 공개 페이지에는 그 어떤 내용도 나타나지 않습니다.

브리지 토큰

Bridge 권한 토큰도 여전히 RPL 토큰입니다. 같은 레지스트리 항목, 같은 숨겨진 전송, 같은 소각 방식을 가집니다. 공급량은 소스 체인에서의 잠금(BridgeAttest)이나 해제(BridgeBurn)를 통해서만 변동합니다. 하나의 브리지 토큰은 여러 **담보(backing)**를 가질 수 있으며, 각 담보는 고유한 소스 소수 자릿수, 잠긴 수량, 발행 한도를 가진 (chain, token) 쌍입니다. total_supply는 항상 담보들이 잠근 수량의 합과 같습니다. 브리지 토큰의 등록과 담보 추가는 브리지의 양자 내성 가디언 정족수 아래에서만 이루어집니다.

체인 20에서 레지스트리의 첫 토큰은 zUSD(“Shielded USD”)이며, 인덱스 1, 소수 자릿수 8이고 제네시스 파일에 담보 일곱 개(Ethereum, Binance Smart Chain, Solana의 USDT와 USDC, 그리고 Tron의 USDT)와 함께 등재되어 있습니다. 이 토큰은 체인 14에서 높이 256의 트랜잭션으로 등록되었을 때의 자산 id를 그대로 유지합니다. 체인 15부터 20까지는 모두 같은 이름, 심볼, salt로 제네시스에 이를 등재합니다. 체인 20은 제네시스 노트 두 개(10과 89)에 담긴 99 zUSD로 시작했으며, 이는 Ethereum에 잠긴 22 USDT, Binance Smart Chain에 잠긴 22 USDT, Tron의 30 USDT, Solana의 25 USDT로 뒷받침되고 체인 19의 브리지 상태에서 이월된 것입니다. 체인 19는 Solana의 10 USDT가 뒷받침하는 10 zUSD로 시작했고, 체인 18은 Tron에 잠긴 9 USDT와 Solana의 1 USDT로 시작했습니다. 총공급량은 담보들이 잠근 수량과 같으며 모든 입금과 상환에 따라 변동합니다. id는 rpl1xtj6k2x8strx8c2d5fjs50ltztck5ykms4ve7nmzmstf6fhn0v0spelqtx입니다. 담보, 해제 단위, 발행 한도, 일시 중지, 공동 서명은 브리지에서 다룹니다.

zUSD는 서로 독립된 일곱 개의 청구권이 아니라 하나의 바스켓입니다. 담보들은 액면가로 풀링되므로, 보유자는 자신이 예치한 코인의 위험뿐 아니라 등재된 모든 담보의 위험을 부담합니다. 페그를 잃은 담보도 액면가로 예치할 수 있고 그렇게 받은 zUSD를 건전한 담보 쪽으로 소각할 수 있으며, 이는 건전한 담보가 고갈될 때까지 계속될 수 있습니다. 손실을 제한하는 것은 롤링 발행 윈도(체인 20에서는 전체 담보 합산 24시간당 4,000 zUSD, 이와 별도로 담보별 100,000)와 실제로 잠겨 있는 수탁 자산입니다. 윈도는 속도를 제한하고 발행을 중지할 시간을 벌어 줄 뿐, 총량의 상한은 아닙니다. 담보는 양자 내성 가디언 정족수 아래에서만 등재되며, 발행이 중지된 동안에는 등재되지 않습니다.

브리지의 수수료, zUSD 기준(체인 20). 체인 20의 제네시스는 bridge.fees를 설정합니다. 입금에 10 bps, 소각에 10 bps이며, 각각 담보의 해제 단위 정수배로 내림하고(소수 자릿수 6의 USDT는 100 기본 단위), 제네시스가 지정한 재무 주소로 zUSD 노트로 지급됩니다(v0.6.8, fullnode docs/bridge.md §25). g의 입금은 노트 두 개를 추가합니다. 입금자의 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는 변하지 않습니다. 체인 14부터 19까지는 Rand에 브리지 수수료가 없었습니다.

체인 15 이후의 레지스트리

체인 15부터 제네시스는 체인 14에 없던 세 가지 레지스트리 규칙을 활성화하며, 체인 20의 제네시스도 같은 세 값을 설정합니다. 각각은 제네시스 해시와 토큰 루트에 커밋됩니다.

제네시스 필드chain 20효과
tokens.max_tokens4096레지스트리는 이를 넘어 토큰을 보유하지 않습니다. 상한에 도달하면 RegisterToken과 RegisterBridgedToken은 RegistryFull로 거부됩니다. ListBacking은 토큰을 추가하지 않으므로 영향을 받지 않습니다
tokens.burn_registration_feetrue등록의 registration_fee는 제안자에게 지급되지 않고 소각되며, 제안자는 fee − registration_fee를 가져갑니다. rand_getSupply는 이를 burned와 registration_fees_burned에 계산합니다(Supply)
tokens.bound_note_valuetrue2^63 이상의 TokenMint, 최초 발행 또는 브리지 입금은 AmountTooLarge로 거부되며, 토큰의 total_supply를 2^63 이상으로 만드는 경우는 SupplyTooLarge로 거부됩니다

노트 값에 상한을 두는 이유는 번들 회로가 모든 금액을 63비트로 범위 검사하기 때문입니다. 2^63 이상의 가치를 가진 노트는 커밋될 수는 있지만 사용될 수 없으면서도 토큰의 공급량에는 계속 포함됩니다. 모든 노드는 제네시스에 어떻게 지정되어 있든 모든 체인에서 이러한 금액을 승인 단계에서 거부합니다.

RPC and CLI

methodparamsresult
rand_getTokens[from_index, limit], 선택 사항이며 기본값은 0과 1000, 1000으로 제한됩니다{ enabled, registration_fee, next_index, max_tokens, burn_registration_fee, bound_note_value, tokens }, 인덱스 오름차순이며 from_index부터 범위로 읽습니다
rand_getToken[token]: 인덱스, 64자리 16진수 id 또는 rpl1…하나의 토큰 행 또는 null이며, 잘못된 형식의 id는 -32602입니다
rand_getTokenSupply[token], 동일한 형식{ total_supply, backings }이며, 네이티브 토큰의 경우 backings는 비어 있습니다

이 결과의 모든 금액(total_supply, registration_fee, 백킹의 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을 전체 목록에서 해석하며, 숫자 인덱스는 노드에 전혀 전달되지 않습니다.

commandwhat it does
rand token create레지스트리의 다음 인덱스에 토큰을 등록합니다. 고정 공급량 또는 Key 권한 방식입니다
rand token mintKey 권한 방식 토큰을 추가로 발행하며, 해당 권한 키로 서명합니다
rand token set-authority권한을 다른 키에 넘기거나(--new-key) 포기합니다(--renounce)
rand token burn <ASSET> <AMOUNT>이 지갑이 보유한 단위를 소각합니다
rand token info <ASSET>하나의 토큰의 전체 행
rand token list레지스트리의 한 페이지
rand send <TO> <AMOUNT> --asset <INDEX|rpl1…|hex>하나의 번들로 토큰을 송금합니다. --asset이 없으면 RAND를 송금합니다. 증명 전에 수신자의 지문과 금액을 출력하고 send? [y/N]을 묻습니다(--yes는 질문을 건너뜁니다)
rand asset-balance [INDEX]이 지갑이 하나의 자산에 대해 보유한 수량, 또는 자산별 한 행
rand token register-bridged, rand token list-backing브리지의 두 가지 등록 작업이며, 각각 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에 있습니다.

Differences from ERC-20 and SPL

ERC-20 / SPLRPL
잔액공개 매핑 또는 계정실드 노트이며, 키 보유자만 확인할 수 있습니다
전송 이벤트공개되며 송신자, 수신자, 금액을 포함합니다없음. 전송은 식별 가능한 어떤 정보도 게시하지 않습니다
토큰별 코드가능: 세금, 리베이스, 훅, 동결없음. 모든 토큰은 동일한 고정 규칙을 따릅니다
프로그램의 보유가능chain 20(RPL-2)에서: 프로그램의 공개 볼트이며, invoke의 소각 필드로 채워지고 체인이 계산한 노트로 지급됩니다
금액최대 256비트(ERC-20), 64비트(SPL)u64, 소수 최대 9자리
수령ERC-20은 별도 설정이 필요 없고, SPL은 연관 토큰 계정이 필요합니다설정 불필요. 실드 주소는 무엇이든 수령합니다
전송 비용일반 EVM 또는 SVM 실행송신자가 증명합니다: 공유되는 숨김 자산 번들과, chain 17부터는 그 옆에 작은 인가 증명이 추가됩니다
승인approve / transferFrom아직 없음
메타데이터일부 구현에서는 변경 가능체인상에 있으며 변경할 수 없음
동결, 블랙리스트일부 토큰에서 가능설계상 범위 밖

Known limits

  • 허용량(allowance) 없음. approve와 transferFrom은 RPL 사양에 지정 목적 허용량 계정으로 설계되어 있으나 구현되지 않았습니다.
  • 프로그램의 보유량은 공개됩니다. chain 20에서 프로그램은 볼트에 토큰을 보유하고 자체 토큰을 발행할 수 있지만(RPL-2), 볼트 잔액은 토큰의 공급량처럼 공개되며 노트만 비공개입니다. chain 20 이전의 체인에는 프로그램 상태가 전혀 없었습니다.
  • 수수료는 RAND로만 냅니다. 토큰은 자신의 수수료를 지불할 수 없으며, 토큰만 가진 지갑은 송금할 수 없습니다.
  • u64 금액과 최대 9자리 소수. 18자리 소수의 원본 코인은 더 낮은 정밀도로 표현되며, 브리지는 이를 8자리 소수와 백킹별 해제 단위로 처리합니다.
  • 모든 전송은 증명됩니다. 송신자의 컴퓨터에서 약 100초와 수 GB의 메모리가 필요하며, 토큰에 대해 RAND보다 저렴한 경로는 없습니다.
  • 네이티브 토큰에는 동결, 블랙리스트, 일시 중지가 없으며, 이는 의도된 결정입니다. 브리지의 발행 일시 중지는 브리지된 발행에만 적용됩니다.
  • 토큰별 조회는 관심사를 노출합니다. rand_getToken, rand_getTokenSupply, 탐색기의 /tokens/:id는 어떤 토큰에 대해 질문했는지를 서버에 알려줍니다.

fullnode 커밋 c0878c3f(chain 21) 기준으로 2026-10-12에 마지막으로 검증되었습니다, 그리고 fullnode `docs/tokens.md`, `docs/cli.md`, `docs/rpc.md`, `docs/superpowers/specs/2026-09-19-rpl-token-standard-design.md`, and the live registry at `randscan.org/api/v1/tokens` on 2026-09-20; updated for chain 15 against fullnode `8abf85e` (v0.5.9) `docs/tokens.md` §§14–16 and `deploy/genesis-chain15.json`; updated for chain 18 on 2026-09-30 against fullnode `90e7716` (the fleet runs v0.6.7 `86941a1`) `docs/tokens.md`, `docs/cli.md`, `docs/shielded.md` §2, `docs/bridge.md` §13.1, `crates/randprotocol-core/src/gas.rs` and `deploy/genesis-chain18.json`; updated for chain 20 on 2026-10-01 against fullnode v0.6.8 `c9c9bd3c` `docs/bridge.md` §25, `docs/program-state.md`, `crates/randprotocol-core/src/ledger/tokens.rs`, `crates/randprotocol-client/src/wallet.rs` (`rebuilt_notes_with`), the committed `deploy/genesis-chain20.json` and `rand_getLimits` on chain 20. 코드와 이 페이지의 내용이 다를 경우 코드가 옳습니다. 알려 주시기 바랍니다.