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 با کد بومی جایگزین شده است. به همین دلیل خروجیهای آن کلمه به کلمه با خروجیهای مفسر برابر است.
مدل اعتماد
سه چیز اثبات یک برنامهٔ ترجمهشده را مقید میکنند.
hcکد ترجمهشده را مقید میکند. کد C داخل ایمیج کامپایل میشود، بنابراینhcایمیج آن را پوشش میدهد.- نگهبان ELF،
hcرا به یک برنامه مقید میکند. شیم برنامه را از ELF روی نوار بارگذاری میکند؛ پس بدون یک بررسی، یک ایمیج میتواند ELF دیگری را که فراخواننده انتخاب کرده، زیر همانhcاجرا کند. از این روprogram.cتولیدشده با یک چکیده از برنامهٔ بارگذاریشدهای که از آن ترجمه شده پایان مییابد: متن (text)، دادهٔ فقطخواندنی، نشانیهای آنها و نقطهٔ ورود. پیش از اجرای هر چیز، شیم برنامهٔ بارگذاریشدهٔ روی نوار را به همان شیوه (Poseidon2) هش میکند و مقایسه میکند. هر برنامهٔ دیگری باBadElfو وضعیت 2 روی پیشحالت متوقف میشود. بنابراین اثباتی که در برابر اینhcتأیید شود، اجرای همان برنامه است. 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 بالاتر از r10 | trap با BadInsn |
UnknownOpcode | یک opcode بدون کلاس v1، از جمله خانوادهٔ sdiv/srem که فقط در v2 است و hor64 | trap با 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 هرگز به آنها نمیرسد.
سه تفاوت پذیرفته شدهاند. هر یک فقط باعث میشود ترجمه در جایی متوقف شود که ممکن است مفسر متوقف نشود؛ ترجمه هرگز اجرایی را کامل نمیکند که مفسر در آن متوقف میشود.
- یک
callxبیرون از مجموعهٔ اسکنشده باBadJumptrap میکند، در حالی که مفسر ممکن است در آن نشانی کد واقعی اجرا کند. - بررسیهای بودجه ممکن است یک بلوک پایه به تعویق بیفتند. برای جا دادن SPL Token زیر سقف 65,535 کلمه، 1,505 بلوک از 3,546 بلوک آن بررسی حد دستورالعمل خود را نمیکنند. نوع توقف میتواند در همان یک بلوکی که از حد عبور میکند متفاوت باشد. وضعیت و هشت کلمه یکساناند.
- فقط برنامهٔ مبدأ اجرا میشود. 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,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 |
| تعداد حسابها بیش از حد (harness رد میکند) | 2 | 0 | 303,933 | 304,616 | 20 |
چرخهها کجا صرف میشوند در Transfer:
| مرحله | ترجمهشده | sbpf.bin |
|---|---|---|
| خواندن هر دو نوار | 302,881 | 302,880 |
| بارگذاری ELF | 177,012 | 173,859 |
| بررسی ناحیهٔ حسابها | 103,829 | 103,824 |
| صفر کردن پشته و heap در 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٪ هر اجرا 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را بازسازی کنند.