sbpf2rv ایک کمپائل شدہ Solana پروگرام (ایک sBPF ELF، یعنی وہ .so جو cargo build-sbf تیار کرتا ہے) لیتا ہے اور اسے Rand پروگرام میں تبدیل کر دیتا ہے۔ یہ C لکھتا ہے، اور rand-guest build اس C کو ایک RV32IM امیج میں کمپائل کرتا ہے۔ یہ امیج اسی ELF اور اسی ہدایت کے لیے وہی آٹھ آؤٹ پٹ الفاظ شائع کرتا ہے جو Rand کا sBPF انٹرپریٹر گیسٹ، sbpf.bin، شائع کرتا ہے۔ یہ صفحہ حقیقی SPL Token پروگرام پر پورا راستہ دکھاتا ہے۔
یہ کیا ہے
| ان پٹ | ایک sBPF v1 ELF |
| آؤٹ پٹ | ایک C شِم کریٹ؛ rand-guest build اسے امیج کنٹینر بناتا ہے |
| یہ کہاں چلتا ہے | آف چین، ڈویلپر کی مشین پر؛ چین صرف امیج دیکھتی ہے |
| اسے کس سے مطابقت رکھنی ہے | sbpf.bin کے آٹھ آؤٹ پٹ الفاظ سے، انہی دو ان پٹ ٹیپوں پر |
| ریپوزیٹری | سرکٹس ریپوزیٹری میں sbpf2rv/ |
| مقررہ ٹول چین | Rust 1.98.1، clang 23.1.1، cc کریٹ 1.4.6 |
ترجمہ شدہ پروگرام انٹرپریٹر کا ABI برقرار رکھتا ہے۔ یہ وہی ٹیپیں پڑھتا ہے: عوامی ٹیپ پر ELF اور نجی ٹیپ پر سیریلائز کی گئی ہدایت (پہلے اکاؤنٹس، پھر ہدایت کا ڈیٹا)۔ یہ پروگرام کے گرد وہی sbpf-core ہارنس چلاتا ہے: ان پٹ کو ڈی کوڈ کرتا ہے، ELF لوڈ کرتا ہے، اکاؤنٹ ریجن کی جانچ کرتا ہے اور ان پٹ اور آؤٹ پٹ کو ہیش کرتا ہے۔ صرف sBPF کا اپنا عمل درآمد نیٹو کوڈ سے بدلا جاتا ہے۔ اسی لیے اس کے آؤٹ پٹ لفظ بہ لفظ انٹرپریٹر کے آؤٹ پٹ کے برابر ہوتے ہیں۔
اعتماد کا ماڈل
ترجمہ شدہ پروگرام کے ثبوت کو تین چیزیں پابند کرتی ہیں۔
hcترجمہ شدہ کوڈ کو پابند کرتا ہے۔ C امیج میں کمپائل ہوتا ہے، اس لیے امیج کاhcاس کا احاطہ کرتا ہے۔- ELF گارڈ
hcکو ایک پروگرام سے پابند کرتا ہے۔ شِم پروگرام کو ٹیپ پر موجود ELF سے لوڈ کرتا ہے، اس لیے کسی جانچ کے بغیر ایک ہی امیج اسیhcکے تحت کال کرنے والے کا منتخب کردہ کوئی دوسرا ELF چلا سکتا تھا۔ اس لیے تیار کردہprogram.cکے آخر میں اس لوڈ شدہ پروگرام کا ڈائجسٹ ہوتا ہے جس سے اس کا ترجمہ کیا گیا: ٹیکسٹ، صرف پڑھنے والا ڈیٹا، ان کے پتے اور انٹری پوائنٹ۔ کچھ بھی چلانے سے پہلے شِم ٹیپ کے لوڈ شدہ پروگرام کو اسی طریقے (Poseidon2) سے ہیش کرتا ہے اور موازنہ کرتا ہے۔ کوئی بھی دوسرا پروگرام پری اسٹیٹ پرBadElf، اسٹیٹس 2، کے ساتھ رک جاتا ہے۔ لہٰذا جو ثبوت اسhcکے مقابل تصدیق پاتا ہے وہ اسی پروگرام کا رن ہے۔ H_PUBELF کے بائٹس کو پابند کرتا ہے۔ ELF عوامی ٹیپ پر سفر کرتا ہے، اور ثبوت کا عوامی ان پٹ ڈائجسٹ لفظ بہ لفظ اس کا احاطہ کرتا ہے۔
آیا hc کسی دیے گئے ELF کا درست ترجمہ ہے، اس کی جانچ دوبارہ بلڈ کر کے کی جاتی ہے۔ ELF پر مقررہ sbpf2rv چلائیں، مقررہ ٹول چین سے بلڈ کریں، اور hc کا موازنہ کریں۔ اسی وجہ سے بلڈ قابلِ اعادہ ہے۔
چین ماخذ ELF یا اس کا ہیش ریکارڈ نہیں کرتی۔ یہ امیج اور اس کی پروگرام آئی ڈی محفوظ کرتی ہے۔ جو ڈیپلائے کرنے والا چاہتا ہے کہ ELF معلوم ہو، وہ اسے پروگرام کے ساتھ شائع کرتا ہے۔
گارڈ فائل کو نہیں بلکہ لوڈ شدہ پروگرام کو پابند کرتا ہے۔ دو ELF جو صرف وہاں مختلف ہوں جہاں لوڈر نہیں دیکھتا (ہیڈر پیڈنگ، سمبل ٹیبلز) ایک ہی پروگرام کی صورت میں لوڈ ہوتے ہیں اور دونوں طرف یکساں چلتے ہیں۔ جس ELF میں .rodata کا ایک بائٹ بدلا ہوا ہو، چاہے وہ ایسا بائٹ ہو جسے ٹرانسفر کبھی نہیں پڑھتا، اسے ترجمہ مسترد کر دیتا ہے اور انٹرپریٹر چلا دیتا ہے۔
کیا ٹریپ ہوتا ہے اور کیا مسترد ہوتا ہے
ترجمے کے وقت کچھ بھی مسترد نہیں ہوتا۔ خراب ساخت والا ELF لوڈر کے اپنے پیغام کے ساتھ مسترد ہوتا ہے، لیکن درست ساخت والے ELF کی کوئی ہدایت مسترد نہیں ہوتی۔ اسکینر ان چیزوں کو انتباہات کے طور پر رپورٹ کرتا ہے جن تک پروگرام پہنچ سکتا ہے، اور ترجمہ شدہ پروگرام رن ٹائم پر ٹھیک وہیں ٹریپ ہوتا ہے جہاں انٹرپریٹر ہوتا:
| انتباہ | یہ کیا ہے | رن ٹائم پر |
|---|---|---|
UnknownSyscall | ایسا سسٹم کال ہیش جسے رن ٹائم نافذ نہیں کرتا | ٹریپ UnknownSyscall |
Cpi | کراس پروگرام انووکیشن (sol_invoke_signed*) | وہی UnknownSyscall ٹریپ؛ CPI نافذ نہیں ہے |
RegisterOutOfRange | رجسٹر r11..r15، یا r10 سے اوپر کا callx رجسٹر | ٹریپ BadInsn |
UnknownOpcode | ایسا اوپ کوڈ جس کی کوئی v1 کلاس نہ ہو، بشمول صرف v2 والا sdiv/srem خاندان اور hor64 | ٹریپ BadInsn |
JumpOutOfText | فنکشن کے ٹیکسٹ سے باہر کوئی جمپ، کال یا فال تھرو | ٹریپ BadJump |
BadCallImmSrc | ایسا call imm جس کا src 2..=10 میں ہو (صرف ہاتھ سے بنائے گئے ELF میں) | ٹریپ BadInsn |
جو مترجم ایسے کوڈ کو مسترد کرے جس تک رسائی نہ ہو، وہ ان پروگراموں کو مسترد کر دے گا جنہیں انٹرپریٹر آج چلاتا ہے۔ SPL Token ایسا ہی پروگرام ہے: یہ sol_set_return_data اور sol_get_sysvar کو کال کرتا ہے، جن تک Transfer کا راستہ کبھی نہیں پہنچتا۔
تین انحرافات قبول کیے گئے ہیں۔ ان میں سے ہر ایک صرف ترجمے کو وہاں روکتا ہے جہاں انٹرپریٹر شاید نہ رکے؛ ترجمہ کبھی ایسا رن مکمل نہیں کرتا جسے انٹرپریٹر روک دیتا ہے۔
- اسکین شدہ سیٹ سے باہر
callxپرBadJumpٹریپ ہوتا ہے، جبکہ انٹرپریٹر اس پتے پر حقیقی کوڈ چلا سکتا ہے۔ - بجٹ کی جانچ ایک بیسک بلاک تک مؤخر ہو سکتی ہے۔ SPL Token کو 65,535 الفاظ کی حد میں سمونے کے لیے اس کے 3,546 بلاکس میں سے 1,505 اپنی ہدایات کی حد کی جانچ چھوڑ دیتے ہیں۔ رکنے کی نوعیت اس ایک بلاک کے اندر مختلف ہو سکتی ہے جو حد عبور کرتا ہے۔ اسٹیٹس اور آٹھ الفاظ وہی رہتے ہیں۔
- صرف ماخذ پروگرام چلتا ہے۔ کوئی دوسرا ELF مسترد ہو جاتا ہے (گارڈ، اوپر)۔
Ed25519 اور secp256k1۔ sol_ed25519_verify اور sol_secp256k1_recover کے سافٹ ویئر نفاذ sbpf-rt/ میں موجود ہیں لیکن لنک نہیں کیے گئے۔ انٹرپریٹر دونوں پر ٹریپ ہوتا ہے، اس لیے مطابقت کی خاطر ترجمہ بھی ٹریپ ہوتا ہے۔ ہر کال پر بالترتیب تقریباً 14.3M اور 15.7M سائیکلز لگتے ہیں، جو سب سے بڑے ٹیئر (2²⁰) سے کہیں زیادہ ہیں۔ انہیں کو پروسیسر ٹیبلز درکار ہیں۔
اعداد و شمار
SPL Token (guests-compiled/sbpf/programs/spl_token.so، انٹرپریٹر کا اپنا ٹیسٹ فکسچر) پر، ELF گارڈ کی موجودگی میں، ناپے گئے۔
| امیج | پروگرام الفاظ | حد | hc |
|---|---|---|---|
| SPL Token، ترجمہ شدہ | 65,096 | 65,535 (439 فاضل) | 8ca905ae…758b |
sbpf.bin، انٹرپریٹر | 8,317 | 65,535 | 059a7086…f476 |
| ویکٹر | اسٹیٹس | sBPF ہدایات | ترجمہ شدہ سائیکلز | sbpf.bin سائیکلز | ٹیئر (دونوں) |
|---|---|---|---|---|---|
Transfer 250 | 1 | 143 | 765,851 | 694,498 | 20 |
Transfer بیلنس سے زیادہ | 0 | 133 | 748,836 | 679,814 | 20 |
MintTo 250 | 1 | 120 | 708,648 | 634,423 | 20 |
MintTo غلط اتھارٹی کی جانب سے | 0 | 134 | 696,694 | 627,241 | 20 |
Burn 250 | 1 | 131 | 710,245 | 637,038 | 20 |
Burn بیلنس سے زیادہ | 0 | 121 | 695,434 | 624,781 | 20 |
Transfer دو اکاؤنٹس کے ساتھ | 0 | 69 | 645,015 | 569,656 | 20 |
| بہت زیادہ اکاؤنٹس (ہارنس مسترد کرتا ہے) | 2 | 0 | 303,933 | 304,616 | 20 |
Transfer پر سائیکلز کہاں صرف ہوتے ہیں:
| مرحلہ | ترجمہ شدہ | sbpf.bin |
|---|---|---|
| دونوں ٹیپیں پڑھنا | 302,881 | 302,880 |
| ELF لوڈ کرنا | 177,012 | 173,859 |
| اکاؤنٹ ریجن کی جانچ | 103,829 | 103,824 |
| sBPF اسٹیک اور ہیپ کو صفر کرنا | 49,181 | 49,181 |
| آؤٹ پٹ اور ان پٹ ہیش، عوامی الفاظ، جوڑنے والا کوڈ | 51,091 | 42,723 |
| ELF گارڈ | 72,949 | — |
| خود sBPF پروگرام | 8,908 | 22,031 |
| کل | 765,851 | 694,498 |
ترجمہ شدہ پروگرام کا اپنا عمل درآمد فی sBPF ہدایت تقریباً 2.4 سے 2.5 گنا سستا ہے (تقریباً 62 سائیکلز بمقابلہ 154)۔ لیکن ہر رن کا تقریباً 98% مقررہ ہارنس ہے، اور گارڈ 73k سائیکلز کا اضافہ کرتا ہے۔ چنانچہ SPL Token کے لیے ترجمہ شدہ امیج 69k سے 75k سائیکلز مہنگا ہے، اور دونوں ٹیئر 20 پر رہتے ہیں۔
ترجمہ صرف حساب کے لحاظ سے بھاری پروگراموں کے لیے فائدہ مند ہے۔ فی ہدایت تقریباً 90 سائیکلز کی بچت پر، 10,000 sBPF ہدایات چلانے والی کال تقریباً 0.9M سائیکلز بچاتی ہے۔ SPL Token 120 سے 143 ہدایات چلاتا ہے۔
عملی رہنمائی: SPL Token، ترجمہ شدہ اور مطابقت شدہ
ہر کمانڈ 7ef3220 پر سرکٹس چیک آؤٹ کی جڑ سے چلتی ہے، Rust پروگرام ڈیپلائے کریں والی ٹول چین اور RISC-V پروگرام ڈیپلائے کریں والے clang 23.1.1 کے ساتھ۔ طویل آؤٹ پٹ وہاں کاٹا گیا ہے جہاں … کا نشان ہے۔
0. ٹولز بلڈ کریں
(cd sbpf2rv && cargo +1.98.1 build --release)
(cd rand-guest && cargo +1.98.1 build --release)
1. ترجمہ کریں
--out کا سرکٹس چیک آؤٹ کے اندر کوئی ڈائریکٹری ہونا لازم ہے۔
$ sbpf2rv/target/release/sbpf2rv guests-compiled/sbpf/programs/spl_token.so --out sbpf2rv/target/spl-token --name spl-token
entry pc 225: 30 function(s), 3546 block(s), 12061 instruction(s), 30 callx target(s), 0 refusal(s), 4 warning(s)
fn 225: 2065 block(s)
… (30 functions in all)
warning: UnknownSyscall { pc: 7803, hash: 2720453611 }
warning: UnknownSyscall { pc: 9530, hash: 2720453611 }
warning: UnknownSyscall { pc: 8698, hash: 2720453611 }
warning: UnknownSyscall { pc: 11547, hash: 331461893 }
wrote sbpf2rv/target/spl-token/program.c (521757 bytes of C) and the spl-token shim crate: rand-guest build sbpf2rv/target/spl-token
0 refusal(s)۔ چاروں انتباہات حقیقی سسٹم کالز ہیں جن تک Transfer کبھی نہیں پہنچتا: ہیش 2720453611 sol_set_return_data ہے (تین کال مقامات) اور 331461893 sol_get_sysvar ہے۔
2. امیج بلڈ کریں
امیج پہلے سے طے شدہ 4,096 الفاظ کی حد سے بڑا ہے، اس لیے --max-words 65535 دیں۔
$ rand-guest/target/release/rand-guest build sbpf2rv/target/spl-token --max-words 65535
…
65096 words against a cap of 65535 (fits); 2 ecall(s) with a non-static a7
OK
wrote sbpf2rv/target/spl-token/image.bin and its .sha256 (65096 words, hc 8ca905ae3c62f503de7de86829040f323e098b53dba5fffe09b42f1aad16758b, program id 65d234ce9ca4d082f487c038abfa76e67f41a0d91e10b9ac388f1e1541d59184)
$ rand-guest/target/release/rand-guest info sbpf2rv/target/spl-token/image.bin
form: image container
text 64819 words at 0x10000; data 102 words (101 non-zero) at 0x4f4cc; prologue 277 words; program 65096 words from base_pc 0xfbac
hc 8ca905ae3c62f503de7de86829040f323e098b53dba5fffe09b42f1aad16758b
program id 65d234ce9ca4d082f487c038abfa76e67f41a0d91e10b9ac388f1e1541d59184
65096 words against a cap of 4096: does not fit
جو کوئی بھی یہ دو مراحل اسی ٹول چین کے ساتھ چلائے، اسے یہی hc ملتا ہے۔
3. دونوں چلائیں، اور موازنہ کریں
250 کا Transfer الفاظ کی دو فہرستیں لیتا ہے، جو tests/parity.rs انٹرپریٹر کی اپنی کال انکوڈنگ سے بناتا ہے: 27,151 عوامی الفاظ (ELF، الفاظ کی صورت میں انکوڈ شدہ) اور 10,458 نجی الفاظ (پہلے اکاؤنٹس، پھر Transfer کا امتیازی نشان اور رقم)۔ rand-guest run انہیں --public اور --input کے طور پر لیتا ہے۔ ہر فہرست کے ابتدائی الفاظ تک مختصر کیا گیا:
$ rand-guest run sbpf2rv/target/spl-token/image.bin \
--public 108600 1179403647 65794 0 0 17235971 1 2088 … (27 151 words)
--input 41825 4 0 65791 0 50529027 50529027 50529027 … (10 458 words)
out[0] = 1
out[1] = 2892832079
out[2] = 376091303
out[3] = 1311040261
out[4] = 2015764099
out[5] = 3682593600
out[6] = 3311553006
out[7] = 141115266
cycles 765851
tier 20
یہی دو فہرستیں انٹرپریٹر گیسٹ کے مقابل:
$ rand-guest run guests-compiled/bin/sbpf.bin \
--public 108600 1179403647 65794 0 0 17235971 1 2088 … (27 151 words)
--input 41825 4 0 65791 0 50529027 50529027 50529027 … (10 458 words)
out[0] = 1
out[1] = 2892832079
out[2] = 376091303
out[3] = 1311040261
out[4] = 2015764099
out[5] = 3682593600
out[6] = 3311553006
out[7] = 141115266
cycles 694498
tier 20
آٹھوں الفاظ یکساں ہیں۔ out[0] = 1 اسٹیٹس ہے (کامیابی)۔ out[1..8] وہ ڈائجسٹ ہے جسے انٹرپریٹر کا ABI ان پٹ اور آؤٹ پٹ پر متعین کرتا ہے۔
4. آٹھوں ویکٹرز ایک کمانڈ میں جانچیں
مطابقت کا ٹیسٹ ترجمہ شدہ امیج بلڈ کرتا ہے، ہر ویکٹر کو دونوں امیجز پر rand-guest run کے ذریعے چلاتا ہے، اور آٹھ الفاظ میں کسی بھی فرق پر ناکام ہو جاتا ہے:
$ cd sbpf2rv && cargo +1.98.1 test --test parity the_spl_token -- --nocapture
…
translated SPL Token: 65096 program words (cap 65 535), hc 8ca905ae3c62f503de7de86829040f323e098b53dba5fffe09b42f1aad16758b
transfer 250: Ok(0), status 1; cycles translated 765851, interpreter guest 694498
transfer too much: Ok(1), status 0; cycles translated 748836, interpreter guest 679814
MintTo 250: Ok(0), status 1; cycles translated 708648, interpreter guest 634423
MintTo 250 signed by someone else: Ok(4), status 0; cycles translated 696694, interpreter guest 627241
Burn 250: Ok(0), status 1; cycles translated 710245, interpreter guest 637038
Burn 1 000 001 (balance 1 000 000): Ok(1), status 0; cycles translated 695434, interpreter guest 624781
transfer with two accounts: Ok(47244640256), status 0; cycles translated 645015, interpreter guest 569656
an account count above MAX_ACCOUNTS: Err(BadElf), status 2; cycles translated 303933, interpreter guest 304616
…
test the_spl_token_transfer_translates_and_matches_the_interpreter_word_for_word ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 27.84s
5. ڈیپلائے کریں
rand program deploy sbpf2rv/target/spl-token/image.bin --public spl_token.so
امیج ELF کو عوامی ٹیپ سے پڑھتی ہے، اس لیے ELF پروگرام کا عوامی ان پٹ ہے جو ڈیپلائے کے وقت طے ہو جاتا ہے۔ --public براہِ راست .so فائل لیتا ہے؛ والیٹ اسے ورڈز میں انکوڈ کر کے انہی 27,151 ورڈز میں بدلتا ہے جو مرحلہ 4 میں تھے۔
اس کے لیے ایسی چین درکار ہے جس کا جینیسس max_program_words کو کم از کم 65,096 اور max_program_public_words کو کم از کم 27,151 مقرر کرے۔ چین 12 نے ایک ڈیپلائے کی حد 4,096 ورڈز رکھی تھی اور کوئی عوامی ان پٹ قبول نہیں کرتی تھی، اس لیے والیٹ نے وہاں کچھ بھی ثابت کرنے سے پہلے ہی اس امیج کو مسترد کر دیا۔ چین 13، یعنی v0.4 چین، نے 65,535 اور 32,768 مقرر کیے، اور اس کے بعد کی ہر چین دونوں قدریں برقرار رکھتی ہے۔ چین 20، جو لائیو چین ہے (جینیسس 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135)، چین 13 کی بلاک اور کال اینویلپ کی حدیں بھی برقرار رکھتی ہے اور پروف کی حد آدھی کر کے 4 MiB کر دیتی ہے (4,194,304 بائٹس، چین 17 سے؛ چین 13 سے 16 تک یہ 8 MiB تھی)۔ سائز کی حدیں اب واحد رکاوٹ نہیں رہیں۔ چین 20 کا جینیسس hardening_v6 مقرر کرتا ہے، اور اس کے تحت ایسا ڈیپلائے غیر درست ہے جس میں پروگرام ورڈز اس تعداد سے زیادہ ہوں جو ٹیئر 14 کی کال حد پر ایک کال میں سما سکتے ہیں (ProgramUncallable): عوامی ان پٹ کے بغیر زیادہ سے زیادہ 8,180 ورڈز، اور عوامی ان پٹ کے ساتھ اس سے کم۔ یہ امیج 27,151 ورڈز کے عوامی ان پٹ کے ساتھ 65,096 ورڈز کی ہے، اس لیے چین 20 یہ ڈیپلائے مسترد کرتی ہے، اور کال کو بھی مسترد کرے گی: ہر SPL ویکٹر ٹیئر 20 پر چلتا ہے، جو ٹیئر 14 کی کال حد سے اوپر ہے (حدود)۔ چین 20 پر بلاک ایگریگیشن بند ہے (اس کے جینیسس میں کوئی aggregation سیکشن نہیں)؛ اس کے بوٹسٹریپ نوڈز ویلیڈیٹر چلانا میں درج ہیں۔ ڈیپلائے فیس عوامی ورڈز کو کوڈ ورڈز کے ساتھ شمار کرتی ہے: 0.001 + 0.0001 × (65,096 + 27,151) = 9.2257 RAND، یعنی وہی فیس جو نیچے دیے گئے چین 13 کے ڈیپلائے نے ادا کی۔
یہ ڈیپلائے 2026-09-19 کو چین 13 پر چلایا گیا، جب چین 13 لائیو چین تھی (پروڈکشن FRI پروفائل، جینیسس 8123ccac1883a45750e4df6964fb7cd3f0b321798cde4c0ef406a0293939ece3)، اور یہ جینیسس والیٹ shielded-1 سے کیا گیا۔ اس کے بعد کی ہر چین (14 سے 19) چین 13 کے پروگراموں کے بغیر ایک نئی چین کے طور پر شروع کی گئی، اور امیج ان میں سے کسی پر دوبارہ ڈیپلائے نہیں کی گئی، اس لیے نیچے دی گئی ٹرانزیکشن اور بلندی چین 13 کی ہیں اور اب ایکسپلورر پر نہیں ملتیں۔ پروگرام آئی ڈی صرف base_pc، ورڈز اور عوامی ورڈز کا ہیش ہے، اس لیے ایک ہی امیج اور ELF کو ہر اس چین پر ایک ہی آئی ڈی ملتی ہے جو یہ ڈیپلائے قبول کرے۔ والیٹ کا آؤٹ پٹ، پیش رفت کی سطریں حذف کر کے (…):
$ rand program deploy <image.bin> --public spl_token.so
program id: 740236918310f8e52bb0c1ef49b2b0e0c018762e289666660685b0694c8dd00a (65096 words, hc ae05a98c03f5623c68e87dde320f0429538b093efeffa5db1a2fb4098b7516ad, public input 27151 words, digest ec57b10ed6f3a3d5fe87ec072f691322ad747377ba2f0a1788bcfe3e7334d67e)
…
proved in 94.3s: tier 14, 1418406 bytes
submitted deploy 626fc9387ecc1f6b39f44184807303ac2843029d8fb8e28338bf186445927530
…
| پروگرام آئی ڈی | 740236918310f8e52bb0c1ef49b2b0e0c018762e289666660685b0694c8dd00a |
| امیج | 65,096 ورڈز؛ rand-guest کے املا میں hc 8ca905ae…، والیٹ کے املا میں ae05a98c… |
| عوامی ان پٹ | 27,151 ورڈز (ELF)، ڈائجسٹ ec57b10ed6f3a3d5fe87ec072f691322ad747377ba2f0a1788bcfe3e7334d67e |
| فیس بنڈل (چین 13 کا 2 اِن 2 آؤٹ بنڈل) | ٹیئر 14، 1,418,406 بائٹس، 94.3 s میں ثابت کیا گیا |
| ڈیپلائے ٹرانزیکشن (چین 13) | 626fc9387ecc1f6b39f44184807303ac2843029d8fb8e28338bf186445927530 |
| بلندی جس پر اینکر ہوئی (چین 13) | 400 |
| فیس | 9.2257 RAND |
چین 14 سے فیس ادا کرنے والا بنڈل وہی واحد 4 اِن 4 آؤٹ پوشیدہ اثاثہ بنڈل ہے جو ہر ٹرانزیکشن کے ساتھ ہوتا ہے، اور یہ ٹرانزیکشن کی بائنڈنگ کے مقابل ثابت کیا جاتا ہے۔ یہ اب بھی ٹیئر 14 ہے: چین 14 اور 15 پر پروڈکشن پروفائل میں تقریباً 100 s اور تقریباً 1.42 MB۔ چین 17 سے ایک بنڈل ٹیئر 10 کا اجازت پروف بھی ساتھ رکھتا ہے (منقسم اجازت)، اس لیے چین 18 اور 19 پر ایک ٹرانزیکشن کا فیس بنڈل تقریباً 1.49 MB بنڈل پروف اور تقریباً 1.37 MB اجازت پروف پر مشتمل ہوتا ہے۔
پروگرام آئی ڈی ELF کو پابند کرتی ہے، اس لیے یہ اس آئی ڈی سے مختلف ہے جو rand-guest info صرف امیج کے لیے پرنٹ کرتا ہے۔ وہی آئی ڈی کال کریں جو deploy نے پرنٹ کی۔
حدود
- اس پروگرام کی کسی کال کا پروف نہیں بنایا گیا، یہ چین 20 پر ڈیپلائے نہیں ہے، اور چین 20 ڈیپلائے اور کال دونوں کو مسترد کرتی ہے۔ اوپر والا ڈیپلائے چین 13 پر تھا۔ چین 20 کے
hardening_v6کے تحت ایسا ڈیپلائے غیر درست ہے جس میں ورڈز اس تعداد سے زیادہ ہوں جو ٹیئر 14 کی ایک کال میں سما سکتے ہیں (ProgramUncallable؛ زیادہ سے زیادہ 8,180 ورڈز)، اور یہ امیج 65,096 ورڈز کی ہے۔ ان پٹ کی جانب گنجائش موجود ہے: ELF ڈیپلائے کا عوامی ان پٹ ہے، جسےrand callخود حاصل کرتا ہے، اور 10,458 نجی ورڈز 16,071 کی ان پٹ حد میں سما جاتے ہیں، جو چین 20 برقرار رکھتی ہے۔ لیکن ہر SPL ویکٹر ٹیئر 20 کا ہے، اور fullnode v0.5.6 (2026-09-25) سے کوئی بھی نوڈ ٹیئر 14 سے اوپر کا ہر کال پروف مسترد کر دیتا ہے (CallTierTooHigh)، اور یہ ویریفائر کلید بنانے سے پہلے ہی ہو جاتا ہے۔ یہی جانچ ان ہیش جدولوں کی بھی حد مقرر کرتی ہے جن کا ایک کال اعلان کر سکتی ہے: 2¹³ SHA-256 قطاریں (128 کمپریشنز) اور 2¹² Keccak قطاریں (128 پرمیوٹیشنز)۔ ٹیئر 20 کی کال کا پروف صرف آف چین بنایا جا سکتا ہے، اور ٹیئر 20 کا کوئی پروف ابھی تک موجود نہیں (اگلا نکتہ)۔ - ٹیئر 20 پر ابھی تک کوئی پروف نہیں بنایا گیا۔ ٹیئر 20 کا ایک پروف 48 GB والے لیپ ٹاپ پر تقریباً 31 GB پر روک دیا گیا، اور 64 GB والے ڈراپلیٹ پر 10 m 41 s کے بعد 65.1 GB پر میموری ختم ہونے کے باعث بند کر دیا گیا۔ ٹیئر 16/18 کی ماپی گئی اسکیلنگ (ہر +2 ٹیئرز پر میموری تقریباً ×3.9، وقت تقریباً ×4.1) سے اندازہ لگایا جائے تو ٹیئر 20 کو تقریباً 330 GB اور تقریباً 3.6 h درکار ہیں، جو DigitalOcean کے سب سے بڑی میموری والے ڈراپلیٹ (m-32vcpu-256gb، 256 GB) سے زیادہ ہے۔ پروور ایک ہی تھریڈ پر چلا: 16 vCPU والی مشین پر ایک کور 99% پر رہا۔ دیکھیں پروونگ میموری۔
- کوئی CPI نہیں۔ کراس پروگرام انووکیشنز ٹریپ ہو جاتی ہیں۔
- صرف sBPF v1۔ صرف v2 والے اوپ کوڈز ٹریپ ہو جاتے ہیں۔
- Ed25519 اور secp256k1 سسٹم کالز ٹریپ ہو جاتی ہیں جب تک ان کے لیے کوپروسیسر جدولیں نہیں بن جاتیں۔
- چین ELF کو صرف عوامی ان پٹ کے طور پر ریکارڈ کرتی ہے۔
--publicکے ساتھ کیا گیا ڈیپلائے ELF کے ورڈز اور ان کا ڈائجسٹ محفوظ کرتا ہے، اورrand_getProgramPublicانہیں فراہم کرتا ہے۔ چین یہ ریکارڈ نہیں کرتی کہ امیج اس سے کیسے بنائی گئی: بلڈ ان پٹس شائع کریں تاکہ دوسرےhcکو دوبارہ بنا سکیں۔