Gunakan halaman ini untuk berintegrasi dengan jambatan: untuk membina deposit pada rantaian sumber, untuk menghantar perakuan pada Rand, untuk membakar semula aset yang dijambatani keluar, dan untuk membaca keadaan awam jambatan. Chain 20, testnet semasa (beroperasi sejak 2026-10-01 06:17 UTC, fullnode v0.6.8), dipotong dengan seksyen bridge: lapan penjaga bermula pada indeks set penjaga 1, lapan penjaga pasca-kuantum, kunci jeda, pemancar untuk Ethereum, BSC, Tron dan Solana (tiga yang pertama ialah titik akhir yang dipasang semula pada 2026-09-30), kumpulan rules-v2 yang had mint globalnya ialah 4,000 zUSD bagi setiap 24 jam bergulir, satu lantai ulang tayang masuk, dan dua kumpulan baharu dalam v0.6.8: yuran sebanyak 10 bps pada setiap mint dan setiap pembakaran, dikutip dalam zUSD, dan peraturan putaran yang mewajibkan putaran set pasca-kuantum atau kunci jeda membuktikan pemilikan kunci baharu dan menunggu sehari. Tidak seperti genesis chain 14, genesisnya menyenaraikan zUSD dengan ketujuh-tujuh sandaran dan membawa bersama jagaan yang diturunkan daripada chain 14 melalui setiap pemotongan sejak itu (Dibawa dari chain 14). rand_getAssets dan /bridge/assets pada penjelajah memberikan locked semasa bagi setiap sandaran.
Aliran
source chain (Ethereum / BSC / Tron / Solana) Rand
┌────────────────────────────────┐ ┌────────────────────────────────┐
│ lock tokens, emit │ guardians observe, │ BridgeAttest transaction │
│ (amount, token, to, fee) │ sign mu = keccak²(body) │ admission → one deposit note │
└────────────────────────────────┘ threshold n·2/3 + 1 │ computed by the chain │
▲ + Dilithium2 co-signers │ │
release after guardian guardian committee │ BridgeBurn transaction │
signatures on the burn ◄───── secp256k1 keys ◄───────── │ one bundle: slots 0–1 burn the │
message read the burn log │ asset, 2–3 pay the RAND fee; │
│ emits a sequenced burn message │
└────────────────────────────────┘
Masuk: nilai dikunci pada rantaian sumber, penjaga memperakui, sesiapa sahaja menghantar perakuan itu kepada Rand, dan lejar menambah satu nota deposit untuk penerima, iaitu nota yang perkataan assetnya ialah indeks pendaftaran token yang dijambatani. Keluar: transaksi Rand membakar nota aset itu dan memancarkan mesej; penjaga memperakui mesej itu; kontrak pada rantaian sumber melepaskan nilai. Rand tidak pernah mengesahkan pengepala atau bukti keadaan rantaian sumber: tandatangan jawatankuasa penjaga ialah keseluruhan model kepercayaan.
Model kepercayaan dan id rantaian
Id rantaian tempatan jambatan, dikongsi dengan kontrak (bridge-codec):
| rantaian | id |
|---|---|
| Rand | 1 |
| Ethereum | 2 |
| BSC | 3 |
| Tron | 4 |
| Solana | 5 |
Penjaga ialah jawatankuasa kunci secp256k1; identiti seorang penjaga ialah 20 bait terakhir keccak256(uncompressed_pubkey[1..]), iaitu terbitan alamat Ethereum, supaya satu kunci berfungsi pada kontrak EVM, program Solana dan Rand. Kuorum bagi set bersaiz n ialah n·2/3 + 1. Setiap tandatangan mestilah low-s (s ≤ n/2), bagi menutup kemungkinan kebolehubahan (malleability). Digest yang ditandatangani penjaga ialah mu = keccak256(keccak256(body_bytes)). Putaran set penjaga ialah perakuan daripada pemancar tadbir urus (chain 1, keccak256("rand-bridge-governance")), mesti membawa new_index == current + 1, dan mesti ditandatangani oleh set semasa, bukan set yang telah digantikan; set yang keluar mengekalkan tempoh tangguh 86,400 saat untuk pemindahan yang sedang dalam perjalanan. (Itu ialah set ECDSA. Set pasca-kuantum dan kunci jeda diputar melalui tindakan masing-masing, yang pada chain 20 menunggu tempoh lengah satu hari: di bawah.) Jika n·2/3 + 1 penjaga berkomplot, mereka boleh mint nilai sewenang-wenangnya; Pengukuhan jambatan mengehadkan jumlah dan kelajuannya, dan tidak menghapuskan risiko itu.
Pengikatan transaksi. Transaksi Rand tidak membawa tandatangan: pembakaran diberi kuasa oleh bukti STARK bagi bundelnya. Sejak chain 14, setiap bukti bundel dibuat ke atas, dan disahkan terhadap, Transaction::binding, iaitu cincangan seluruh transaksi (id rantaian, satu bundel beserta empat sampulnya, tindakan) dengan hanya bait bukti dikosongkan. Sejak chain 17, bundel membawa dua bukti, bukti bundel dan bukti kebenaran perbelanjaan: pengikatan itu mengosongkan kedua-duanya, mengekalkan auth_commit bundel, dan kedua-duanya disahkan terhadapnya. Salinan pembakaran yang belum selesai dengan to, relayer_fee atau (to_chain, token) yang diubah, atau perakuan dengan time atau sampulnya yang diubah, gagal dalam pengesahan bukti (TxError::InvalidBundleProof). Pada chain 20, pengikatan turut membawa cincangan genesis (genesis binding_domain: 1: rand-tx-bind-2 ke atas cincangan genesis, id rantaian, bundel dan tindakan), maka bukti yang dibuat untuk rantaian lain yang berkongsi id rantaian yang sama juga tidak lulus pengesahan. Dompet dan relayer mesti menjalankan binari yang dibina untuk rantaian yang mereka hantarkan: v0.6.8 pada chain 20 (v0.6.7 pada chain 18 dan 19); rand yang lebih lama menghasilkan bukti dan tandatangan yang ditolak oleh chain 20.
Daemon penjaga dan relayer bukan sebahagian daripada full node; full node membawa codec bersama dan separuh penerimaan.
Format wayar
Setiap integer ialah big-endian; versi wayar ialah 1.
Sampul perakuan
| ofset | panjang | medan |
|---|---|---|
| 0 | 1 | version = 1 |
| 1 | 4 | guardian_set_index |
| 5 | 1 | n_sigs |
| 6 | 66·n_sigs | tandatangan: index (1), r (32), s (32), v (1) |
6 + 66·n_sigs | … | body |
Pengepala badan — 51 bait, kemudian muatan
| ofset | panjang | medan |
|---|---|---|
| 0 | 4 | timestamp |
| 4 | 4 | nonce |
| 8 | 2 | emitter_chain |
| 10 | 32 | emitter_address |
| 42 | 8 | sequence |
| 50 | 1 | consistency_level |
| 51 | … | payload |
Muatan Transfer — id 1, 133 bait
| ofset | panjang | medan |
|---|---|---|
| 0 | 1 | id = 1 |
| 1 | 32 | amount (u256; Rand menggunakan 128 bit rendah, dan deposit juga mesti muat dalam u64 sesebuah nota) |
| 33 | 32 | token_address |
| 65 | 2 | token_chain |
| 67 | 32 | to — cincangan penerima, lihat di bawah |
| 99 | 2 | to_chain |
| 101 | 32 | fee (u256): bahagian relayer daripada amount |
Muatan GuardianSetUpgrade — id 2: id (1), new_index (4), n (1), kemudian n kunci 20 bait.
Alamat Ethereum, BSC dan Tron ialah 20 bait yang dipadankan di sebelah kiri dengan 12 bait sifar dalam slot 32 bait; alamat Solana memenuhi slot itu. Transfer mesti datang daripada pemancar berdaftar bagi rantaian emitter_chain, dan token_chain mesti sama dengan rantaian yang memancarkannya. Perakuan paling banyak 16 KiB. Tiada satu pun pengukuhan jambatan yang mengubah format wayar, codec atau titik akhir rantaian sumber yang telah dipasang: tandatangan bersama pasca-kuantum dan mesej tadbir urus bergerak dalam transaksi Rand, bukan dalam perakuan.
Penerima 32 bait
Alamat terlindung ialah 1,216 bait dan wayar hanya mempunyai ruang untuk 32. Medan to membawa cincangan alamat itu:
to = blake3("rand-shielded-recipient" || pk_bytes || kem_ek) // ShieldedAddress::recipient_hash
Penyimpan deposit menamakan cincangan itu pada rantaian sumber, penjaga menandatanganinya, penghantar meletakkan alamat penuh dalam tindakan BridgeAttest, dan lejar mengira semula cincangan itu serta menolak sebarang ketidakpadanan; jika tidak, penghantar boleh memilih siapa yang menerima deposit orang lain. Antara muka hadapan rantaian sumber mesti menerima bentuk ini; dompet mencetaknya. Chain 11 pernah menjadikan slot itu id penerima secara langsung; bentuk alamat itu telah dikembalikan dengan chain 12 (Akaun dan alamat).
Satu token, banyak sandaran: zUSD
Pendaftaran aset bukan lagi milik jambatan. Ia telah berpindah ke pendaftaran token RPL peringkat lejar, yang dikongsi oleh token asli dan token yang dijambatani, dan akar keadaan rantaian membuat komitmen kepadanya sebagai tokens_root. Token yang dijambatani ialah entri pendaftaran yang pihak berkuasa mintnya ialah Bridge { backings }, dan ia tidak lagi sepadan dengan satu pasangan (chain, token). Yang pertama, zUSD, disandarkan oleh USDT dan USDC yang dikunci pada empat rantaian: Ethereum, Binance Smart Chain dan Solana membawa kedua-dua syiling, Tron hanya USDT (Circle telah menghentikan USDC pada Tron):
chain token (32-byte wire form) coin decimals
2 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7 USDT 6
2 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 USDC 6
3 00000000000000000000000055d398326f99059ff775485246999027b3197955 USDT 18
3 0000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d USDC 18
4 000000000000000000000000a614f803b6fd780986a42c78ec9c7f77e6ded13c USDT 6
5 ce010e60afedb22717bd63192f54145a3f965a33bb82d2c7029eb2ce1e208264 USDT 6
5 c6fa7af3bedbad3a3d65f36aabc97431b1bbe4c2d2f6e0e47ca60203452f5d61 USDC 6
Pada chain 20, zUSD ialah indeks 1, rpl1xtj6k2x8strx8c2d5fjs50ltztck5ykms4ve7nmzmstf6fhn0v0spelqtx, bernama “Shielded USD”, 8 perpuluhan, disenaraikan dalam fail genesis, seperti pada chain 15 hingga 19, dengan nama, simbol dan salt yang dimilikinya pada chain 14, maka id asetnya (32e5ab28c782c663e14da2650a3feb12f16a12db85599f4f62dc169d26f37b1f) dan id rpl1…nya dibawa bersama tanpa berubah (penjelajah: GET /tokens/1). Pada chain 14, ia didaftarkan pada ketinggian 256 oleh transaksi register_bridged_token.
Backing { chain: u16, token: [u8; 32], decimals: u8, locked: u64, minted_today: u64, mint_day: u32 }
Pasangan (chain, token) menyandarkan paling banyak satu token dalam keseluruhan pendaftaran (TokenError::BackingTaken); token mempunyai 1 hingga 32 sandaran; decimals ialah bilangan perpuluhan syiling sumber itu sendiri, 0 hingga 18, tidak sekali-kali 8 milik token yang dijambatani. Sandaran terkumpul ialah risiko yang dinyatakan: tujuh syiling itu boleh ditukar ke dalam dan keluar daripada zUSD pada nilai par, maka nyahpaku (depeg) pada mana-mana satu daripadanya mencairkan nilai setiap pemegang zUSD, dan tiada had pada pihak Rand bagi bahagian satu sandaran.
zUSD ialah sebuah bakul. Pemegang menanggung risiko setiap sandaran yang disenaraikan, bukan risiko syiling yang didepositkannya: satu zUSD ialah tuntutan ke atas kolam, pada mana-mana sandaran yang mempunyai locked yang mencukupi. Tiada apa-apa yang meletakkan harga pada sesuatu sandaran. Satu kunci sebanyak 1 unit mana-mana syiling yang disenaraikan mencetak 1 zUSD, dan satu pembakaran boleh menamakan mana-mana sandaran yang locked-nya menampung jumlah itu, justeru syiling yang telah hilang pasaknya boleh didepositkan pada nilai par dan zUSD dibakar ke arah syiling yang mengekalkan pasaknya, sehingga sandaran yang kukuh habis dikeluarkan. Kerugian dihadkan oleh tetingkap pencetakan bergulir dan oleh jagaan yang benar-benar dikunci: pada chain 20 paling banyak 4,000 zUSD merentasi semua sandaran, dan 100,000 bagi setiap sandaran, boleh dicetak dalam mana-mana tempoh 24 jam (rules v2), dan tidak lebih daripada jumlah yang dipegang oleh sesuatu sandaran yang kukuh boleh keluar melaluinya. Tetingkap itu menghadkan kadar, bukan jumlah: ia membeli masa untuk menjeda pencetakan, yang menghentikan deposit baharu syiling yang lemah itu manakala pembakaran kekal terbuka. Tiada had penebusan bagi setiap sandaran dan tiada jeda bagi setiap sandaran. Pada chain 14, sebelum rules v2, pihak yang menjeda pada titik hujung sumber dan had kadar bagi setiap token menjadi satu-satunya had.
Invarian: total_supply == Σ backings.locked. TokenRegistry::lock (sebuah BridgeAttest) menambah amaun yang diperakui kepada locked sandaran dan kepada total_supply token dalam satu panggilan; TokenRegistry::release (sebuah BridgeBurn) menolak amaun yang dikeluarkan daripada kedua-duanya. Tiada perkara lain yang menulis sama ada satu daripada medan itu, dan daun token memuktamadkan locked setiap sandaran ke dalam tokens_root, jadi dua nod yang tidak bersetuju tentang salah satunya akan menyimpang pada akar keadaan. Titik hujung sumber tidak mengenakan yuran semasa kunci dan menolak keseluruhan amaun yang diperakui semasa pengeluaran, jadi locked setiap sandaran sama dengan jagaan titik hujung itu, tolak mesej yang sedang dalam perjalanan. Yuran pada chain 20 tidak menjejaskan perkara ini: yuran ialah nota zUSD yang kekal diterbitkan dan disandarkan, jadi deposit masih mengunci amaun kasar dan pembakaran hanya mengeluarkan amount − fee. Pada chain 20, potongan 10 bps USDT oleh titik hujung itu sendiri semasa pengeluaran telah ditetapkan kepada 0 pada pemotongan; yuran kini dikenakan pada Rand.
Amaun ialah unit 8 perpuluhan pada wayar, walau berapa pun perpuluhan syiling sumber itu sendiri: deposit 1 USDT daripada Ethereum (6 perpuluhan) dikunci sebagai 100_000_000 unit. Hanya indeks 0, RAND, yang mempunyai sembilan perpuluhan chain ini.
Sesuatu token mesti disenaraikan sebelum deposit pertamanya. Tiada lagi pendaftaran pada kali pertama dilihat: perakuan yang menamakan (chain, token) yang tidak disenaraikan oleh sesiapa ditolak dengan BridgeError::UnlistedToken (token … of chain … is not listed on this chain). Dana kekal dalam jagaan titik hujung sumber sehingga kuorum penjaga pasca-kuantum menyenaraikan syiling itu (Penyenaraian selepas genesis).
asset_id = blake3("rand-bridge-asset" || token_chain (2 bytes BE) || token_address (32 bytes))
rand_bridgeAssetId(token_chain, token_address) masih mengira ini pada mana-mana chain, dan ia ialah apa yang diselesaikan oleh (token_chain, token_address) bagi muatan Transfer, tetapi ia bukan lagi kunci pendaftaran. Apa yang dibawa oleh sebuah nota dan sebuah dompet ialah indeks token itu, sebuah u32 padat: indeks 0 ialah RAND dan tidak pernah berada dalam pendaftaran. rand_getAssets mempunyai satu baris bagi setiap sandaran, setiap baris bagi satu token di bawah indeks yang sama:
[{ "index": 1, "chain": 2, "token": "000000000000000000000000dac17f…", "asset_id": "…", "decimals": 6,
"locked": "0", "mint_cap_per_day": "10000000000000", "minted_today": "0", "mint_day": 20716 }]
locked, mint_cap_per_day dan minted_today ialah rentetan perpuluhan dalam unit 8 perpuluhan, seperti setiap amaun u64 yang disampaikan oleh RPC sejak chain 14; index, chain, decimals dan mint_day kekal sebagai nombor. Kaedah peringkat token — rand_getTokens, rand_getToken, rand_getTokenSupply — memulangkan token yang dijambatankan sebagai satu baris yang membawa semua sandarannya (token RPL). GET /bridge/tokens milik penjelajah ialah senarai benar statik bagi syiling yang diterima oleh jambatan.
Masuk: BridgeAttest
Action::BridgeAttest { attestation: Vec<u8>, recipient: ShieldedAddress, r: Word8, time: u32,
asset: u32, envelope: Envelope, pq_signatures: Vec<PqSignature> }
PqSignature { index: u8, signature: Vec<u8> } // Dilithium2, 2,420 bytes
Dibawa oleh transaksi terlindung biasa yang satu berkas aset tersembunyinya membayar asas 0.001 RAND dan tiada yang lain: relayer-nya membayar bagi pihak penyimpan deposit yang belum memegang RAND. Chain, bukan penghantar, yang mengira nota deposit { pk: recipient.pk, from: 0, amount, asset: <index>, time, r } daripada amaun yang ditandatangani oleh penjaga, jadi relayer tidak dapat mengembungkan atau mengubah hala pencetakan; komitmennya ialah satu-satunya daun yang tidak dibawa oleh transaksi pada wayar. Pada chain 20, amount nota ialah amaun kasar tolak yuran cetak, dan chain menambah nota kedua, iaitu yuran, kepada perbendaharaan (Yuran cetak dan bakar).
Penyilauan diterbitkan, bukan dipilih. r mestilah
r = blake3("rand-deposit-r-1" || mu) // read as eight little-endian words; mu = keccak256(keccak256(body))
ringkasan yang ditandatangani oleh kuorum penjaga; sebarang nilai lain ialah BridgeError::WrongDepositBlinding, ditolak sebelum sebarang kerja tandatangan. Medan itu kekal pada wayar — pembinaan semula medan awam dompet membacanya di situ — ia hanya dikekang, dan peraturan itu meliputi attest bagi sesuatu rotasi juga. Sebelum itu, sesiapa yang melihat transaksi belum selesai milik relayer boleh menghantar perakuan yang sama di bawah penyilauan sendiri: penerima masih mendapat nota, tetapi transaksi relayer itu gugur selepas ia membayar untuk satu bukti. Dengan r ditetapkan, dua penghantar bagi satu perakuan pada satu time menamakan satu nota dan kolam mempertembungkan keduanya pada komitmen.
time dan asset ialah dua ramalan penyimpan deposit, dibuat supaya sampul boleh dimeteraikan sebelum transaksi wujud. time dikekang kepada tetingkap yang sama seperti tetingkap sesuatu berkas (1,024 blok pada chain 20, daripada proof_window_blocks genesis; 256 sebelum itu), dan sengaja tidak diterbitkan: tiada peraturan yang memberikan time yang dipersetujui oleh setiap penghantar, jadi pihak yang mendahului boleh lagi memilih time lain dalam tetingkap — nota lain bagi penerima, amaun dan aset yang sama, yang ditemui oleh dompet penerima dengan cara yang sama — dan kedua-dua penghantaran bertembung pada ringkasan perakuan sebaliknya. asset mestilah sama dengan indeks yang telah diberikan oleh pendaftaran kepada (chain, token), jika tidak TxError::AttestAssetMismatch.
fee muatan Transfer dibawa dan dibayar kepada sesiapa pun: tiada identiti penghantar untuk dibayar, jadi deposit ialah amaun kasar, tolak hanya yuran cetak chain itu sendiri jika genesis menetapkannya (chain 20). Perlindungan ulang main adalah melalui ringkasan: setiap mu yang digunakan masuk ke dalam set spent jambatan, dan mempool menolak relayer kedua yang berlumba pada perakuan yang sama. Sesuatu deposit juga dikekang oleh had cetak sandaran, pada chain 20 oleh had global juga, dan ditolak semasa pencetakan dijeda (B1, rules v2). Kedua-dua had mengira amaun kasar. Pada chain yang genesisnya menetapkan lantai ulang main, chain 20 termasuk, pemindahan yang sequence-nya berada di bawah lantai chain sumbernya ditolak dengan BelowReplayFloor sebelum sebarang tandatangan disemak (Dibawa daripada chain 14).
rand bridge-mint <attestation hex or @file> --pq <JSON or @file> [--to rand1…] [--fee <RAND>] [--no-wait]
rand bridge-rotate <rotation hex or @file> --pq <JSON or @file> [--fee <RAND>] [--no-wait]
--pq diperlukan: kuorum tandatangan bersama Dilithium2 para penjaga sebagai [{"index":0,"signature":"<4840 hex>"},…]. Sebelum sebarang pembuktian, dompet menyahkod perakuan, menyemak kuorum terhadap pq_guardians nod dan id chain, menyemak bahawa penerima di-hash kepada yang diperakui, dan membaca indeks yang disenaraikan; kemudian ia menerbitkan r, memeteraikan sampul penerima (bagi amaun bersih pada chain yang mempunyai yuran) dan membayar dengan satu berkas RAND miliknya sendiri. bridge-rotate menghantar rotasi set penjaga (muatan 2), yang tidak mendepositkan apa-apa, dan menolak apa-apa yang tidak menaikkan set Rand sebanyak satu. Memandangkan setiap medan nota deposit adalah awam dalam satu transaksi itu, dompet penerima membina semula nota deposit yang dialamatkan kepadanya dengan menelusuri transaksi bridge_attest yang telah dikomit, tanpa membuka sebarang sampul — relayer yang berniat jahat boleh memeteraikan sampah tetapi tidak dapat menyembunyikan nota itu.
Keluar: BridgeBurn
Transaction {
chain_id,
bundle: <hidden-asset bundle: slots 0–1 spend the token, slots 2–3 pay the RAND fee;
burn_asset = asset, burn_a = amount, burn_r = 0, fee >= BRIDGE_BURN_FEE>,
action: BridgeBurn { asset, amount, relayer_fee, to_chain, token, to }
}
Sejak berkas aset tersembunyi chain 14, sesuatu pembakaran ialah satu berkas (sebelum ini dua): slot 0–1 membuktikan pembakar memiliki nota aset yang berjumlah sekurang-kurangnya amount, dengan burn_a ialah nilai yang meninggalkan kolam, dan slot 2–3 membayar yuran dalam RAND. Yuran ialah BRIDGE_BURN_FEE, 0.01 RAND, yang meliputi asas berkas itu. relayer_fee ialah sebahagian daripada amount (fee ≤ amount) yang diasingkan pada chain destinasi oleh kontrak pengeluaran, bukan caj tambahan, jadi burn_a tepat amount. Pada chain 20 chain juga mengekalkan yuran bakar sebanyak 10 bps daripada amount sebagai nota zUSD kepada perbendaharaan, dan pengeluaran ialah amount − fee; bahagian relayer mesti muat dalam pengeluaran itu (Yuran cetak dan bakar).
Pembakaran menamakan syilingnya. (to_chain, token) mestilah sandaran bagi aset yang dibakar (jika tidak TokenError::NotABacking), dan dua peraturan disemak pada langkah tindakan, sebelum bukti berkas:
- Unit pengeluaran. Sandaran dengan
d < 8perpuluhan sumber mengeluarkan dalam unit10^(8−d)(100 bagi syiling 6 perpuluhan; 1 bagi syiling 18 perpuluhan). Amaun yang dikeluarkan danrelayer_feemasing-masing mestilah gandaan penuh, jika tidakTokenError::NotReleasable(… is not a multiple of the release unit …): pecahan di bawah unit terkecil syiling sumber akan terkandas dalam jagaan. - Jagaan sandaran itu sendiri. Amaun yang dikeluarkan
≤ lockedbagi sandaran itu, jika tidakTokenError::InsufficientBacking(only … is locked in that backing, not the … asked for). Jumlah bekalan token mungkin menampung pengeluaran itu; jagaan satu sandaran ini yang mesti menampungnya.
Amaun yang dikeluarkan ialah amount pada chain tanpa yuran dan amount − fee pada chain 20.
to mestilah berbentuk betul (20 bait berlapik sifar pada chain 2, 3 dan 4; tidak pernah semuanya sifar). Lejar merekodkan BridgeBurnRecord di bawah burn_sequence yang meningkat secara ketat, dengan cincangan transaksi dalam slot penghantar, dan para penjaga membaca log pembakaran:
→ {"method":"rand_getBridgeBurn","params":[13]}
← { "sequence": 13, "amount": "99900000", "fee": "99900", "release_amount": "99800100",
"body_hex": "…", "digest": "a4bc1c7d…63f4", "tx": "ceb9e3c2…0be7", "height": 2899 }
body_hex ialah mesej keluar tepat seperti yang mesti di-hash dan ditandatangani oleh guardian; jumlah Transfernya ialah release_amount. Rekod di atas ialah pembakaran pertama chain 20: 0.999 zUSD dibakar ke arah USDT BSC pada ketinggian 2,899, yang mana 0.000999 masuk ke perbendaharaan dan 0.998001 dilepaskan.
rand bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> [--relayer-fee N] [--fee <RAND>] [--no-wait] [--yes]
rand bridge-message <SEQUENCE> # one outbound message, verbatim, for a guardian to sign
Dompet menyemak dahulu, daripada satu bacaan keadaan jambatan dan daftar token, sebelum sebarang pembuktian, bahawa chain tersebut mempunyai jambatan, bahawa ASSET ada dalam daftar, bahawa TOKEN pada TO_CHAIN menyokongnya dan mempunyai sekurang-kurangnya AMOUNT yang dikunci, serta bahawa AMOUNT dan yuran relayer ialah unit pelepasan yang bulat. Pada chain yang mempunyai yuran, dompet kemudian memaparkan yuran jambatan dan jumlah yang akan dilepaskan, lalu bertanya sebelum membuktikan (--yes melangkau soalan itu). Satu pembakaran kemudian membuktikan satu bundle: kira-kira 100 s pada komputer riba dan kira-kira 1.5 MB bukti, dan pada chain 20, seperti bagi setiap bundle sejak chain 17, satu bukti kebenaran perbelanjaan di sisinya (beberapa saat, kira-kira 1.37 MB).
Yuran ke atas pencetakan dan pembakaran
Baharu dalam fullnode v0.6.8 dan ditetapkan pada chain 20 oleh kumpulan genesis
"bridge": { …, "fees": { "mint_bps": 10, "burn_bps": 10, "recipient": "rand1…" } }
chain mengenakan yuran ke atas setiap pencetakan yang melalui jambatan dan setiap pembakaran yang melalui jambatan, dalam token yang dijambatankan, di Rand, sebagai nota terlindung kepada alamat perbendaharaan recipient. Setiap kadar paling tinggi 100 bps (1 %); pada chain 20 kedua-duanya 10 bps, iaitu 0.1 %. Yuran ialah ⌊amount · bps / 10⁴⌋ yang dibundarkan ke bawah kepada unit pelepasan yang bulat bagi sokongan tersebut (10^(8 − source decimals): 100 unit bagi USDT 6 perpuluhan, 1 bagi syiling 18 perpuluhan), maka yuran dan bakinya kedua-duanya ialah unit yang bulat, dan yuran yang dibundarkan kepada sifar tidak menghasilkan nota (ledger/bridge_notes.rs, bridge_fee).
deposit (BridgeAttest) berjumlah kasar g | pembakaran (BridgeBurn) sebanyak amount | |
|---|---|---|
| yuran | ⌊g · mint_bps / 10⁴⌋, ke bawah kepada unit pelepasan | ⌊amount · burn_bps / 10⁴⌋, ke bawah kepada unit pelepasan |
| bahagian pengguna | nota deposit sebanyak g − fee | amount dibakar (burn_a == amount, tiada baki guest); badan mesej keluar mengesahkan release_amount = amount − fee, dan endpoint melepaskan tepat jumlah itu |
| nota perbendaharaan | fee, blinding blake3("rand-bridge-fee-r-1" ‖ mu), pada time dan aset deposit | fee, blinding blake3("rand-bridge-burn-fee-r-1" ‖ txid), pada time bundle |
locked dan total_supply | meningkat sebanyak g | menurun sebanyak release_amount |
| disemak terhadap | had cetak bagi setiap sokongan dan had cetak global, pada g | InsufficientBacking dan NotReleasable pada release_amount; bahagian relayer mesti muat di dalamnya (FeeExceedsAmount) |
Kedua-dua nota diterbitkan dan disokong, maka total_supply == Σ locked == custody kekal benar: nota yuran ialah zUSD seperti yang lain, dan nilainya kekal dikunci pada chain sumber sehingga ada yang membakarnya. BRIDGE_BURN_FEE, iaitu 0.01 RAND yang dibayar oleh satu pembakaran dalam slot RAND-nya, tidak berubah dan berasingan.
Pusingan pergi-balik pertama chain 20, dibaca daripada nod: deposit 1 zUSD daripada BSC pada ketinggian 1,664 (4f6e6c54…1a64) memberikan 0.999 zUSD kepada pendeposit dan 0.001 kepada perbendaharaan; pembakaran 0.999 zUSD kembali ke USDT BSC pada ketinggian 2,899 (jujukan 13) menyimpan 0.000999 zUSD dan melepaskan 0.998001. Selepas itu (dibaca 2026-10-01) sokongan USDT BSC memegang 22.001999 zUSD, dan bekalan token itu, 99.001999 zUSD, sama dengan jumlah sokongannya.
Bagaimana perbendaharaan menemui notanya. Nota yuran tidak mempunyai sampul: setiap perkataannya awam (jumlah daripada transaksi dan kadar genesis, aset dan time daripada transaksi, blinding diterbitkan, pemilik ialah recipient genesis). Dompet yang alamatnya ialah recipient membina semula nota yuran dalam laluan awam yang sama yang membina semula nota deposit, dengan membaca rand_getBridgeState.fees dan perpuluhan sokongan sekali bagi setiap penyegerakan. Nod yang berbohong tentang yuran hanya dapat menyebabkan sesuatu nota tidak ditemui, tidak pernah dapat mengkreditkan satu pun. Dompet pendeposit menilai depositnya sendiri dengan cara yang sama, kasar tolak yuran. Hanya dompet v0.6.8 melakukan ini; dompet yang lebih lama tidak dapat menghantar pada chain 20 dalam apa jua keadaan.
Tanpa kumpulan itu, iaitu chain 14 hingga 19, tiada yuran: deposit mengkreditkan jumlah kasar dan pembakaran melepaskan amount. Sehingga chain 20, satu-satunya yuran jambatan ialah potongan 10 bps USDT oleh endpoint sumber itu sendiri semasa pelepasan, pada chain hos; ia ditetapkan kepada 0 pada pemotongan chain 20. Kumpulan itu diikat kepada hash genesis dan dilipat ke dalam akar jambatan di bawah rand-bridge-fees-1. Fullnode docs/bridge.md §25 mempunyai pengekodannya.
Pengukuhan jambatan
locked dan InsufficientBacking bagi setiap sokongan mengawal penebusan. Kedua-duanya tidak mengikat pencetakan: pengesahan dengan kuorum guardian yang sah mencetak apa yang dinyatakannya. Tiga lapisan menutup jurang itu dan lapisan keempat membolehkan token disenaraikan tanpa pemotongan chain. Tiada satu pun mengubah endpoint chain sumber, format wayar pengesahan atau bridge-codec.
B1: had cetak bagi setiap sokongan, dan jeda cetak
tokens.mint_cap_per_day genesis terpakai bagi setiap sokongan: chain 20 menetapkan 10000000000000, iaitu 100,000 zUSD bagi setiap sokongan sehari, seperti setiap chain sejak 14. Tanpa peraturan v2 (chain 14), satu hari ialah timestamp_ms / 86_400_000 bagi cap masa blok; di bawah peraturan v2 (chain 15 hingga 20) had yang sama diukur pada tetingkap bergulir cap_window_secs masa blok, dan had global seluruh daftar, 4,000 zUSD bagi setiap 86,400 s pada chain 20, ialah batas yang lebih ketat (peraturan v2). Deposit yang melepasi had ditolak dengan TokenError::MintCapExceeded sebelum kerja tandatangan guardian, dan boleh diterima semula setelah tetingkap mempunyai ruang lagi.
bridge.pause_key genesis ialah satu kunci Dilithium2, berbeza daripada setiap guardian pasca-kuantum. Dua tindakan tanpa bundle dan tanpa yuran:
PauseMints { nonce, signature }— ditandatangani oleh kunci jeda sahaja. Ia hanya boleh menjeda.UnpauseMints { nonce, pq_signatures }— memerlukan kuorum guardian pasca-kuantum, tidak pernah kunci jeda.
Kedua-duanya membawa dan menaikkan pause_nonce, maka tiada yang boleh dimainkan semula. Semasa dijeda, setiap BridgeAttest pemindahan ditolak dengan BridgeError::MintsPaused; pembakaran dan putaran set guardian kekal terbuka, maka jeda tidak pernah memerangkap penebusan. Di bawah peraturan v2 (chain 15 hingga 20), penyenaraian juga ditolak semasa dijeda. Kunci jeda dimaksudkan untuk disimpan pada mesin yang berlainan daripada kunci guardian.
rand bridge-pause --sig <HEX or @file> [--no-wait] # no key file and no RAND needed
rand bridge-unpause --pq <JSON or @file> [--no-wait]
Apa yang dilindungi oleh jeda: daemon guardian yang diperdaya atau dikompromi untuk turut menandatangani pencetakan palsu sedangkan pemegang kuorum pasca-kuantum tidak. Ia bukan pertahanan terhadap kecurian kuorum itu, yang boleh menyahjeda, menyenaraikan sehingga 32 sokongan pada satu token, masing-masing dengan had hariannya sendiri, dan di bawah peraturan v2 menggantikan set pasca-kuantum dan kunci jeda.
B2: cap masa blok yang terhad
Cap masa blok bagi chain yang berjambatan menentukan tamat tempoh set guardian dan hari had cetak, maka pemimpin tidak boleh dibenarkan melonjakkannya. Pada chain yang mempunyai jambatan:
- Peraturan kesahan, disemak juga semasa main semula:
timestamp_ms ≤ parent.timestamp_ms + 60_000, jika tidakBlockError::TimestampLeap. Bersama peraturan gulung balik yang sedia ada (BlockError::TimestampRewind), masa blok hanya bergerak ke hadapan, paling banyak seminit bagi setiap blok. - Peraturan undi, tidak pernah peraturan main semula: validator menahan undinya daripada blok yang lebih daripada 15,000 ms mendahului jamnya sendiri.
Setiap validator pada chain yang berjambatan oleh itu memerlukan NTP: yang tersasar lebih daripada 15 saat ialah pemimpin yang cacat dan pengundi yang cacat. Semasa chain mengejar ketinggalan selepas berhenti, masa blok boleh maju sehingga 60 s bagi setiap blok, maka hari had cetak boleh bertukar lebih pantas daripada hari sebenar, paling banyak had satu hari tambahan bagi setiap hari penuh kelewatan terkumpul.
B3: tandatangan bersama Dilithium2 pada setiap pencetakan
Setiap BridgeAttest, sama ada deposit atau putaran, mesti membawa di sisi kuorum ECDSA-nya satu kuorum tandatangan Dilithium2 ke atas
M = "rand-bridge-pq-cosign-1" || rand_chain_id (u64 BE) || mu // 63 bytes
mu ialah digest yang ditandatangani oleh kuorum ECDSA; id chain menghalang tandatangan bersama testnet daripada disahkan pada chain Rand yang lain. Tandatangan itu dibawa dalam pq_signatures tindakan, di dalam pengikatan transaksi, maka ia tidak boleh dibuang atau ditukar pada salinan. Disemak yang murah sebelum yang mahal: quorum(n) ≤ len ≤ n (PqNoQuorum), indeks meningkat secara ketat (PqIndexOrder), setiap indeks < n (PqIndexOutOfRange), setiap tandatangan tepat 2,420 bait (PqBadSignatureLength), dan terakhir bahawa setiap satu disahkan di bawah pq_guardians[index] (PqBadSignature). Kedua-dua kuorum dikira secara bebas. bridge.pq_guardians genesis sejajar indeks dengan set ECDSA genesis (set 1 pada chain 20). Putaran payload-2 hanya menggerakkan set ECDSA; tanpa peraturan v2 set pasca-kuantum tetap sepanjang hayat chain, dan di bawah peraturan v2 hanya RotatePqGuardians menggantikannya (pada chain 20 bentuk V2-nya, dengan bukti pemilikan dan kelewatan satu hari). Chain 20 mempunyai lapan, lapan kunci yang sama seperti chain 15 hingga 19; satu pencetakan memerlukan enam daripadanya (chain 14 mempunyai enam dan memerlukan lima).
Tandatangan bersama ini masih mengikat id rantaian sahaja, pada chain 20 juga: tidak seperti mesej tadbir urus di bawah, ia tidak dialihkan ke belakang hash genesis, kerana daemon guardian yang menghasilkannya berada dalam repositori lain dan belum berubah. Salinan rantaian dengan id yang sama yang turut menyalin set guardian akan menerima tandatangan bersama sesuatu deposit yang dibuat untuk rantaian asal; himpunan yuran milik transaksi deposit itu sendiri terikat pada genesis pada chain 20, tetapi attestation di dalamnya tidak.
B4: menyenaraikan token berjambatan selepas genesis
Alamat biasa tidak boleh mencipta token berautoriti Bridge. Terdapat dua tindakan, masing-masing menggunakan himpunan yuran RAND biasa dan di bawah kuorum pasca-kuantum:
RegisterBridgedToken { name, symbol, salt, chain, token, decimals, nonce, pq_signatures }— token berjambatan baharu pada indeks seterusnya, 8 perpuluhan pada Rand, di bawah had pencetakan genesis, bersama sokongan pertamanya. Yuran: asas himpunan campurregistration_feependaftar (1 RAND pada chain 20, maka 1.001 RAND; chain 20 membakar yuran pendaftaran dan tidak membayarnya kepada pencadang).ListBacking { token_index, chain, token, decimals, nonce, pq_signatures }— sokongan tambahan bagi token berjambatan yang telah didaftarkan, bermula padalocked = 0. Yuran: asas himpunan.
Kedua-duanya membawa dan menaikkan list_nonce (jika tidak, BadListNonce { expected, got }) dan menjalankan semakan yang sama: rantaian itu mempunyai emitter berdaftar (BridgeError::NoEmitter), (chain, token) belum menyokong apa-apa, kurang daripada 32 sokongan, decimals ≤ 18.
rand token register-bridged --name … --symbol … --salt <hex32> --chain N --token <hex32> --decimals N --pq <JSON or @file>
rand token list-backing --asset <index> --chain N --token <hex32> --decimals N --pq <JSON or @file>
Dua peraturan tertib. Guardian menandatangani pendaftaran dahulu, menunggu ia dikomit, membaca semula indeks yang ditetapkan, dan barulah menandatangani penyenaraian yang menamakannya — mendaftarkan token asli tidak memerlukan kebenaran, maka penyenaraian yang ditandatangani lebih awal mungkin mendapati indeksnya telah diambil. Dan sesuatu syiling disenaraikan pada Rand sebelum setToken mengaktifkannya pada endpoint sumber: jika terbalik, sesuatu deposit boleh dikunci sebelum Rand mempunyai sokongan untuk dikreditkan, dan attestation-nya akan ditolak dengan UnlistedToken sehingga Rand mengejar ketinggalan.
Mesej tadbir urus
Bait tetap, tidak pernah bincode; semua integer big-endian:
M_pause = "rand-bridge-pause-1" || chain_id u64 || nonce u64
M_unpause = "rand-bridge-pq-unpause-1" || chain_id u64 || nonce u64
M_list = "rand-bridge-pq-list-1" || chain_id u64 || nonce u64 || token_index u32 || chain u16 || token [32] || decimals u8
M_register = "rand-bridge-pq-register-1" || chain_id u64 || nonce u64 || u8 len || name || u8 len || symbol || salt [32] || chain u16 || token [32] || decimals u8
M_rotate_pq = "rand-bridge-pq-rotate-pq-1" || chain_id u64 || rotation_nonce u64 || count u32 || key [1312] … // rules v2
M_rotate_pause = "rand-bridge-pq-rotate-pause-1" || chain_id u64 || rotation_nonce u64 || key [1312] // rules v2
M_pause/M_unpause membawa pause_nonce, M_list/M_register membawa list_nonce, dan M_rotate_pq/M_rotate_pause membawa rotation_nonce. count ialah bilangan kunci, bukan panjang bait; setiap kunci ialah 1,312 bait mentah kunci awam Dilithium2, mengikut tertib yang akan dimiliki set baharu.
Pada chain 20 setiap mesej terikat pada hash genesis (genesis binding_domain: 1): digit versi pada tag menjadi 2 dan hash genesis 32 bait terletak di antara tag dan id rantaian, bahagian ekor tidak berubah — M'_pause = "rand-bridge-pause-2" || genesis [32] || chain_id u64 || nonce u64, dan begitu juga rand-bridge-pq-unpause-2, rand-bridge-pq-list-2, rand-bridge-pq-register-2, rand-bridge-pq-rotate-pq-2 dan rand-bridge-pq-rotate-pause-2 (bridge/gov.rs). Kunci jeda atau kuorum yang menandatangani untuk satu rantaian dengan itu tidak menandatangani untuk mana-mana rantaian lain yang berkongsi id rantaian dan kuncinya. Fail yang ditandatangani dalam bentuk …-1 ditolak pada chain 20 (BadPauseSignature, PqBadSignature). Chain 14 hingga 19 menggunakan susun atur …-1 di atas, bait demi bait.
Peraturan v2: putaran, had bergulir, tiada penyenaraian semasa dijeda
Kumpulan pilihan di dalam bahagian bridge genesis. Chain 14 tidak memilikinya; setiap rantaian sejak chain 15 memilikinya, chain 20 dengan nilai yang sama:
"bridge": { …, "rules_v2": { "global_mint_cap_per_window": 400000000000, "cap_window_secs": 86400 } }
- Dua putaran di bawah kuorum pasca-kuantum.
RotatePqGuardians { new_pq_guardians, nonce, pq_signatures }menggantikan keseluruhan set pasca-kuantum;RotatePauseKey { new_pause_key, nonce, pq_signatures }menggantikan kunci jeda. Kedua-duanya tanpa himpunan dan tanpa yuran sepertiPauseMints, kedua-duanya ditandatangani oleh set pasca-kuantum semasa, dan kedua-duanya membawa dan menaikkanrotation_nonce, supaya satu kuorum yang ditandatangani memberi kuasa kepada tepat satu putaran. Set baharu mestilah sepanjang set ECDSA semasa, berkunci 1,312 bait, tanpa pengulangan dan bukan kunci jeda. Tiada tempoh tangguh: set atau kunci yang telah digantikan tidak menandatangani apa-apa lagi. Pada chain 20 tindakan v1 ini ditolak, dan sesuatu putaran mesti membuktikan pemilikan kunci baharu serta menunggu sehari (di bawah). - Had tetingkap bergulir.
mint_cap_per_daybagi setiap sokongan diukur sepanjang tetingkap bergulircap_window_secsdan bukan hari kalendar, dan had kedua seluruh pendaftar,global_mint_cap_per_window, meliputi setiap sokongan bagi setiap token secara bersama (TokenError::GlobalMintCapExceeded). Pada chain 20 ia ialah 400,000,000,000 unit, 4,000 zUSD bagi setiap 86,400 s. Di bawah peraturan hari, had pada 23:59:59 dan sekali lagi pada 00:00:01 ialah dua kali ganda had dalam dua saat; di bawah tetingkap, saat kedua ditolak. - Tiada penyenaraian semasa dijeda.
RegisterBridgedTokendanListBackingditolak denganMintsPausedapabilamint_paused. Pembakaran dan kedua-dua putaran kekal terbuka.
Putaran: pemilikan dan kelewatan sehari
Peraturan v2 meninggalkan tiga perkara terbuka: tiada apa-apa yang membuktikan kunci baharu dimiliki sesiapa (kesilapan menaip, atau kunci yang tiada pemiliknya, akan melumpuhkan kuorum pasca-kuantum selama-lamanya), sesuatu putaran berkuat kuasa dalam blok tempat ia mendarat, dan tiada apa-apa yang dapat menghentikan putaran yang berniat jahat. Kumpulan pilihan kedua di sebelah rules_v2 (yang diperlukannya), baharu dalam v0.6.8 (audit v6, BRG-14), menutup ketiga-tiganya. Chain 20 menetapkannya:
"bridge": { …, "rotation": { "delay_secs": 86400, "needs_possession": true } }
- Pemilikan. Sesuatu putaran mestilah
RotatePqGuardiansV2 { new_pq_guardians, possession, nonce, pq_signatures }atauRotatePauseKeyV2 { new_pause_key, possession, nonce, pq_signatures }:possession[i]ialah tandatangan Dilithium2 kunci baharuisendiri ke atas mesej yang sama dengan yang ditandatangani kuorum (M_rotate_pqatauM_rotate_pause, dalam bentuk…-2pada chain 20), satu bagi setiap kunci mengikut tertib kunci, masing-masing 2,420 bait. Tindakan v1 ditolak denganPossessionRequired. Bilangan atau panjang yang salah ditolak sebelum kuorum disahkan; tandatangan pemilikan yang buruk (BadPossession { index }) selepasnya. - Kelewatan. Putaran yang diterima direkodkan sebagai belum selesai, dengan
effective_at_secs = block time + delay_secs, dan berkuat kuasa pada penghujung blok pertama yang cap masanya mencapainya. Pada chain 20 itu ialah 86,400 s, iaitu sehari. Sehingga itu, set lama menandatangani bersama setiap pencetakan dan kunci jeda lama menjeda. Menerima putaran menggunakan saturotation_noncedan mengaktifkannya menggunakan satu lagi, maka attestation pencetakan yang dikumpulkan di bawah set lama meninggalkan kumpulan apabila set bertukar. Satu putaran bagi setiap jenis boleh belum selesai pada satu-satu masa (RotationPending { effective_at_secs }). - Pembatalan.
CancelRotation { kind, nonce, signature }(tanpa himpunan, tanpa yuran) menggugurkan putarankindyang belum selesai (0 = set pasca-kuantum, 1 = kunci jeda). Ia ditandatangani oleh kunci jeda semasa, satu-satunya kunci yang dipegang berasingan daripada kuorum, ke atas"rand-bridge-cancel-rotation-2" || genesis [32] || chain_id u64 || rotation_nonce u64 || kind u8pada chain 20, dan menggunakan nonce. Kuorum yang dirampas dengan itu tidak boleh memutar set dalam masa kurang sehari, dan pemegang kunci jeda boleh menghentikannya dalam sehari itu; kunci jeda yang bakal masuk tidak boleh membatalkan ketibaannya sendiri.
Penandatangan ialah rand-node bridge-gov (rotate-pq, rotate-pause, cancel-rotation, masing-masing dengan langkah message, sign dan submit; submit mengesahkan semula setiap baris pemilikan sebelum menghantar). rand_getBridgeState menyediakan rotation_rules dan pending_rotations; kedua-duanya null pada rantaian tanpa kumpulan itu (chain 14 hingga 19). Putaran set guardian ECDSA (payload 2) tidak terjejas: ia mengekalkan peraturan dan tempoh tangguhnya sendiri. Tiada putaran yang telah dijalankan pada chain 20.
Dibawa daripada chain 14
Chain 15 dipotong daripada kedudukan jambatan chain 14 (emitter dan endpoint sumber yang sama), dan chain 16, 17 dan 18 masing-masing dipotong daripada pendahulunya dengan cara yang sama. Chain 19 dipotong daripada kedudukan chain 18 dengan satu perubahan: emitter Ethereum, BSC dan Tron miliknya ialah endpoint yang dilancarkan semula pada 2026-09-30 (0x7af6b17047c1db6cb54347fdea45cf9179075bfa bagi chain 2 dan 3, 0x6410797df959987a5baf65b5fab97edeb34d5163 bagi chain 4). Chain 18 tidak pernah mempercayainya, maka tiada apa-apa daripadanya dicetak di sana. Chain 20 dipotong daripada syot kilat chain 19 pada ketinggian 7,258, dengan jambatan dihentikan dahulu, dan mengekalkan emitter, guardian, kunci pasca-kuantum dan kunci jeda chain 19 tanpa perubahan; yang ditambahnya ialah kumpulan yuran dan putaran. Emitter Solana dan emitter sebelah Rand tidak berubah sejak chain 14. Apa yang dibawa oleh genesis chain 20:
- Penjagaan. 99 zUSD, sebagai dua nota zUSD genesis (10 dan 89 zUSD), berbanding 22 USDT yang dikunci di Ethereum, 22 USDT di BSC, 30 USDT di Tron dan 25 USDT di Solana, serta 0 pada setiap sandaran USDC:
lockedrantaian 19 pada syot kilat, yang sepadan dengan penjagaan di titik akhir.total_supply == Σ lockedsama dengan penjagaan di titik akhir pada blok 0. Sejarah: 10 zUSD yang tinggal pada rantaian 14 ialah satu nota genesis pada rantaian 15 hingga 19; genesis rantaian 18 menyimpannya sebagai 9 USDT dikunci di Tron dan 1 di Solana, dan genesis rantaian 19 sebagai 10 di Solana selepas pengimbangan semula pada rantaian 18. Baki 89 ialah deposit bersih rantaian 19, ditolak pembakarannya. - Indeks set penjaga 1, iaitu tempat titik akhir sumber sudah berada; putaran ECDSA seterusnya mesti membawa indeks 2. Lapan kunci pasca-kuantum dan kunci jeda ialah kepunyaan rantaian 15, tidak berubah.
burn_sequence13: pembakaran rantaian 14 berakhir pada 6, genesis rantaian 15 hingga 18 bermula pada 7, rantaian 18 melakukan satu pembakaran (7) dan rantaian 19 bermula pada 8. Rantaian 19 melakukan lima pembakaran, jujukan 8 hingga 12, maka rantaian 20 bermula pada 13, dan tiada titik akhir atau daemon yang dikunci mengikut jujukan melihat satu jujukan dua kali. Pembakaran pertama rantaian 20 mengambil jujukan 13.- Ulang main. Pencetakan daripada rantaian terdahulu masih akan lulus kuorum ECDSA, tetapi tandatangan bersama pasca-kuantumnya mengikat id rantaian itu, maka ia ditolak pada rantaian 20. Genesis rantaian 15 tidak mempunyai lantai ulang main masuk (
min_inbound_sequenceialahnull), jadi di sana perlindungan bergantung pada tandatangan bersama dan pada penjaga yang tidak sekali-kali menandatangani bersama kunci lama untuk id rantaian baharu. Sejak rantaian 16, genesis menetapkannya: bagi setiap rantaian sumber,sequenceterendah yang boleh dibawa oleh perakuan pemindahan daripada pemancar rantaian itu. Lantai rantaian 20 ialah{ "2": 3, "3": 3, "4": 3, "5": 7 }: jujukan keluar seterusnya bagi setiap titik akhir apabila rantaian 19 diambil syot kilatnya, dengan setiap kunci terdahulu telah dicetak pada rantaian 19. (Lantai rantaian 18 ialah{ "2": 2, "3": 2, "4": 2, "5": 2 }; lantai rantaian 19 ialah{ "2": 1, "3": 1, "4": 1, "5": 4 }, dengan jujukan 0 pada setiap titik akhir yang dipasang semula merupakan kunci milik pengendali sendiri, yang tidak boleh sekali-kali dicetak.) Pemindahan di bawah lantai ditolak denganBelowReplayFloor, apa pun kuorum dan tandatangan bersama yang dibawanya. Putaran set penjaga tidak dinilai olehnya. Lantai ditetapkan pada genesis, diikat kepada hash genesis dan dibalut ke dalam akar jambatan.
Urutan pelancaran pada rantaian 14 (sejarah)
Bagaimana jambatan dihidupkan pada rantaian 14, sebuah testnet terdahulu, pada September 2026:
- Potong rantaian dengan seksyen
bridge(termasukpq_guardiansdanpause_key) dan seksyentokensyang menetapkanregistration_feedanmint_cap_per_day, tanpa menyenaraikan sebarang token. Selesai 2026-09-20. - Dayakan faucet supaya dompet penggerak boleh memperoleh RAND. Selesai.
- Penggerak mendaftarkan zUSD dengan sandaran pertamanya di bawah tandatangan kuorum ke atas
M_registerpadalist_nonce = 0. Selesai pada ketinggian 256. - Penjaga membaca semula indeks dan menandatangani enam mesej
ListBackingyang tinggal, dihantar satu demi satu. Selesai:list_noncebernilai 7. - Bagi setiap sandaran: senaraikan pada Rand sebelum
setTokenpada titik akhir sumber. - Putaran set penjaga (set 0 → set 1, ditandatangani 5 daripada 6 oleh set semasa) pada empat titik akhir sumber, kemudian perakuan yang sama pada Rand. Rand membaca set 0 sepanjang hayat rantaian 14; rantaian 15 bermula pada set 1.
- Satu pusingan penuh secara langsung bagi setiap rantaian sumber dengan jumlah kecil — merentas masuk, cetak zUSD, pindah, bakar semula — dan penyelarasan
lockedsetiap sandaran (rand_getTokenSupply) dengan penjagaan di titik akhir.
Keadaan awam
rand_getBridgeState:
{
"enabled": true,
"emitter": "01…", "emitters": { "2": "02…" },
"guardian_set_index": 0, "guardians": ["aabb…"],
"pq_guardians": ["…"],
"mint_paused": false, "pause_nonce": 0, "list_nonce": 0, "pause_key": "…",
"registration_fee": "1000000000",
"burn_sequence": 1,
"rotation_nonce": 0,
"rules_v2": { "global_mint_cap_per_window": "400000000000", "cap_window_secs": 86400,
"global_minted_in_window": "…", "global_mint_headroom": "…" },
"min_inbound_sequence": null,
"rotation_rules": null, "pending_rotations": null,
"fees": null,
"assets": [ … ]
}
pq_guardians ialah kunci awam Dilithium2, setiap satu 1,312 bait dalam bentuk heks. Tiada lagi next_index: token yang dirantai-silang disenaraikan, di bawah indeks yang telah ditetapkan oleh pendaftarannya, sebelum ia boleh didepositkan, maka tiada indeks yang perlu diramalkan. rotation_nonce ialah nilai yang mesti dibawa oleh M_rotate_pq/M_rotate_pause/M_cancel yang seterusnya; rules_v2 ialah null pada rantaian tanpa kumpulan tersebut (rantaian 14), dan min_inbound_sequence ialah null pada rantaian tanpa lantai ulang main (rantaian 15 dan sebelumnya); pada rantaian 20 nilainya { "2": 3, "3": 3, "4": 3, "5": 7 }. rotation_rules, pending_rotations dan fees ialah null pada rantaian tanpa kumpulan tersebut (rantaian 14 hingga 19). Contoh di atas menunjukkan bentuk, bukan nilai rantaian 20: rantaian 20 bermula pada guardian_set_index 1 dan burn_sequence 13, dan menyajikan "rotation_rules": { "delay_secs": 86400, "needs_possession": true }, "pending_rotations": [] dan "fees": { "mint_bps": 10, "burn_bps": 10, "recipient": "rand1…" }. Rantaian tanpa seksyen bridge menjawab {"enabled": false}.
Tiada baki: nilai yang dirantai-silang ialah nota, dan dompet membaca apa yang dipegangnya dengan rand asset-balance [INDEX] daripada nota miliknya sendiri. Akar jambatan mengikat pemancar, set penjaga, digest yang telah dibelanjakan, jujukan pembakaran, set penjaga pasca-kuantum, serta kunci jeda, bendera jeda dan nonce tadbir urus (dua, dan rotation_nonce di bawah peraturan v2), lantai ulang main jika genesis menetapkannya, dan pada rantaian 20 peraturan putaran berserta sebarang putaran yang belum selesai dan kumpulan yuran; ia hanya dilipat ke dalam akar keadaan pada rantaian yang mempunyai jambatan. Daftar token, dengan locked setiap sandaran, diikat secara berasingan sebagai tokens_root. GET /bridge dan GET /bridge/assets pada peneroka menyajikan keadaan yang sama, yang kedua dengan jumlah deposit dan pembakaran bagi setiap sandaran sebagai rentetan 8 tempat perpuluhan; GET /tokens dan GET /tokens/:id menyajikan daftar tersebut.
Apa yang awam dan apa yang tersembunyi
| apa | siapa yang melihatnya |
|---|---|
| jumlah deposit, indeks aset dan alamat penerima | semua orang, dalam satu transaksi itu |
| nota mana yang kemudian dibelanjakan oleh penerima | tiada sesiapa |
| jumlah pembakaran, aset, syiling, destinasi dan yuran geganti | semua orang — penjaga memerlukannya |
| jumlah, aset dan pemilik nota yuran jambatan, perbendaharaan (rantaian 20) | semua orang: ia dibina semula daripada medan awam |
| nota mana yang membiayai pembakaran | tiada sesiapa |
| baki yang dirantai-silang | hanya pemegang, atau pemegang kunci pemantauan |
set penjaga, pemancar, daftar dengan locked setiap sandaran, log pembakaran | semua orang |
Jurang yang diketahui
Daripada senarai fullnode sendiri: tiada geganti dibayar pada Rand; sampul deposit tidak terikat kepada apa-apa, maka geganti yang bermusuhan boleh menyegel sampah, itulah sebabnya dompet membina semula nota deposit daripada medan awam; vektor ujian bersama peringkat lejar belum dibina semula pada kolam nota; bridge-burn masih mengetahui dasar titik akhir destinasi sendiri hanya selepas membayar untuk bukti; cap masa blok yang sama dengan induk dibenarkan pada rantaian yang dirantai-silang, maka pemimpin yang bersekongkol boleh mengekalkan set penjaga yang telah digantikan dalam tempoh bertolak ansurnya; log pembakaran dalam memori tidak terhad; tiada klien ringan atau pengesahan atas rantaian bagi keadaan rantaian sumber, dan tiada yang dirancang.