Cross Program Invocation (CPI) tarkoittaa tilannetta, jossa yksi ohjelma kutsuu toisen ohjelman käskyä suorituksen aikana. CPI:t mahdollistavat koostettavuuden: minkä tahansa ohjelman käskyjä voi kutsua mikä tahansa muu ohjelma verkossa.
Cross-program invocation -esimerkki
CPI:t ilman PDA-allekirjoittajia
Invoke-funktion käyttö, Anchor CpiContext, natiivit Rust-esimerkit, SOL-siirron CPI-esimerkit.
CPI:t PDA-allekirjoittajien kanssa
Invoke_signed-funktion käyttö allekirjoittaja-seedeillä, Anchor CpiContext PDA:n kanssa, natiivit Rust PDA-allekirjoitusesimerkit.
CPI:n suoritus ja oikeudet
11-vaiheinen CPI-suorituskulku, oikeuksien laajennussäännöt, uudelleensisääntulo, tilin validointi.
CPI:n kustannusmalli ja datan synkronointi
CPI-kustannuskaava, serialisointikustannukset, tilidatan synkronointi, PDA-allekirjoitus, paluudata.
Keskeiset faktat
- Kaksi funktiota:
invoke(ei PDA-allekirjoitusta) jainvoke_signed(PDA-allekirjoituksella). - Oikeuksien laajennus: Tilin oikeudet (allekirjoittaja, kirjoitettava) laajentuvat kutsujalta kutsuttavalle. Kutsuttava ei voi korottaa oikeuksia yli sen, mitä kutsuja välitti.
- Jaettu laskentabudjetti: Kutsuttavan CU-kulutus vähentää kutsujalle jäljellä olevaa budjettia.
- Uudelleensisääntulo: Suora itserekursio on sallittu (A->A->A). Epäsuora
uudelleensisääntulo ei ole sallittu (A->B->A palauttaa
ReentrancyNotAllowed).
Rajoitukset
| Rajoitus | Arvo | Lähde |
|---|---|---|
| Käskypinon maksimisyvyys | 5 (9 SIMD-0268:n kanssa) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| CPI-kutsun kustannus | 1 000 CU (946 SIMD-0339:n kanssa) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| PDA-allekirjoittajien maksimimäärä per CPI | 16 | MAX_SIGNERS |
| CPI instruction datan maksimikoko | 10 KiB (10 240 tavua) | MAX_INSTRUCTION_DATA_LEN |
| Paluudatan maksimikoko | 1 024 tavua | MAX_RETURN_DATA |
| CPI account infojen maksimimäärä | 128 (255 SIMD-0339:n kanssa)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| CPI-serialisointikustannus | 1 CU per 250 tavua | cpi_bytes_per_unit |
| Tilidatan maksimi uudelleenallokointi per CPI | 10 240 tavua (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke vs invoke_signed
Solana tarjoaa kaksi funktiota CPI-kutsujen tekemiseen:
| Funktio | Käyttötapaus | PDA-allekirjoitus |
|---|---|---|
invoke | CPI-kutsut, joissa kaikki vaaditut allekirjoittajat ovat jo allekirjoittaneet alkuperäisen transaktion | Ei |
invoke_signed | CPI-kutsut, joissa kutsuva ohjelma tarvitsee allekirjoittaa omistamansa PDA:n puolesta | Kyllä, allekirjoittajan siementen kautta |
Pinnan alla invoke yksinkertaisesti kutsuu invoke_signed-funktiota
tyhjällä allekirjoittajan siementen taulukolla. Käytä invoke-funktiota,
kun et tarvitse PDA-allekirjoitusta, ja invoke_signed-funktiota, kun
ohjelman on valtuutettava toiminto PDA:n puolesta.
Molemmat funktiot lopulta käynnistävät saman syscall-kutsun
(sol_invoke_signed_rust)
ja kulkevat saman ajonaikaisen polun läpi
(cpi_common).
Ainoa ero on se, annetaanko allekirjoittajan siemenet. Kun siemenet annetaan,
ajonaikainen ympäristö johtaa PDA-julkiset avaimet ja lisää ne kelvollisten
allekirjoittajien joukkoon ennen oikeuksien tarkistusta.
Is this page helpful?