Yhteenveto
Standardiprotokolla Solana-tapahtumaopyyntöjen koodaamiseen URL-osoitteisiin maksujen ja muiden käyttötapausten mahdollistamiseksi.
Tämä standardi ammentaa inspiraatiota seuraavista: BIP 21 ja EIP 681.
Motivaatio
Standardoitu URL-protokolla natiivin SOL-siirtojen, SPL Token -siirtojen ja Solana-tapahtumien pyytämiseen mahdollistaa paremman käyttökokemuksen sovelluksissa ja lompakoissa Solana-ekosysteemissä.
Nämä URL-osoitteet voidaan koodata QR-koodeihin tai NFC-tageihin, tai ne voidaan lähettää käyttäjien ja sovellusten välillä maksupyyntöjä ja tapahtumien koostamista varten.
Sovellusten tulee varmistaa, että tapahtuma on vahvistettu ja kelvollinen ennen kuin ne luovuttavat myytävät tavarat tai palvelut tai myöntävät pääsyn kohteisiin tai tapahtumiin.
Mobiililompakoiden tulisi rekisteröityä käsittelemään URL-skeemaa saumattoman mutta turvallisen kokemuksen tarjoamiseksi, kun Solana Pay -URL-osoitteita kohdataan ympäristössä.
Standardoimalla yksinkertainen lähestymistapa näiden ongelmien ratkaisemiseen varmistamme sovellusten ja lompakoiden perustason yhteensopivuuden, jotta kehittäjät voivat keskittyä korkeamman tason abstraktioihin.
Spesifikaatio: Siirtopyyntö
Solana Pay -siirtopyyntö-URL kuvaa ei-interaktiivisen pyynnön SOL- tai SPL Token -siirtoon.
solana:<recipient>?amount=<amount>&spl-token=<spl-token>&reference=<reference>&label=<label>&message=<message>&memo=<memo>
Pyyntö on ei-interaktiivinen, koska URL:n parametreja käyttää lompakko tapahtuman suoraan koostamiseen.
Vastaanottaja
Yksi recipient-kenttä vaaditaan polun nimenä. Arvon on oltava natiivin
SOL-tilin base58-koodattu julkinen avain. Associated token account -tilejä ei
saa käyttää.
Sen sijaan SPL Token -siirron pyytämiseksi spl-token-kenttää on käytettävä SPL
Token -mintin määrittämiseen, josta vastaanottajan associated token -osoite on
johdettava.
Määrä
Yksittäinen amount-kenttä on sallittu valinnaisena kyselyparametrina. Arvon on
oltava ei-negatiivinen kokonaisluku tai desimaaliluku "käyttäjän" yksiköissä.
SOL:n tapauksessa tämä tarkoittaa SOL:ia, ei lamportteja. Tokenien osalta käytä
uiAmountString, ei amount.
0 on kelvollinen arvo. Jos arvo on desimaaliluku, joka on pienempi kuin 1,
sen edessä on oltava 0 ennen .-merkkiä. Tieteellinen notaatio on kielletty.
Jos arvoa ei anneta, lompakon on pyydettävä käyttäjää syöttämään määrä. Jos desimaalien lukumäärä ylittää SOL:n (9) tai SPL-tokenin (minttikohtainen) tukemat desimaalit, lompakon on hylättävä URL virheellisenä.
SPL-token
Yksittäinen spl-token-kenttä on sallittu valinnaisena kyselyparametrina. Arvon
on oltava base58-koodattu SPL-tokenin mint-tilin julkinen avain.
Jos kenttä on annettu, on käytettävä
Associated Token Program-käytäntöä,
ja lompakon on sisällytettävä TokenProgram.Transfer- tai
TokenProgram.TransferChecked-käsky tapahtuman viimeisenä käskynä.
Jos kenttää ei ole annettu, URL kuvaa natiivi SOL-siirtoa, ja lompakon on
sisällytettävä sen sijaan SystemProgram.Transfer-käsky tapahtuman viimeisenä
käskynä.
Lompakon on johdettava ATA-osoite recipient- ja spl-token-kentistä. Siirtoja
aputoken-tileille ei tueta.
Viittaus
Useita reference-kenttiä on sallittu valinnaisina kyselyparametreinä. Arvojen
on oltava base58-koodattuja 32 tavun taulukoita. Nämä voivat olla tai olla
olematta julkisia avaimia, käyrällä tai sen ulkopuolella, ja voivat vastata tai
olla vastaamatta Solanan tilejä.
Jos arvot on annettu, lompakon on sisällytettävä ne annetussa järjestyksessä
vain luku -muotoisina, ei-allekirjoittajina avaimina SystemProgram.Transfer-
tai TokenProgram.Transfer/TokenProgram.TransferChecked-ohjeeseen
maksutapahtumassa. Arvot voivat olla maksupyyntöön liittyviä yksilöllisiä tai
eivät, ja ne voivat vastata Solanan tiliä tai olla vastaamatta sitä.
Koska Solanan validaattorit indeksoivat tapahtumat näiden tiliavainten mukaan,
reference-arvoja voidaan käyttää asiakastunnuksina (tunnuksia, joita voidaan
käyttää ennen lopullisen maksutapahtuman tuntemista).
getSignaturesForAddress
RPC-metodia voidaan käyttää tapahtumien paikantamiseen tällä tavalla.
Tunniste
Yksi label-kenttä on sallittu valinnaisena kyselyparametrina. Arvon on oltava
URL-koodattu
UTF-8-merkkijono, joka kuvaa siirtopyynnön lähdettä.
Esimerkiksi tämä voi olla pyynnön tekevän brändin, kaupan, sovelluksen tai henkilön nimi. Lompakon tulisi purkaa URL-koodaus ja näyttää purettu arvo käyttäjälle.
Viesti
Yksi message-kenttä on sallittu valinnaisena kyselyparametrina. Arvon on
oltava
URL-koodattu
UTF-8-merkkijono, joka kuvaa siirtopyynnön luonnetta.
Esimerkiksi tämä voi olla ostettavan tuotteen nimi, tilaustunnus tai kiitosviesti. Lompakon tulisi purkaa URL-koodaus ja näyttää purettu arvo käyttäjälle.
Muistiinpano
Yksi memo-kenttä on sallittu valinnaisena kyselyparametrina. Arvon on oltava
URL-koodattu
UTF-8-merkkijono, joka on sisällytettävä SPL Memo
-ohjeeseen maksutapahtumassa.
Lompakon on purettava URL-koodaus ja sen tulisi näyttää purettu arvo käyttäjälle. Validaattorit tallentavat muistiinpanon, eikä sen tule sisältää yksityisiä tai arkaluonteisia tietoja.
Jos kenttä annetaan, lompakon on sisällytettävä MemoProgram-käsky toiseksi
viimeiseksi käskyksi transaktiossa, välittömästi ennen SOL- tai
SPL-token-siirtokäskyä, jotta vältytään epäselvyyksiltä muiden
transaktiokohtaisten käskyjen kanssa.
Esimerkit
URL, joka kuvaa siirtopyyntöä 1 SOL:lle
solana:mvines9iiHiQTysrwkJjGf2gb9Ex9jXJX8ns3qwf2kN?amount=1&label=Michael&message=Thanks%20for%20all%20the%20fish&memo=OrderId12345
URL, joka kuvaa siirtopyyntöä 0,01 USDC:lle
solana:mvines9iiHiQTysrwkJjGf2gb9Ex9jXJX8ns3qwf2kN?amount=0.01&spl-token=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
URL, joka kuvaa siirtopyyntöä SOL:lle (käyttäjältä kysytään summa)
solana:mvines9iiHiQTysrwkJjGf2gb9Ex9jXJX8ns3qwf2kN?label=Michael
Spesifikaatio: Transaktiopyyntö
Solana Pay -transaktiopyyntö-URL kuvaa interaktiivista pyyntöä mille tahansa Solana-transaktiolle.
solana:<link>
Pyyntö on interaktiivinen, koska URL:n parametrit mahdollistavat lompakolle HTTP-pyynnön tekemisen transaktion koostamiseksi.
Linkki
Yksi link-kenttä vaaditaan polkunimeksi. Arvon on oltava ehdollisesti
URL-koodattu
absoluuttinen HTTPS-URL.
Jos URL sisältää kyselyparametreja, se on URL-koodattava. Protokollakohtaisia kyselyparametreja voidaan lisätä tähän spesifikaatioon. Arvon URL-koodaus estää ristiriidan protokollaparametrien kanssa.
Jos URL ei sisällä kyselyparametreja, sitä ei tulisi URL-koodata. Tämä tuottaa lyhyemmän URL:n ja vähemmän tiiviin QR-koodin.
Kummassakin tapauksessa lompakon on URL-dekoodattava arvo. Tällä ei ole vaikutusta, jos arvo ei ole URL-koodattu. Jos dekoodattu arvo ei ole absoluuttinen HTTPS-URL, lompakon on hylättävä se virheellisenä.
GET-pyyntö
Lompakon tulisi tehdä HTTP GET JSON-pyyntö URL:iin. Pyynnön ei tulisi
tunnistaa lompakkoa tai käyttäjää.
Lompakon tulisi tehdä pyyntö Accept-Encoding-otsikolla, ja sovelluksen tulisi vastata Content-Encoding-otsikolla HTTP-pakkausta varten.
Lompakon tulee näyttää URL-osoitteen verkkotunnus pyynnön tekemisen aikana.
GET-vastaus
Lompakon on käsiteltävä HTTP
asiakasvirheet,
palvelinvirheet
ja
uudelleenohjausviestit.
Sovelluksen on vastattava näillä tai HTTP OK JSON-vastauksella, jonka sisältö
on:
{ "label": "<label>", "icon": "<icon>" }
<label>-arvon on oltava UTF-8-merkkijono, joka kuvaa tapahtumapyynnön
lähdettä. Tämä voi olla esimerkiksi pyynnön tekevän brändin, kaupan, sovelluksen
tai henkilön nimi.
<icon>-arvon on oltava absoluuttinen HTTP- tai HTTPS-URL kuvakekuvaan.
Tiedoston on oltava SVG-, PNG- tai WebP-kuva, tai lompakon on hylättävä se
virheellisenä.
Lompakon ei tule tallentaa vastausta välimuistiin muutoin kuin HTTP-välimuistin vastausotsikkojen ohjeiden mukaisesti.
Lompakon tulee näyttää otsikko ja renderöidä kuvakekuva käyttäjälle.
POST-pyyntö
Lompakon on tehtävä HTTP POST JSON-pyyntö URL-osoitteeseen sisällöllä:
{ "account": "<account>" }
<account>-arvon on oltava base58-koodattu julkinen avain tilistä, joka voi
allekirjoittaa tapahtuman.
Lompakon tulisi tehdä pyyntö Accept-Encoding-otsikolla, ja sovelluksen tulisi vastata Content-Encoding-otsikolla HTTP-pakkausta varten.
Lompakon tulee näyttää URL-osoitteen verkkotunnus pyynnön tekemisen aikana. Jos
GET-pyyntö tehtiin, lompakon tulee myös näyttää otsikko ja renderöidä
kuvakekuva vastauksesta.
POST-vastaus
Lompakon on käsiteltävä HTTP
asiakasvirheet,
palvelinvirheet
ja
uudelleenohjausviestit.
Sovelluksen on vastattava näillä tai HTTP OK JSON-vastauksella, jonka sisältö
on:
{ "transaction": "<transaction>" }
<transaction>-arvon on oltava base64-koodattu
sarjallistettu transaktio.
Lompakon on base64-dekoodattava transaktio ja
sarjallistettava se.
Sovellus voi vastata osittain tai kokonaan allekirjoitetulla transaktiolla. Lompakon on validoitava transaktio ei-luotettavana.
Tyhjät allekirjoitukset
Jos transaktion
signatures
ovat tyhjiä:
- Sovelluksen tulisi asettaa
feePayerpyynnönaccount-arvoksi tai nolla-arvoksi (new PublicKey(0)tainew PublicKey("11111111111111111111111111111111")). - Sovelluksen tulisi asettaa
recentBlockhashviimeisimpään lohkohajasteeseen tai nolla-arvoksi (new PublicKey(0).toBase58()tai"11111111111111111111111111111111"). - Lompakon on ohitettava transaktion
feePayerja asetettavafeePayerpyynnönaccount-arvoksi. - Lompakon on ohitettava transaktion
recentBlockhashja asetettavarecentBlockhashviimeisimpään lohkohajasteeseen.
Ei-tyhjät allekirjoitukset
Jos transaktion
signatures
eivät ole tyhjiä:
- Sovelluksen on asetettava
feePayerensimmäisen allekirjoituksen julkiseksi avaimeksi. - Sovelluksen on asetettava
recentBlockhashviimeisimpään lohkohajasteeseen. - Sovelluksen on sarjallistettava ja sarjallistettava transaktio ennen sen allekirjoittamista. Tämä varmistaa tiliavainten johdonmukaisen järjestyksen kiertotienä tälle ongelmalle.
- Lompakon ei saa asettaa
feePayerjarecentBlockhash. - Lompakon on varmistettava allekirjoitukset, ja jos jokin on virheellinen, lompakon on hylättävä transaktio virheellisenä.
Lompakon on allekirjoitettava transaktio vain pyynnön account-arvolla, ja sen
on tehtävä niin vain, jos pyynnön account-arvon allekirjoitusta odotetaan.
Jos mitä tahansa allekirjoitusta paitsi pyynnön account-arvon allekirjoitusta
odotetaan, lompakon on hylättävä transaktio haitallisena.
Valinnainen viestikenttä
Sovellus voi myös sisällyttää valinnaisen message-kentän vastauksen runkoon:
{ "message": "<message>", "transaction": "<transaction>" }
<message>-arvon on oltava UTF-8-merkkijono, joka kuvaa tapahtumavastauksen
luonteen.
Tämä voi olla esimerkiksi ostettavan tuotteen nimi, ostokseen sovellettu alennus tai kiitosviesti. Lompakon tulee näyttää arvo käyttäjälle.
Lompakon ja sovelluksen tulee sallia lisäkentät pyynnön rungossa ja vastauksen rungossa, jotka voidaan lisätä tulevissa spesifikaatioissa.
Esimerkkejä
URL, joka kuvaa tapahtumakyselyä
solana:https://example.com/solana-pay
URL, joka kuvaa tapahtumakyselyä kyselyparametreilla
solana:https%3A%2F%2Fexample.com%2Fsolana-pay%3Forder%3D12345
GET-pyynnön esimerkki
GET /solana-pay?order=12345 HTTP/1.1Host: example.comConnection: closeAccept: application/jsonAccept-Encoding: br, gzip, deflate
GET-vastauksen esimerkki
HTTP/1.1 200 OKConnection: closeContent-Type: application/jsonContent-Length: 62Content-Encoding: gzip{"label":"Michael Vines","icon":"https://example.com/icon.svg"}
POST-pyynnön esimerkki
POST /solana-pay?order=12345 HTTP/1.1Host: example.comConnection: closeAccept: application/jsonAccept-Encoding: br, gzip, deflateContent-Type: application/jsonContent-Length: 57{"account":"mvines9iiHiQTysrwkJjGf2gb9Ex9jXJX8ns3qwf2kN"}
POST-vastauksen esimerkki
HTTP/1.1 200 OKConnection: closeContent-Type: application/jsonContent-Length: 298Content-Encoding: gzip{"message":"Thanks for all the fish","transaction":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAECC4JMKqNplIXybGb/GhK1ofdVWeuEjXnQor7gi0Y2hMcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQECAAAMAgAAAAAAAAAAAAAA"}
Laajennukset
Tähän spesifikaatioon voidaan sisällyttää lisämuotoja ja -kenttiä uusien käyttötapausten mahdollistamiseksi samalla varmistaen yhteensopivuus sovellusten ja lompakoiden kanssa.
Avaa Github-issue ehdottaaksesi muutoksia spesifikaatioon palautteen keräämiseksi sovellus- ja lompakkokehittäjiltä.
Todellinen esimerkki tällaisesta ehdotuksesta.
Katso myös
- Solana Pay -spesifikaatio v1.1 - Uusin versio parannuksineen
- Pika-aloitusopas - Toteutusoppaat
- GitHub-repositorio - Referenssitoteutukset
Is this page helpful?