Cross Program Invocation

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 -esimerkkiCross-program invocation -esimerkki

Keskeiset faktat

  • Kaksi funktiota: invoke (ei PDA-allekirjoitusta) ja invoke_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

RajoitusArvoLähde
Käskypinon maksimisyvyys5 (9 SIMD-0268:n kanssa)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
CPI-kutsun kustannus1 000 CU (946 SIMD-0339:n kanssa)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
PDA-allekirjoittajien maksimimäärä per CPI16MAX_SIGNERS
CPI instruction datan maksimikoko10 KiB (10 240 tavua)MAX_INSTRUCTION_DATA_LEN
Paluudatan maksimikoko1 024 tavuaMAX_RETURN_DATA
CPI account infojen maksimimäärä128 (255 SIMD-0339:n kanssa)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
CPI-serialisointikustannus1 CU per 250 tavuacpi_bytes_per_unit
Tilidatan maksimi uudelleenallokointi per CPI10 240 tavua (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke vs invoke_signed

Solana tarjoaa kaksi funktiota CPI-kutsujen tekemiseen:

FunktioKäyttötapausPDA-allekirjoitus
invokeCPI-kutsut, joissa kaikki vaaditut allekirjoittajat ovat jo allekirjoittaneet alkuperäisen transaktionEi
invoke_signedCPI-kutsut, joissa kutsuva ohjelma tarvitsee allekirjoittaa omistamansa PDA:n puolestaKyllä, 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?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä