Toimitus maksua vastaan (DvP) -ohjelma

DvP-ohjelma on Solanan vakio-ohjelma toimitukselle maksua vastaan. Sitä ylläpitää Solana Foundation, ja Cantina on auditoinut sen. Kaksi osapuolta sopii kaupasta, kumpikin lähettää oman puolensa escrow-tilille tavallisella token-siirrolla, ja selvitysvaltuutettu selvittää molemmat puolet yhdessä transaktiossa, joten joko molemmat siirtyvät tai ei kumpikaan. Selvitysvaltuutettu on kaupassa nimetty kolmas osoite, kuten kaupan järjestänyt kauppapaikka tai agentti. Kumpikaan osapuoli ei kirjoita tai julkaise ohjelmaa, ja lompakko tai säilyttäjä, joka pystyy lähettämään tavallisen token-siirron (TransferChecked), voi rahoittaa puolen ilman DvP-kohtaista integraatiota. Ennen selvitystä kumpi tahansa osapuoli voi ottaa oman puolensa takaisin tai purkaa kaupan.

Lue tietue ennen kuin toimit sen perusteella

Kaupan tietueen luominen on luvatonta, joten tietue ei todista, että osapuolet olisivat sopineet asiasta. Kunkin osapuolen tulee lukea tallennetut ehdot ennen rahoitusta ja selvitysvaltuutetun ennen selvitystä (ks. todentaminen).

Miten se toimii

Jokaiselle kaupalle luodaan ohjelman omistama tietue ja kaksi escrow-tiliä, yksi kummallekin puolelle. Omaisuuspuolen osapuoli (user_a) ja käteispuolen osapuoli (user_b) rahoittavat kumpikin oman puolensa siirtämällä tokeneita kyseisen puolen escrow-tilille. Selvitysvaltuutettu on ainoa allekirjoittaja, joka voi suorittaa selvityksen. Selvityksessä kummankin puolen sovittu määrä siirretään toiselle osapuolelle, ylijäämä palautetaan puolen omistavalle osapuolelle, ja tietue sekä molemmat escrow-tilit suljetaan. Atomisuus perustuu Solanan transaktioihin: molemmat siirrot ovat samassa transaktiossa, joten joko molemmat tulevat voimaan tai ei kumpikaan.

Jokainen hyvitys, takaisinotto ja ylijäämän palautus menee osapuolen omalle associated token account -tilille: user_a:n tilille mint_a:lle ja user_b:n tilille mint_b:lle. Säilyttäjä- tai treasury-järjestelmä voi rahoittaa puolen omalta tililtään, mutta kaikki palautettava päätyy osapuolen tilille, ei takaisin säilyttäjälle. Jokaisesta kaupasta jää myös pysyvä merkkitili (ks. Tila).

Oppaat

Vaihesivut käyvät yhden kaupan läpi luomisesta selvitykseen, ja jokaisesta instruktiosta on esimerkit TypeScriptillä ja Rustilla.

Devnet-demo ajaa kaupan alusta loppuun: se luo kaupan, rahoittaa molemmat escrow-tilit tavallisilla token-siirroilla ja selvittää molemmat puolet yhdessä transaktiossa.

Valinta ohjelman ja delegoinnin välillä

Toimitus maksua vastaan (DvP) delegoinnin avulla selvittää saman vaihdon ilman ohjelmaa: kumpikin osapuoli delegoi positionsa selvitysagentille, joka siirtää molemmat puolet yhdessä transaktiossa.

  • Ohjelma ei vaadi delegointia, joten rajoitus yhdestä delegaatista per token account -tili ei päde, eikä selvitysvaltuutettu voi ohjata tuottoja muualle. Jokainen kauppa riippuu päivitettävästä ohjelmasta ja sen päivitysvaltuudesta.
  • Delegointimalli ei riipu ohjelmasta ja toimii mintien kanssa, joilla on Scaled UI Amount. Ohjelma hylkää tällaiset mintit, mikä sulkee pois kaikki Mosaicin tokenized-security-mallista luodut mintit (ks. mintin konfiguraatiorajoitukset).

Roolit

Ohjelma on symmetrinen. Sen rajapinnassa osapuolet ovat user_a, joka toimittaa mint_a:n, ja user_b, joka toimittaa mint_b:n. README ja generoidut clientit kutsuvat mint_a:ta omaisuuspuoleksi ja mint_b:tä käteispuoleksi, ja nämä sivut noudattavat tätä käytäntöä, mutta mikään ohjelmassa ei vaadi, että käteispuoli on käteisinstrumentti. Kaksi omaisuuserää tai kaksi stablecoinia selvitetään samalla tavalla.

RooliKukaAllekirjoittaaHuomiot
Omaisuuspuolen osapuoliuser_a, toimittaa mint_a:nOman rahoitussiirtonsa; Reclaim, Reject, RecoverKeypair-lompakko tai PDA-pohjainen älylompakko, kuten multisig-holvi. SPL Token multisig -tili tai program account -tili ei voi olla osapuoli: Create epäonnistuu virheeseen PartyNotSignerCapable
Käteispuolen osapuoliuser_b, toimittaa mint_b:nOman rahoitussiirtonsa; Reclaim, Reject, RecoverSama vaatimus
SelvitysvaltuutettuLuonnin yhteydessä nimetty kolmas osoiteSettle, CancelAinoa allekirjoittaja, joka voi suorittaa selvityksen. Se ei voi ohjata tuottoja muualle, sillä ne lukitaan luonnissa. Se saa suljettujen tilien rent-summan, kun se selvittää tai peruu kaupan
Rent-maksajaSe, joka allekirjoittaa CreateDvp:nCreateRahoittaa rent-maksun (SOL-talletus, joka pitää tilin auki) tietueelle, nonce tombstone -tilille ja molemmille escrow-tileille. Sitä ei kirjata rent-vastaanottajaksi: suljettujen tilien rent menee sille, joka sulkee kaupan

Ohjelmatunnus

dvp34bdbcEm4f4FCUjGV4mDAkDshaQR4LkK8fdcsyZq
KlusteriOhjelmaPäivitysvaltuusViimeksi julkaistu slot
mainnet-betadvp34bdbcEm4f4FCUjGV4mDAkDshaQR4LkK8fdcsyZqDXtFpbPjcn2hxPnw79x1Pfoj35vXh5AsWBkS37YnXMVv452 058 374
devnetdvp34bdbcEm4f4FCUjGV4mDAkDshaQR4LkK8fdcsyZq5EX1zFeJWj4rGYZv432WnYw8CbaSUeTdxPx4r573UgYU479 376 863

Ohjelma on päivitettävissä molemmilla klustereilla. Yllä olevat luvut ovat sitä, mitä solana program show raportoi 2. lokakuuta 2026; hae ajantasaiset arvot suorittamalla sama komento. Devnet-versio on vanhempi kuin commit, jota vasten vaihesivut on kirjoitettu (ks. Asennus), mutta instruktio- ja virhejoukko ovat samat.

Elinkaari

Kauppa on avoin CreateDvp:stä siihen asti, kunnes Settle, Cancel tai Reject sulkee sen. Rahoituksella ei ole omaa instruktiotaan: puoli on rahoitettu, kun sen escrow-tili sisältää vähintään sovitun määrän. Reclaim toimii puolikohtaisesti ja jättää kaupan auki, joten yhden puolen ongelma ei pakota toista osapuolta perumaan koko kauppaa.

Tila

Jokaisella kaupalla on yksi 458 tavun SwapDvp-tili, jonka omistaa ohjelma. Sen osoite johdetaan selvitysvaltuutetusta, kahdesta osapuolesta, kahdesta mintistä ja noncesta (seedit ["dvp", settlement_authority, user_a, user_b, mint_a, mint_b, nonce]). Määrät ja ajat tallennetaan tilin sisään eivätkä vaikuta osoitteeseen, minkä vuoksi ne on luettava eikä päätelty. Pieni merkkitili, nonce tombstone osoitteessa ["nonce", swap_dvp], luodaan kaupan mukana eikä sitä koskaan suljeta, joten kutakin osapuolten, mintien, valtuutetun ja noncen yhdistelmää voi käyttää vain yhteen kauppaan.

KenttäTyyppiMerkitys
bumpu8PDA bump
user_a, user_bPubkeyKaksi osapuolta
mint_a, mint_bPubkeyOmaisuuspuolen ja käteispuolen mintit
settlement_authorityPubkeyAinoa allekirjoittaja, joka voi suorittaa selvityksen tai perua kaupan
token_program_a, token_program_bPubkeyKunkin mintin omistava token program; kaupassa voi yhdistää SPL Token- ja Token-2022-puolia
amount_a, amount_bu64Kunkin puolen sovittu määrä mintin pienimmässä yksikössä (perusyksiköt)
expiry_timestampi64Tämän verkkoajan (onchain-kello) jälkeen Settle hylätään. Reclaim, Cancel ja Reject toimivat edelleen
nonceu64Erottaa toisistaan kaupat, joilla on muuten samat seedit. Kertakäyttöinen
ref_string[u8; 64]Läpinäkymätön client-viite, täytetty nollilla; ohjelma ei koskaan lue sitä
user_a_settlement_destinationPubkeyVastaanottaa käteispuolen Settlessä; oletuksena user_a
user_b_settlement_destinationPubkeyVastaanottaa omaisuuspuolen Settlessä; oletuksena user_b
mint_a_authority, mint_b_authorityPubkeyLuonnissa tallennetut mint authorityt; Settle epäonnistuu, jos jompikumpi on muuttunut
earliest_settlement_timestampOption<i64>Jos asetettu, Settle hylätään ennen tätä verkkoaikaa

Kenttäluettelo on otettu ohjelman IDL:stä commitista, joka mainitaan kohdassa Luo kauppa.

Instruktiot

InstruktioAllekirjoittajaVaikutus
CreateDvpMikä tahansa maksajaLuo SwapDvp-tietueen, sen nonce tombstonen ja molemmat escrow-tilit. Ei siirrä tokeneita
ReclaimDvpuser_a tai user_bPalauttaa allekirjoittajan oman puolen escrow-tililtä. Kauppa pysyy avoimena ja puoli voidaan rahoittaa uudelleen
SettleDvpSelvitysvaltuutettuSiirtää amount_a:n user_b:n kohdeosoitteeseen ja amount_b:n user_a:n kohdeosoitteeseen, palauttaa ylijäämän puolen osapuolelle, sulkee tietueen ja molemmat escrow-tilit
CancelDvpSelvitysvaltuutettuPalauttaa escrow A:n sisällön user_a:lle ja escrow B:n sisällön user_b:lle, sulkee tietueen ja molemmat escrow-tilit
RejectDvpuser_a tai user_bSama vaikutus kuin Cancelilla, mutta osapuolen allekirjoittama
RecoverDvpuser_a tai user_bKaupan sulkemisen jälkeen: tyhjentää uudelleen luodun escrow-tilin allekirjoittajan omalle token account -tilille ja sulkee sen. Kattaa talletuksen, joka saapui Settlen, Cancelin tai Rejectin jälkeen

Jokainen hyvitys menee osapuolen omalle associated token account -tilille kyseisen puolen mintille, riippumatta siitä, kuka escrow-tilin rahoitti.

Kunkin instruktion tilit ja argumentit ovat kyseisen vaiheen sivulla.

Virheet

KoodiVirheMilloin
0SignerNotPartyReclaim, Reject tai Recover allekirjoitettu osoitteella, joka ei ole user_a eikä user_b
1DvpExpiredSettle expiry_timestamp-ajan jälkeen
2SettlementAuthorityMismatchSettle tai Cancel allekirjoitettu muulla osoitteella kuin selvitysvaltuutetun
3SettlementTooEarlySettle ennen earliest_settlement_timestamp-aikaa
4LegNotFundedSettle, kun escrow-tilillä on vähemmän kuin sovittu määrä
5ExpiryNotInFutureCreate, jossa umpeutumisaika on nykyinen verkkoaika tai sitä aiempi
6EarliestAfterExpiryCreate, jossa aikaisin selvitysaika on umpeutumisajan jälkeen
7SelfDvpCreate, jossa user_a on sama kuin user_b
8SameMintCreate, jossa mint_a on sama kuin mint_b
9ZeroAmountCreate, jossa jommankumman puolen määrä on nolla
10BlockedMintExtensionCreate tai Settle mintillä, jolla on TransferFee, InterestBearing, ScaledUiAmount tai NonTransferable
11SettlementAuthorityIsPartyCreate, jossa selvitysvaltuutettu on sama kuin jompikumpi osapuoli
12SettlementAuthorityExecutableCreate, jossa selvitysvaltuutettu on suoritettava (executable) tili
13NonceAlreadyUsedCreate, joka käyttää uudelleen (seeds, nonce)-yhdistelmää, jolla on jo tombstone
14ExpiryTooFarInFutureCreate, jossa umpeutumisaika on yli vuoden päässä
15RefStringTooLongCreate, jossa viite on yli 64 tavua pitkä
16DvpStillOpenRecover, kun kauppa on yhä avoin; käytä Reclaimia
17DvpNeverCreatedRecover siemenillä, joilla ei ole tombstone-merkintää
18EscrowPreloadedWithLamportsCreate, kun ei-natiivin escrow-tilin lamport-saldo ylittää sen rent-vapaan vähimmäismäärän
19SettlementDestinationIsSwapDvpCreate siten, että selvityksen kohde on sama kuin kauppatietue
20SwapDvpPreloadedWithLamportsCreate, kun tietueen osoitteen lamport-saldo ylittää sen rent-varannon
21RecipientAtaMismatchVastaanottajan tai hyvityksen token account ei enää kuulu odotetulle lompakolle ja mintille
22PartyNotSignerCapableCreate osapuolella, joka ei ole järjestelmän omistama, ei-suoritettava tili
23MintAuthorityChangedSettle, kun jalan mint authority poikkeaa luontihetkellä tallennetusta arvosta

Tapahtumat ja indeksointi

Ohjelma ei lähetä ketjussa lainkaan tapahtumia (events). Indeksoija tai täsmäytysjärjestelmä lukee SwapDvp-tilin tilan ja molempien escrow-tilien token-saldot sekä käyttää ref_string-kenttää yhdistääkseen kaupan ketjun ulkopuoliseen toimeksiantoonsa. Koska tietue suljetaan selvityksessä, järjestelmän, joka tarvitsee ehdot jälkikäteen, on tallennettava ne lukiessaan ne tai rekonstruoitava ne kaupan luoneesta transaktiosta.

Tuetut tokenit

Kaupassa voi yhdistää SPL Token -jalan ja Token-2022-jalan; kullakin jalalla on oma token program. Wrapped SOL -jalat ovat tuettuja.

Token-2022-laajennus jalan mintissäOhjelman toiminta
TransferFee, InterestBearing, ScaledUiAmount, NonTransferableHylätään Create- ja Settle-kutsuissa virheellä BlockedMintExtension
PermanentDelegate, Pausable, DefaultAccountState, freeze authority, MintCloseAuthorityHyväksytään; kukin authority voi toimia escrow-tilillä olevilla tokeneilla
ConfidentialTransferHyväksytään; kyseisen jalan määrät ovat julkisia
TransferHookTuettu, enintään 32 lisätiliä jalkaa kohden
MemoTransfer kohde- tai hyvitystililläHyväksytään; ohjelma lähettää vaaditun memon ennen siirtoa

Siirtomaksu jättäisi vastaanottavan osapuolen vvaille sovittua määrää. Interest Bearing ja Scaled UI Amount eivät muuta raakamääriä, mutta niiden korko tai kerroin voi muuttua kaupan luomisen ja selvityksen välillä, mikä muuttaa sovittujen määrien näyttötapaa. NonTransferable jumittaisi molemmat jalat.

Hyväksytyt authorityt voivat siirtää, jäädyttää tai pysäyttää escrow-tilillä olevat tokenit kaupan koko eliniän ajan (ks. alla). Escrow-tiliä ei voi määrittää vastaanottamaan salattuja siirtoja, joten salatun jalan escrow-tilillä olevat ja selvitetyt määrät ovat julkisia.

Hook-mintin osalta asiakas selvittää hookin lisätilit ja liittää ne Settle-, Cancel-, Reject-, Reclaim- ja Recover-kutsuihin. Jalkakohtainen 32 tilin raja laskee mukaan hook-ohjelman ja sen validointitilin. Jos hook authority laajentaa hookin tililistaa yli tämän rajan, jokainen kyseisen jalan siirto epäonnistuu, myös Reclaim, Cancel, Reject ja Recover, kunnes authority peruu muutoksen. Transaktion tilien enimmäismäärä voi tulla vastaan ennen jalkakohtaista rajaa, kun molemmilla jaloilla on hookit.

Kun kohde- tai hyvitystili vaatii memoja, ohjelma kutsuu Memo-ohjelmaa ennen siirtoa, minkä vuoksi jokainen kutsu, joka siirtää tokeneita escrow-tililtä pois, ottaa memo_program-tilin.

Mintin määritysrajoitteet

Scaled UI Amount. Solana Foundationin liikkeeseenlaskutyökalupaketin Mosaic tokenized-security-malli lisää aina Scaled UI Amountin, joten ohjelma ei hyväksy tästä mallista luotua mintiä jalaksi. Tätä ohjelmaa varten tarkoitettu mint voidaan luoda ilman laajennusta (ks. Token Extensions); DvP delegoinnilla selvittää kaupan delegoidun authorityn kautta eikä käytä tätä tarkistusta.

Oletuksena jäädytetyt mintit. Kunkin kaupan escrow on associated token account, jonka omistaa kyseistä kauppaa varten luotu uusi Program Derived Address. Jos mintin Default Account State on frozen, escrow luodaan jäädytettynä, ja siihen tehtävä rahoitussiirto epäonnistuu, kunnes se sulatetaan. Token ACL -ratkaisussa tämä tarkoittaa, että liikkeeseenlaskija tai sen siirtoagentti hyväksyy kaupan escrow'n ennen rahoitusta: joko lisäämällä kauppatietueen osoitteen (escrow'n omistajan) sallittujen listalle, jolloin kuka tahansa voi sulattaa escrow'n, jos mintin Token ACL -konfiguraatio sallii luvattoman sulatuksen, tai antamalla freeze authorityn sulattaa se suoraan. Jäädytetty escrow estää myös Settle-, Reclaim-, Cancel-, Reject- ja Recover-kutsut kyseisellä jalalla, joten freeze authority ja hook-mintin tapauksessa hook authority on luotettu osapuoli kaupan koko eliniän ajan. Jäädytetyn escrow'n polku kuvataan tässä, eikä sitä käytetä devnet-koodiesimerkeissä.

Rajoitukset

  • Ei kohdistusta, hintalöytöä eikä tilauskirjaa. Osapuolet sopivat ehdoista kirjanpidon ulkopuolella, ja yksi heistä tallentaa ne.
  • Ei nettoutusta, vain kahdenvälinen: yksi tietue on yksi kauppa kahden osapuolen välillä.
  • Ei osittaisia toteutuksia. Settle siirtää täsmälleen kunkin jalan sovitun määrän ja palauttaa mahdollisen ylijäämän jalan osapuolelle.
  • Ei kirjanpidon ulkopuolista jalkaa. Molemmat jalat ovat token account -tilejä Solanassa; käteisjalka olemassa olevia väyliä pitkin selvitetään erikseen ja täsmäytetään.
  • Ei kelpoisuustarkistusta, sallittujen listaa eikä KYC:tä. Mintin omat kontrollit valvovat haltijoiden kelpoisuutta.
  • Ei automaattista selvitystä. Selvitys-authorityn on allekirjoitettava.
  • Ei tapahtumia eikä protokollamaksua transaktiomaksujen ja rentin lisäksi.

Ohjelma poistaa osapuolten välisen pääomariskin: kumpikaan jalka ei siirry, ellei toinenkaan siirry. Se ei poista kummankaan tokenin liikkeeseenlaskijan luotto- tai lunastusriskiä, mintin freeze-, pause- tai permanent delegate -authorityn mahdollisuutta toimia escrow-tilillä olevilla tokeneilla (ks. tuetut tokenit) eikä riippuvuutta siitä, että selvitys-authority on käytettävissä allekirjoittamaan.

Tarkistus ennen rahoitusta ja selvitystä

CreateDvp on luvaton: vain maksaja allekirjoittaa, eivät osapuolet eikä selvitys-authority. Kuka tahansa voi siis luoda tietueen, jossa on mitä tahansa osapuolia ja ehtoja. Ennen rahoitusta ja uudelleen ennen selvitystä lue SwapDvp-tili ja varmista:

  1. Tilin omistaa DvP-ohjelma ja sen koko on täsmälleen 458 tavua. Tili, jota ohjelma ei omista, voidaan täyttää tavuilla, jotka purkautuvat kuin oikea tietue.
  2. user_a, user_b, mint_a, mint_b ja settlement_authority vastaavat sovittua kauppaa.
  3. amount_a, amount_b, expiry_timestamp ja earliest_settlement_timestamp vastaavat sovittuja ehtoja.
  4. Molemmat selvityksen kohteet ovat sovittuja osoitteita. Väärennetty tietue voi ohjata tuotot muualle.

Jalkojen rahoitus luettelee generoitujen asiakkaiden tarkistavat lukijat ja näyttää tarkistuksen koodina.

Käsittele kauppa selvitettynä, kun Settle-transaktio saavuttaa tilan finalized. Se on verkon vahvistustaso; se, merkitseekö se myös selvityksen lopullisuutta oikeudellisessa mielessä, riippuu osapuolten sopimuksista ja sovellettavista sääntelyjärjestelmistä.

Versiointi

SwapDvp-tilillä ei ole versiokenttää. Sen rakenne on kiinteä 458 tavua (SwapDvp::LEN), ja tarkistavat lukijat hylkäävät minkä tahansa muun pituisen tilin. IDL:llä on oma versionsa, 0.1.0 2. lokakuuta 2026.

Ohjelma on päivitettävissä molemmissa klustereissa (ks. Program ID). Kauppatietue on olemassa vain, kunnes se selvitetään, peruutetaan tai hylätään, joten tarkista repositoriosta, miten päivitys käsittelee avoimia kauppoja, ja generoi asiakkaat uudelleen käyttöön otetun version IDL:stä.

Repositorio ja auditointi

Lähdekoodi, IDL, generoidut asiakkaat ja testit ovat repositoriossa solana-foundation/dvp MIT-lisenssillä. Ohjelma on no_std-Pinocchio-ohjelma; asiakkaat generoidaan IDL:stä Codamalla. Haavoittuvuusilmoitukset tehdään repositorion tietoturvailmoituslinkin kautta SECURITY.md-tiedoston mukaisesti.

Ohjelman on auditoinut Cantina.

Liittyvää

Is this page helpful?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.