Rand Protocol
مستندات
برنامه‌های RISC-V

مترجم Solana

sbpf2rv یک برنامه Solana با قالب sBPF را به ISA مبتنی بر RISC-V در Rand ترجمه می‌کند - این مترجم چیست، مدل اعتماد و نگهبان ELF آن، چه مواردی موجب trap می‌شوند و چه مواردی رد می‌شوند، اعداد اندازه‌گیری‌شده، و یک راهنمای گام‌به‌گام کامل که برنامه واقعی SPL Token را ترجمه می‌کند و کلمه به کلمه با مفسر sBPF هم‌خوان است.

sbpf2rv یک برنامهٔ Solana کامپایل‌شده (یک ELF از نوع sBPF، یعنی فایل .so که cargo build-sbf تولید می‌کند) را می‌گیرد و به یک برنامهٔ Rand تبدیل می‌کند. خروجی آن کد C است و rand-guest build این کد C را به یک ایمیج RV32IM کامپایل می‌کند. این ایمیج برای همان ELF و همان دستورالعمل، همان هشت کلمهٔ خروجی را منتشر می‌کند که guest مفسر sBPF در Rand، یعنی sbpf.bin، منتشر می‌کند. این صفحه کل مسیر را روی برنامهٔ واقعی SPL Token نشان می‌دهد.

این ابزار چیست

ورودییک ELF از نوع sBPF v1
خروجییک crate شیم C؛ rand-guest build آن را به یک کانتینر ایمیج تبدیل می‌کند
محل اجراخارج از زنجیره، روی دستگاه توسعه‌دهنده؛ زنجیره فقط ایمیج را می‌بیند
آنچه باید با آن مطابقت داشته باشدهشت کلمهٔ خروجی sbpf.bin، روی همان دو نوار ورودی
مخزنsbpf2rv/ در مخزن circuits
toolchain پین‌شدهRust 1.98.1، clang 23.1.1، crate با نام cc نسخهٔ 1.4.6

برنامهٔ ترجمه‌شده ABI مفسر را حفظ می‌کند. همان نوارها را می‌خواند: ELF روی نوار عمومی و دستورالعمل سریال‌شده (ابتدا حساب‌ها، سپس داده‌های دستورالعمل) روی نوار خصوصی. همان harness با نام sbpf-core را دور برنامه اجرا می‌کند: ورودی را رمزگشایی می‌کند، ELF را بارگذاری می‌کند، ناحیهٔ حساب‌ها را بررسی می‌کند و ورودی و خروجی را هش می‌کند. فقط خود اجرای sBPF با کد بومی جایگزین شده است. به همین دلیل خروجی‌های آن کلمه به کلمه با خروجی‌های مفسر برابر است.

مدل اعتماد

سه چیز اثبات یک برنامهٔ ترجمه‌شده را مقید می‌کنند.

  1. hc کد ترجمه‌شده را مقید می‌کند. کد C داخل ایمیج کامپایل می‌شود، بنابراین hc ایمیج آن را پوشش می‌دهد.
  2. نگهبان ELF، hc را به یک برنامه مقید می‌کند. شیم برنامه را از ELF روی نوار بارگذاری می‌کند؛ پس بدون یک بررسی، یک ایمیج می‌تواند ELF دیگری را که فراخواننده انتخاب کرده، زیر همان hc اجرا کند. از این رو program.c تولیدشده با یک چکیده از برنامهٔ بارگذاری‌شده‌ای که از آن ترجمه شده پایان می‌یابد: متن (text)، دادهٔ فقط‌خواندنی، نشانی‌های آن‌ها و نقطهٔ ورود. پیش از اجرای هر چیز، شیم برنامهٔ بارگذاری‌شدهٔ روی نوار را به همان شیوه (Poseidon2) هش می‌کند و مقایسه می‌کند. هر برنامهٔ دیگری با BadElf و وضعیت 2 روی پیش‌حالت متوقف می‌شود. بنابراین اثباتی که در برابر این hc تأیید شود، اجرای همان برنامه است.
  3. H_PUB بایت‌های ELF را مقید می‌کند. ELF روی نوار عمومی منتقل می‌شود و چکیدهٔ ورودی عمومی اثبات آن را کلمه به کلمه پوشش می‌دهد.

اینکه hc ترجمهٔ وفادار یک ELF مشخص است یا نه، با بازسازی بررسی می‌شود. sbpf2rv پین‌شده را روی ELF اجرا کنید، با toolchain پین‌شده بسازید و hc را مقایسه کنید. ساخت به همین دلیل قابل بازتولید است.

زنجیره ELF مبدأ یا هش آن را ثبت نمی‌کند. فقط ایمیج و شناسهٔ برنامهٔ آن را ذخیره می‌کند. توسعه‌دهنده‌ای که بخواهد ELF شناخته‌شده باشد، آن را کنار برنامه منتشر می‌کند.

نگهبان برنامهٔ بارگذاری‌شده را مقید می‌کند، نه فایل را. دو ELF که فقط در جاهایی تفاوت دارند که بارگذار به آن‌ها نگاه نمی‌کند (padding سرآیند، جدول‌های نماد) به یک برنامه بارگذاری می‌شوند و در هر دو سو یکسان اجرا می‌شوند. ELF‌ای که یک بایت .rodata آن تغییر کرده باشد، حتی بایتی که transfer هرگز نمی‌خواند، از سوی ترجمه رد می‌شود و مفسر آن را اجرا می‌کند.

چه چیزی trap می‌کند و چه چیزی رد می‌شود

در زمان ترجمه هیچ چیز رد نمی‌شود. ELF نادرست با پیام خود بارگذار رد می‌شود، اما هیچ دستورالعملی در یک ELF سالم رد نمی‌شود. اسکنر آنچه را که یک برنامه می‌تواند به آن برسد به‌صورت هشدار گزارش می‌کند، و برنامهٔ ترجمه‌شده در زمان اجرا دقیقاً همان جایی trap می‌کند که مفسر trap می‌کرد:

هشدارچیستدر زمان اجرا
UnknownSyscallهش یک syscall که runtime پیاده نکرده استtrap با UnknownSyscall
Cpiیک فراخوانی میان‌برنامه‌ای (sol_invoke_signed*)همان trap با UnknownSyscall؛ CPI پیاده نشده است
RegisterOutOfRangeثبات r11..r15 یا ثبات callx بالاتر از r10trap با BadInsn
UnknownOpcodeیک opcode بدون کلاس v1، از جمله خانوادهٔ sdiv/srem که فقط در v2 است و hor64trap با BadInsn
JumpOutOfTextیک پرش، فراخوانی یا عبور مستقیم (fall-through) به بیرون از متن تابعtrap با BadJump
BadCallImmSrcیک call imm با src در 2..=10 (فقط در ELFهای دست‌ساز)trap با BadInsn

مترجمی که کد دست‌نیافتنی را رد کند، برنامه‌هایی را رد می‌کرد که مفسر امروز اجرا می‌کند. SPL Token چنین برنامه‌ای است: sol_set_return_data و sol_get_sysvar را فرا می‌خواند که مسیر Transfer هرگز به آن‌ها نمی‌رسد.

سه تفاوت پذیرفته شده‌اند. هر یک فقط باعث می‌شود ترجمه در جایی متوقف شود که ممکن است مفسر متوقف نشود؛ ترجمه هرگز اجرایی را کامل نمی‌کند که مفسر در آن متوقف می‌شود.

  1. یک callx بیرون از مجموعهٔ اسکن‌شده با BadJump trap می‌کند، در حالی که مفسر ممکن است در آن نشانی کد واقعی اجرا کند.
  2. بررسی‌های بودجه ممکن است یک بلوک پایه به تعویق بیفتند. برای جا دادن SPL Token زیر سقف 65,535 کلمه، 1,505 بلوک از 3,546 بلوک آن بررسی حد دستورالعمل خود را نمی‌کنند. نوع توقف می‌تواند در همان یک بلوکی که از حد عبور می‌کند متفاوت باشد. وضعیت و هشت کلمه یکسان‌اند.
  3. فقط برنامهٔ مبدأ اجرا می‌شود. ELF دیگر رد می‌شود (نگهبان، در بالا).

Ed25519 و secp256k1. پیاده‌سازی‌های نرم‌افزاری sol_ed25519_verify و sol_secp256k1_recover در sbpf-rt/ وجود دارند اما لینک نشده‌اند. مفسر روی هر دو trap می‌کند، پس برای برابری ترجمه نیز trap می‌کند. هر فراخوانی به ترتیب حدود 14.3M و 15.7M چرخه هزینه دارد، که بسیار بالاتر از بزرگ‌ترین پله (2²⁰) است. به جدول‌های coprocessor نیاز دارند.

اعداد

اندازه‌گیری‌شده روی SPL Token (guests-compiled/sbpf/programs/spl_token.so، فیکسچر آزمون خود مفسر)، با نگهبان ELF در جای خود.

ایمیجکلمه‌های برنامهسقفhc
SPL Token، ترجمه‌شده65,09665,535 (439 باقی‌مانده)8ca905ae…758b
sbpf.bin، مفسر8,31765,535059a7086…f476
برداروضعیتدستورالعمل‌های sBPFچرخه‌های ترجمه‌شدهچرخه‌های sbpf.binپله (هر دو)
Transfer 2501143765,851694,49820
Transfer بیش از موجودی0133748,836679,81420
MintTo 2501120708,648634,42320
MintTo توسط مرجع نادرست0134696,694627,24120
Burn 2501131710,245637,03820
Burn بیش از موجودی0121695,434624,78120
Transfer با دو حساب069645,015569,65620
تعداد حساب‌ها بیش از حد (harness رد می‌کند)20303,933304,61620

چرخه‌ها کجا صرف می‌شوند در Transfer:

مرحلهترجمه‌شدهsbpf.bin
خواندن هر دو نوار302,881302,880
بارگذاری ELF177,012173,859
بررسی ناحیهٔ حساب‌ها103,829103,824
صفر کردن پشته و heap در sBPF49,18149,181
هش‌های خروجی و ورودی، کلمه‌های عمومی، کد چسب51,09142,723
نگهبان ELF72,949—
خود برنامهٔ sBPF8,90822,031
مجموع765,851694,498

اجرای خود برنامهٔ ترجمه‌شده به ازای هر دستورالعمل sBPF حدود 2.4 تا 2.5 برابر ارزان‌تر است (حدود 62 چرخه در برابر 154). اما حدود 98٪ هر اجرا harness ثابت است و نگهبان 73k چرخه اضافه می‌کند. بنابراین برای SPL Token ایمیج ترجمه‌شده 69k تا 75k چرخه گران‌تر است و هر دو در پلهٔ 20 می‌مانند.

ترجمه فقط برای برنامه‌های سنگین از نظر محاسبه می‌ارزد. با حدود 90 چرخه صرفه‌جویی به ازای هر دستورالعمل، فراخوانی‌ای که 10,000 دستورالعمل sBPF اجرا می‌کند حدود 0.9M چرخه صرفه‌جویی می‌کند. SPL Token بین 120 تا 143 دستورالعمل اجرا می‌کند.

گام‌به‌گام: SPL Token، ترجمه‌شده و مطابقت‌یافته

هر دستور از ریشهٔ یک checkout از circuits در 7ef3220 اجرا می‌شود، با toolchain از Deploy a Rust program و clang 23.1.1 از Deploy a RISC-V program. خروجی طولانی در جایی که با … علامت خورده کوتاه شده است.

0. ساخت ابزارها

(cd sbpf2rv && cargo +1.98.1 build --release)
(cd rand-guest && cargo +1.98.1 build --release)

1. ترجمه

--out باید یک پوشه درون checkout از circuits باشد.

$ 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). چهار هشدار، syscallهای واقعی‌ای هستند که 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

هر کس این دو گام را با همان toolchain اجرا کند، همین hc را به دست می‌آورد.

3. اجرای هر دو و مقایسه

Transfer با مقدار 250 دو فهرست کلمه می‌گیرد که tests/parity.rs از رمزگذاری فراخوانی خود مفسر می‌سازد: 27,151 کلمهٔ عمومی (ELF، کلمه‌رمزگذاری‌شده) و 10,458 کلمهٔ خصوصی (ابتدا حساب‌ها، سپس discriminant و مقدار 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

همان دو فهرست در برابر guest مفسر:

$ 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. بررسی هر هشت بردار با یک دستور

آزمون parity ایمیج ترجمه‌شده را می‌سازد، هر بردار را با 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 را از نوار عمومی (public tape) می‌خواند؛ پس ELF ورودی عمومی برنامه است و هنگام استقرار ثابت می‌شود. گزینه‌ی --public خودِ فایل .so را می‌گیرد و کیف پول آن را مانند گام ۴ به همان 27,151 کلمه کدگذاری می‌کند.

این کار به زنجیره‌ای نیاز دارد که genesis آن max_program_words را دست‌کم 65,096 و max_program_public_words را دست‌کم 27,151 تعیین کرده باشد. زنجیره‌ی 12 استقرار را به 4,096 کلمه محدود می‌کرد و ورودی عمومی نمی‌پذیرفت، بنابراین کیف پول این تصویر را همان‌جا و پیش از هر اثباتی رد می‌کرد. زنجیره‌ی 13، یعنی زنجیره‌ی v0.4، مقادیر 65,535 و 32,768 را تعیین کرد و هر زنجیره‌ی بعدی هر دو مقدار را حفظ کرده است. زنجیره‌ی 20، زنجیره‌ی زنده (genesis برابر 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135)، محدودیت‌های بلوک و پاکت فراخوانی زنجیره‌ی 13 را نیز نگه می‌دارد و سقف اثبات را به نصف، یعنی 4 MiB (4,194,304 بایت، از زنجیره‌ی 17؛ زنجیره‌های 13 تا 16 آن را 8 MiB تعیین کرده بودند) رسانده است. سقف‌های اندازه دیگر تنها مانع نیستند. genesis زنجیره‌ی 20 مقدار hardening_v6 را تعیین می‌کند و بر اساس آن، استقرار برنامه‌ای با کلمات بیشتر از آنچه یک فراخوانی در سقف فراخوانی tier-14 می‌تواند در خود جا دهد نامعتبر است (ProgramUncallable): حداکثر 8,180 کلمه بدون ورودی عمومی و در کنار آن کمتر. این تصویر 65,096 کلمه است و ورودی عمومی آن 27,151 کلمه، پس زنجیره‌ی 20 استقرار را رد می‌کند و فراخوانی را هم رد می‌کرد: هر بردار SPL در tier 20 اجرا می‌شود، بالاتر از سقف فراخوانی tier-14 (محدودیت‌ها). تجمیع بلوک در زنجیره‌ی 20 خاموش است (genesis آن بخش aggregation ندارد)؛ گره‌های bootstrap آن در راه‌اندازی یک اعتبارسنج فهرست شده‌اند. کارمزد استقرار کلمات عمومی را همراه با کلمات کد می‌شمارد: 0.001 + 0.0001 × (65,096 + 27,151) = 9.2257 RAND، همان کارمزدی که استقرار زنجیره‌ی 13 در ادامه پرداخت کرد.

این استقرار در تاریخ 2026-09-19 روی زنجیره‌ی 13 انجام شد، زمانی که زنجیره‌ی 13 زنجیره‌ی زنده بود (پروفایل FRI تولیدی، genesis برابر 8123ccac1883a45750e4df6964fb7cd3f0b321798cde4c0ef406a0293939ece3)، از کیف پول genesis با نام shielded-1. هر زنجیره‌ی بعدی (14 تا 19) به‌صورت زنجیره‌ای تازه و بدون برنامه‌های زنجیره‌ی 13 ساخته شد و این تصویر روی هیچ‌یک از آن‌ها دوباره مستقر نشده است؛ بنابراین تراکنش و ارتفاع زیر متعلق به زنجیره‌ی 13 هستند و دیگر در explorer یافت نمی‌شوند. شناسه‌ی برنامه هشِ 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 کلمه؛ hc 8ca905ae… به املای rand-guest و ae05a98c… به املای کیف پول
ورودی عمومی27,151 کلمه (همان ELF)، چکیده‌ی ec57b10ed6f3a3d5fe87ec072f691322ad747377ba2f0a1788bcfe3e7334d67e
بسته‌ی کارمزد (بسته‌ی 2-ورودی-2-خروجی زنجیره‌ی 13)tier 14، 1,418,406 بایت، اثبات‌شده در 94.3 s
تراکنش استقرار (زنجیره‌ی 13)626fc9387ecc1f6b39f44184807303ac2843029d8fb8e28338bf186445927530
لنگرشده در ارتفاع (زنجیره‌ی 13)400
کارمزد9.2257 RAND

از زنجیره‌ی 14 به بعد، بسته‌ی پرداخت کننده همان بسته‌ی دارایی پنهان 4-ورودی-4-خروجی است که هر تراکنش حمل می‌کند و در برابر binding تراکنش اثبات می‌شود. این بسته همچنان tier 14 است: روی زنجیره‌های 14 و 15 و با پروفایل تولیدی، حدود 100 s و حدود 1.42 MB. از زنجیره‌ی 17 هر بسته یک اثبات احراز هویت tier-10 (مجوزدهی تقسیم‌شده) نیز دارد، بنابراین روی زنجیره‌های 18 و 19 بسته‌ی کارمزد یک تراکنش حدود 1.49 MB اثبات بسته و حدود 1.37 MB اثبات احراز هویت است.

شناسه‌ی برنامه به ELF وابسته است، پس با شناسه‌ای که rand-guest info برای تصویر خام چاپ می‌کند متفاوت است. شناسه‌ای را که deploy چاپ کرد فراخوانی کنید.

Limits

  • هیچ فراخوانی به این برنامه اثبات نشده است، برنامه روی زنجیره‌ی 20 مستقر نیست و زنجیره‌ی 20 هم استقرار و هم فراخوانی را رد می‌کند. استقرار بالا روی زنجیره‌ی 13 بود. بر اساس hardening_v6 زنجیره‌ی 20، استقرار کلماتی بیشتر از آنچه یک فراخوانی tier-14 می‌تواند در خود جا دهد نامعتبر است (ProgramUncallable؛ حداکثر 8,180 کلمه) و این تصویر 65,096 کلمه است. سمت ورودی جا می‌شد: ELF ورودی عمومی استقرار است که rand call خودش آن را واکشی می‌کند و 10,458 کلمه‌ی خصوصی در سقف ورودی 16,071 می‌گنجند که زنجیره‌ی 20 آن را نگه می‌دارد. اما هر بردار SPL در tier 20 است و از fullnode v0.5.6 (2026-09-25) هر گره اثبات فراخوانی بالاتر از tier 14 را پیش از ساختن کلید verifier رد می‌کند (CallTierTooHigh). همین بررسی جدول‌های هشی را هم که یک فراخوانی می‌تواند اعلام کند محدود می‌کند: 2¹³ سطر SHA-256 (128 فشرده‌سازی) و 2¹² سطر Keccak (128 جایگشت). فراخوانی tier-20 را فقط می‌توان خارج از زنجیره اثبات کرد و هنوز هیچ اثبات tier-20 وجود ندارد (نکته‌ی بعد).
  • هنوز هیچ اثباتی در tier 20 ساخته نشده است. یک اثبات tier-20 روی لپ‌تاپ 48 GB در حدود 31 GB متوقف شد و روی droplet با 64 GB پس از 10 m 41 s در 65.1 GB با OOM کشته شد. با برون‌یابی از مقیاس‌بندی اندازه‌گیری‌شده‌ی tier 16/18 (حافظه حدود ×3.9، زمان حدود ×4.1 به‌ازای هر +2 tier)، tier 20 به حدود 330 GB و حدود 3.6 h نیاز دارد، یعنی بیش از بزرگ‌ترین droplet حافظه‌ی DigitalOcean (m-32vcpu-256gb با 256 GB). اثبات‌کننده تک‌نخی اجرا شد: یک ماشین 16-vCPU روی 99% از یک هسته ماند. حافظه‌ی اثبات را ببینید.
  • بدون CPI. فراخوانی‌های بین‌برنامه‌ای trap می‌شوند.
  • فقط sBPF v1. opcodeهایی که فقط در v2 هستند trap می‌شوند.
  • syscallهای Ed25519 و secp256k1 trap می‌شوند تا زمانی که جدول‌های هم‌پردازنده‌ی آن‌ها آماده شود.
  • زنجیره ELF را فقط به‌عنوان ورودی عمومی ثبت می‌کند. استقرار با --public کلمات ELF و چکیده‌ی آن‌ها را ذخیره می‌کند و rand_getProgramPublic آن‌ها را ارائه می‌دهد. زنجیره ثبت نمی‌کند که تصویر چگونه از آن ساخته شده است: ورودی‌های ساخت را منتشر کنید تا دیگران بتوانند hc را بازسازی کنند.

آخرین بار با کامیت c0878c3f از fullnode (زنجیرهٔ 21) در تاریخ 2026-10-12، و circuits `7ef3220` (`sbpf2rv/README.md`, `docs/superpowers/specs/2026-09-18-sbpf-to-rv32-translator-design.md`); steps 1, 2 and the parity test re-run on 2026-09-19 بررسی شد. هرجا کد و این صفحه با هم اختلاف دارند، حق با کد است؛ به ما اطلاع دهید.