sbpf2rv ஒரு தொகுக்கப்பட்ட Solana நிரலை (ஒரு sBPF ELF, அதாவது cargo build-sbf உருவாக்கும் .so) எடுத்து அதை ஒரு Rand நிரலாக மாற்றுகிறது. அது C குறியீட்டை எழுதுகிறது; rand-guest build அந்த C-ஐ ஒரு RV32IM படிமமாகத் தொகுக்கிறது. அதே ELF மற்றும் அதே அறிவுறுத்தலுக்கு, Rand-இன் sBPF இடைமொழிபெயர்ப்பி guest ஆன sbpf.bin வெளியிடும் அதே எட்டு வெளியீட்டுச் சொற்களை இந்தப் படிமமும் வெளியிடுகிறது. உண்மையான SPL Token நிரலைக் கொண்டு இந்த முழுப் பாதையையும் இந்தப் பக்கம் காட்டுகிறது.
இது என்ன
| உள்ளீடு | ஒரு sBPF v1 ELF |
| வெளியீடு | ஒரு C இடைப்பொருத்தி crate; rand-guest build அதை ஒரு படிமக் கொள்கலனாக்குகிறது |
| இயங்கும் இடம் | சங்கிலிக்கு வெளியே, உருவாக்குநரின் கணினியில்; சங்கிலி படிமத்தை மட்டுமே காண்கிறது |
| பொருந்த வேண்டியது | அதே இரண்டு உள்ளீட்டு நாடாக்களில் sbpf.bin-இன் எட்டு வெளியீட்டுச் சொற்கள் |
| களஞ்சியம் | circuits களஞ்சியத்தில் sbpf2rv/ |
| நிலைநிறுத்தப்பட்ட கருவித்தொகுப்பு | Rust 1.98.1, clang 23.1.1, cc crate 1.4.6 |
மொழிமாற்றப்பட்ட நிரல் இடைமொழிபெயர்ப்பியின் ABI-ஐயே தக்கவைக்கிறது. அது அதே நாடாக்களைப் படிக்கிறது: பொது நாடாவில் ELF, தனிப்பட்ட நாடாவில் தொடராக்கப்பட்ட அறிவுறுத்தல் (முதலில் கணக்குகள், பின்னர் அறிவுறுத்தல் தரவு). நிரலைச் சுற்றி அதே sbpf-core இயக்கச் சட்டகத்தை இயக்குகிறது: உள்ளீட்டைக் குறிவிலக்குகிறது, ELF-ஐ ஏற்றுகிறது, கணக்குப் பகுதியைச் சரிபார்க்கிறது, உள்ளீட்டையும் வெளியீட்டையும் ஹாஷ் செய்கிறது. sBPF செயலாக்கம் மட்டுமே சொந்த இயந்திரக் குறியீட்டால் மாற்றப்படுகிறது. அதனால்தான் அதன் வெளியீடுகள் இடைமொழிபெயர்ப்பியின் வெளியீடுகளுடன் சொல்லுக்குச் சொல் சமமாக உள்ளன.
நம்பிக்கை மாதிரி
மொழிமாற்றப்பட்ட நிரலின் நிரூபணத்தை மூன்று விஷயங்கள் கட்டுப்படுத்துகின்றன.
hcமொழிமாற்றப்பட்ட குறியீட்டைக் கட்டுப்படுத்துகிறது. C குறியீடு படிமத்துக்குள் தொகுக்கப்படுவதால், படிமத்தின்hcஅதை உள்ளடக்குகிறது.- ELF காவல்
hc-ஐ ஒரே நிரலுடன் கட்டுப்படுத்துகிறது. இடைப்பொருத்தி நாடாவில் உள்ள ELF-இலிருந்து நிரலை ஏற்றுகிறது; எனவே சரிபார்ப்பு இல்லையெனில், ஒரே படிமம் அதேhc-இன் கீழ் அழைப்பவர் தேர்ந்தெடுக்கும் வேறொரு ELF-ஐ இயக்க முடியும். ஆகவே உருவாக்கப்பட்டprogram.c, அது எந்த ஏற்றப்பட்ட நிரலிலிருந்து மொழிமாற்றப்பட்டதோ அதன் சுருக்கக்குறியுடன் முடிகிறது: text, படிக்க மட்டுமான தரவு, அவற்றின் முகவரிகள், நுழைவுப் புள்ளி. எதையும் இயக்குவதற்கு முன், இடைப்பொருத்தி நாடாவில் ஏற்றப்பட்ட நிரலை அதே முறையில் (Poseidon2) ஹாஷ் செய்து ஒப்பிடுகிறது. வேறு எந்த நிரலும் முன்-நிலையின் மீதுBadElf, நிலைக் குறியீடு 2 உடன் நிறுத்தப்படும். எனவே இந்தhc-க்கு எதிராகச் சரிபார்க்கப்படும் நிரூபணம் அந்த நிரலின் ஓர் இயக்கமே. H_PUBELF-இன் பைட்டுகளைக் கட்டுப்படுத்துகிறது. ELF பொது நாடாவில் பயணிக்கிறது; நிரூபணத்தின் பொது-உள்ளீட்டுச் சுருக்கக்குறி அதைச் சொல்லுக்குச் சொல் உள்ளடக்குகிறது.
ஒரு குறிப்பிட்ட ELF-இன் உண்மையான மொழிமாற்றம்தான் hc என்பது மீண்டும் உருவாக்குவதன் மூலம் சரிபார்க்கப்படுகிறது. நிலைநிறுத்தப்பட்ட sbpf2rv-ஐ ELF மீது இயக்கி, நிலைநிறுத்தப்பட்ட கருவித்தொகுப்பைக் கொண்டு உருவாக்கி, hc-ஐ ஒப்பிடுங்கள். இந்தக் காரணத்திற்காகவே உருவாக்கம் மீளுருவாக்கக்கூடியதாக உள்ளது.
மூல ELF-ஐயோ அதன் ஹாஷையோ சங்கிலி பதிவு செய்வதில்லை. அது படிமத்தையும் அதன் நிரல் அடையாளத்தையும் சேமிக்கிறது. ELF அனைவருக்கும் தெரிய வேண்டும் என விரும்பும் நிறுவுநர் அதை நிரலுடன் சேர்த்து வெளியிடுவார்.
காவல் கோப்பை அல்ல, ஏற்றப்பட்ட நிரலைக் கட்டுப்படுத்துகிறது. ஏற்றி பார்க்காத இடங்களில் மட்டும் (தலைப்புத் திணிப்பு, குறியீட்டு அட்டவணைகள்) வேறுபடும் இரண்டு ELF-கள் ஒரே நிரலாக ஏற்றப்பட்டு இரு பக்கங்களிலும் ஒரே மாதிரி இயங்குகின்றன. .rodata-வில் ஒரு பைட் மாற்றப்பட்ட ELF, அந்தப் பைட்டைப் பரிமாற்றம் ஒருபோதும் படிக்காவிட்டாலும், மொழிமாற்றத்தால் மறுக்கப்படுகிறது; இடைமொழிபெயர்ப்பியால் இயக்கப்படுகிறது.
எது பொறியில் நிற்கிறது, எது மறுக்கப்படுகிறது
மொழிமாற்றத்தின்போது எதுவும் மறுக்கப்படுவதில்லை. தவறான வடிவிலான ELF ஏற்றியின் சொந்தச் செய்தியுடன் மறுக்கப்படுகிறது; ஆனால் சரியான வடிவிலான ELF-இல் உள்ள எந்த அறிவுறுத்தலும் மறுக்கப்படுவதில்லை. ஒரு நிரல் சந்திக்கக்கூடியவற்றை வருடி எச்சரிக்கைகளாகத் தெரிவிக்கிறது; மொழிமாற்றப்பட்ட நிரல், இடைமொழிபெயர்ப்பி எங்கே பொறியில் நிற்குமோ அதே இடத்தில் இயக்க நேரத்தில் பொறியில் நிற்கிறது:
| எச்சரிக்கை | அது என்ன | இயக்க நேரத்தில் |
|---|---|---|
UnknownSyscall | இயக்கச்சூழல் செயல்படுத்தாத ஒரு அமைப்பு அழைப்பு ஹாஷ் | UnknownSyscall பொறி |
Cpi | ஒரு நிரல்களுக்கிடையிலான அழைப்பு (sol_invoke_signed*) | அதே UnknownSyscall பொறி; CPI செயல்படுத்தப்படவில்லை |
RegisterOutOfRange | r11..r15 பதிவகம், அல்லது r10-க்கு மேலான callx பதிவகம் | BadInsn பொறி |
UnknownOpcode | v1 வகை இல்லாத இயக்கக் குறியீடு; v2-க்கு மட்டுமான sdiv/srem குடும்பமும் hor64-உம் இதில் அடங்கும் | BadInsn பொறி |
JumpOutOfText | செயல்கூற்றின் text-க்கு வெளியே செல்லும் தாவல், அழைப்பு அல்லது தொடர்ச்சி | BadJump பொறி |
BadCallImmSrc | src மதிப்பு 2..=10 ஆக உள்ள call imm (கையால் உருவாக்கப்பட்ட ELF-களில் மட்டும்) | BadInsn பொறி |
எட்டப்படாத குறியீட்டை மறுக்கும் மொழிமாற்றி, இடைமொழிபெயர்ப்பி இன்று இயக்கும் நிரல்களை மறுக்கும். SPL Token அத்தகைய நிரல்: அது sol_set_return_data, sol_get_sysvar ஆகியவற்றை அழைக்கிறது; Transfer பாதை அவற்றை ஒருபோதும் எட்டுவதில்லை.
மூன்று வேறுபாடுகள் ஏற்றுக்கொள்ளப்படுகின்றன. ஒவ்வொன்றும், இடைமொழிபெயர்ப்பி நிற்காமல் போகக்கூடிய இடத்தில் மொழிமாற்றத்தை நிறுத்த மட்டுமே செய்கிறது; இடைமொழிபெயர்ப்பி நிறுத்தும் ஓர் இயக்கத்தை மொழிமாற்றம் ஒருபோதும் முடித்து வைப்பதில்லை.
- வருடப்பட்ட தொகுப்புக்கு வெளியே உள்ள
callxBadJumpபொறியில் நிற்கிறது; அதே முகவரியில் இடைமொழிபெயர்ப்பி உண்மையான குறியீட்டை இயக்கக்கூடும். - வரவுசெலவு வரம்புச் சரிபார்ப்புகள் ஓர் அடிப்படைத் தொகுதி தள்ளிப்போகலாம். SPL Token-ஐ 65,535-சொல் உச்சவரம்புக்குள் பொருத்த, அதன் 3,546 தொகுதிகளில் 1,505 தொகுதிகள் தங்களின் சொந்த அறிவுறுத்தல்-வரம்புச் சரிபார்ப்பைத் தவிர்க்கின்றன. வரம்பைக் கடக்கும் அந்த ஒரு தொகுதிக்குள் நிறுத்த வகை வேறுபடலாம். நிலைக் குறியீடும் எட்டுச் சொற்களும் ஒன்றே.
- மூல நிரல் மட்டுமே இயங்குகிறது. வேறு ELF மறுக்கப்படுகிறது (மேலே உள்ள காவல்).
Ed25519, secp256k1. sol_ed25519_verify, sol_secp256k1_recover ஆகியவற்றின் மென்பொருள் செயலாக்கங்கள் sbpf-rt/-இல் உள்ளன; ஆனால் இணைக்கப்படவில்லை. இடைமொழிபெயர்ப்பி இரண்டிலும் பொறியில் நிற்கிறது; எனவே சமநிலைக்காக மொழிமாற்றமும் பொறியில் நிற்கிறது. ஒவ்வோர் அழைப்புக்கும் முறையே சுமார் 14.3M, 15.7M சுழற்சிகள் ஆகின்றன; இது மிகப்பெரிய அடுக்கை (2²⁰) விட மிக அதிகம். அவற்றுக்கு இணைச்செயலி அட்டவணைகள் தேவை.
எண்ணிக்கைகள்
ELF காவல் இருக்கும் நிலையில், SPL Token-இல் (guests-compiled/sbpf/programs/spl_token.so, இடைமொழிபெயர்ப்பியின் சொந்தச் சோதனைப் பொருத்தம்) அளவிடப்பட்டவை.
| படிமம் | நிரல் சொற்கள் | உச்சவரம்பு | 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 அடுக்கையும் heap-ஐயும் பூஜ்யமாக்குதல் | 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 மடங்கு மலிவானது (154-க்கு எதிராகச் சுமார் 62 சுழற்சிகள்). ஆனால் ஒவ்வோர் இயக்கத்திலும் சுமார் 98% நிலையான இயக்கச் சட்டகமே; காவல் 73k சுழற்சிகளைச் சேர்க்கிறது. எனவே SPL Token-க்கு மொழிமாற்றப்பட்ட படிமம் 69k முதல் 75k சுழற்சிகள் அதிகச் செலவானது; இரண்டும் அடுக்கு 20-இலேயே இருக்கின்றன.
கணிப்புச் சுமை மிகுந்த நிரல்களுக்கு மட்டுமே மொழிமாற்றம் பலன் தருகிறது. ஓர் அறிவுறுத்தலுக்குச் சுமார் 90 சுழற்சிகள் சேமிக்கப்படுவதால், 10,000 sBPF அறிவுறுத்தல்களைச் செயலாக்கும் ஓர் அழைப்பு சுமார் 0.9M சுழற்சிகளைச் சேமிக்கிறது. SPL Token 120 முதல் 143 வரை மட்டுமே செயலாக்குகிறது.
படிப்படியான விளக்கம்: SPL Token, மொழிமாற்றப்பட்டுப் பொருத்திப் பார்க்கப்பட்டது
ஒவ்வொரு கட்டளையும் 7ef3220-இல் உள்ள circuits களஞ்சிய நகலின் வேரிலிருந்து இயங்குகிறது; கருவித்தொகுப்பு ஒரு Rust நிரலை நிறுவுதல் பக்கத்திலிருந்தும், clang 23.1.1 ஒரு RISC-V நிரலை நிறுவுதல் பக்கத்திலிருந்தும். நீண்ட வெளியீடு … எனக் குறிக்கப்பட்ட இடங்களில் வெட்டப்பட்டுள்ளது.
0. கருவிகளை உருவாக்குதல்
(cd sbpf2rv && cargo +1.98.1 build --release)
(cd rand-guest && cargo +1.98.1 build --release)
1. மொழிமாற்றுதல்
--out 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). நான்கு எச்சரிக்கைகளும் 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
அதே இரண்டு பட்டியல்கள் இடைமொழிபெயர்ப்பி 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. எட்டு வெக்டர்களையும் ஒரே கட்டளையில் சரிபார்த்தல்
சமநிலைச் சோதனை மொழிமாற்றப்பட்ட படிமத்தை உருவாக்கி, ஒவ்வொரு வெக்டரையும் இரண்டு படிமங்களிலும் 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 கோப்பையே ஏற்கிறது; பணப்பை அதை படி 4-இல் உள்ள அதே 27,151 சொற்களாகக் குறியாக்குகிறது.
இதற்கு, தொடக்கத் தொகுதி max_program_words-ஐக் குறைந்தது 65,096 ஆகவும் max_program_public_words-ஐக் குறைந்தது 27,151 ஆகவும் அமைக்கும் சங்கிலி தேவை. சங்கிலி 12 ஒரு நிறுவலை 4,096 சொற்களுக்குள் கட்டுப்படுத்தியது, பொது உள்ளீட்டை ஏற்கவில்லை; எனவே அங்கு எதையும் நிரூபிக்கும் முன்பே பணப்பை இந்தப் படிமத்தை மறுத்தது. v0.4 சங்கிலியான சங்கிலி 13 இவற்றை 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 நடப்புச் சங்கிலியாக இருந்தபோது (உற்பத்தி FRI சுயவிவரம், தொடக்கத் தொகுதி 8123ccac1883a45750e4df6964fb7cd3f0b321798cde4c0ef406a0293939ece3), தொடக்கப் பணப்பை shielded-1-இலிருந்து சங்கிலி 13-இல் இயங்கியது. அதன் பிறகு வந்த ஒவ்வொரு சங்கிலியும் (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-இல் நினைவகப் பற்றாக்குறையால் (OOM) நிறுத்தப்பட்டது. அளவிடப்பட்ட அடுக்கு-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-ஐ மீண்டும் கட்டமைக்க முடியும்படி கட்டமைப்பு உள்ளீடுகளை வெளியிடுங்கள்.