Yhteenveto
Standardiprotokolla Solana-transaktiopyynnöt URL-osoitteisiin koodaamiseksi maksuja ja muita käyttötapauksia varten.
Tästä määrittelystä on saavutettu yleinen konsensus, ja toteutuksia on olemassa Phantomissa, FTX:ssä ja Slopessa.
Tämä standardi ammentaa inspiraatiota BIP 21 ja EIP 681 -määrittelyistä.
Tausta
Standardoitu URL-protokolla natiivin SOL-siirtojen, SPL Token -siirtojen ja Solana-transaktioiden pyytämiseksi mahdollistaa paremman käyttäjäkokemuksen sovelluksissa ja lompakoissa Solana-ekosysteemissä.
Nämä URL-osoitteet voidaan koodata QR-koodeihin tai NFC-tageihin, tai lähettää käyttäjien ja sovellusten välillä maksupyyntöjä ja transaktioiden koostamiseksi.
Sovellusten tulee varmistaa, että transaktio 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 ja turvallisen käyttö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.
Määrittely: Siirtopyyntö
Solana Pay -siirtopyynnön URL-osoite kuvaa ei-interaktiivisen pyynnön SOL- tai SPL Token -siirtoa varten.
solana:<recipient>?amount=<amount>&spl-token=<spl-token>&reference=<reference>&label=<label>&message=<message>&memo=<memo>
Pyyntö on ei-interaktiivinen, koska URL-osoitteen parametreja lompakko käyttää suoraan transaktion koostamiseen.
Vastaanottaja
Yksi recipient-kenttä vaaditaan polkuna. Arvon on oltava base58-koodattu
natiivin SOL-tilin pubkey. Associated token account -tilejä ei saa käyttää.
Sen sijaan SPL Token -siirron pyytämiseen on käytettävä spl-token-kenttää SPL
Token mintin määrittämiseen, josta vastaanottajan liitetty 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ä"-yksiköissä.
SOL:n osalta se tarkoittaa SOL:ia eikä lamportteja. Tokeneille käytä
uiAmountString:ta äläkä amount:ta.
0 on kelvollinen arvo. Jos arvo on desimaaliluku pienempi kuin 1, sen edessä
on oltava 0 ennen .:ta. Tieteellinen notaatio on kielletty.
Jos arvoa ei anneta, lompakon on pyydettävä käyttäjältä määrä. Jos desimaalien lukumäärä ylittää SOL:n (9) tai SPL Tokenin (mint-kohtaisen) tukeman määrän, lompakon on hylättävä URL virheellisenä.
SPL Token
Yksittäinen spl-token-kenttä on sallittu valinnaisena kyselyparametrina. Arvon
on oltava base58-koodattu SPL Token mint accountin julkinen avain.
Jos kenttä on annettu,
Associated Token Account
-käytäntöä on käytettävä, ja lompakon on sisällytettävä TokenProgram.Transfer
tai TokenProgram.TransferChecked-käsky transaktion viimeisenä käskynä.
Jos kenttää ei ole annettu, URL kuvaa natiivia SOL-siirtoa, ja lompakon on
sisällytettävä SystemProgram.Transfer-käsky transaktion viimeisenä käskynä sen
sijaan.
Lompakon on johdettava ATA-osoite recipient- ja spl-token -kentistä.
Siirtoja apulaistilien token accounteille ei tueta.
Viite
Useat reference-kentät ovat sallittuja valinnaisina kyselyparametreinä.
Arvojen on oltava base58-koodattuja 32-tavuisia taulukoita. Nämä voivat olla tai
olla olematta julkisia avaimia, käyrällä tai sen ulkopuolella, ja ne voivat
vastata tai olla vastaamatta tilejä Solanassa.
Jos arvot on annettu, lompakon on sisällytettävä ne annetussa järjestyksessä
vain luku -oikeutettuina, ei-allekirjoittavina avaimina
SystemProgram.Transfer- tai
TokenProgram.Transfer/TokenProgram.TransferChecked-käskyyn
maksutapahtumassa. Arvot voivat olla tai olla olematta yksilöllisiä
maksupyynnölle, ja ne voivat vastata tai olla vastaamatta Solanan tiliä.
Koska Solanan validaattorit indeksoivat tapahtumat näiden tiliavainten
perusteella, reference-arvoja voidaan käyttää asiakastunnuksina (tunnuksia,
joita voidaan käyttää ennen varsinaisen maksutapahtuman tuntemista).
getSignaturesForAddress
RPC-menetelmää voidaan käyttää transaktioiden 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 esittävän brändin, myymälän, sovelluksen tai henkilön nimi. Lompakon tulisi URL-purkaa arvo 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 luonteen.
Esimerkiksi tämä voi olla ostettavan tuotteen nimi, tilausnumero tai kiitosviesti. Lompakon tulisi URL-purkaa arvo ja näyttää purettu arvo käyttäjälle.
Muistio
Yksi memo-kenttä on sallittu valinnaisena kyselyparametrina. Arvon on oltava
URL-koodattu
UTF-8-merkkijono, joka on sisällytettävä SPL Memo
-käskyyn maksutapahtumassa.
Lompakon on URL-purettava arvo ja sen tulisi näyttää purettu arvo käyttäjälle. Validaattorit tallentavat muistion, eikä sen tulisi sisältää yksityisiä tai arkaluonteisia tietoja.
Jos kenttä on annettu, lompakon on sisällytettävä MemoProgram-ohje transaktion
toiseksi viimeisenä ohjeena, välittömästi ennen SOL- tai SPL Token
-siirto-ohjetta, jotta vältytään epäselvyyksiltä muiden transaktio-ohjeiden
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 määrä)
solana:mvines9iiHiQTysrwkJjGf2gb9Ex9jXJX8ns3qwf2kN?label=Michael
Määrittely: Transaktiopyyntö
Solana Pay -transaktiopyyntö-URL kuvaa interaktiivisen pyynnön mille tahansa Solana-transaktiolle.
solana:<link>
Pyyntö on interaktiivinen, koska lompakon URL:ssä olevia parametreja käytetään HTTP-pyynnön tekemiseen transaktion muodostamiseksi.
Linkki
Yksi link-kenttä vaaditaan polkuna. Arvon on oltava ehdollisesti
URL-koodattu
absoluuttinen HTTPS-URL.
Jos URL sisältää kyselyparametreja, se on URL-koodattava. Tähän määrittelyyn voidaan lisätä protokollan kyselyparametreja. Arvon URL-koodaus estää ristiriidat protokollan parametrien kanssa.
Jos URL ei sisällä kyselyparametreja, sitä ei tulisi URL-koodata. Tämä tuottaa lyhyemmän URL:n ja vähemmän tiheän QR-koodin.
Kummassakin tapauksessa lompakon on poistettava URL-koodaus arvosta. 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 aikana.
GET-vastaus
Lompakon on käsiteltävä HTTP
asiakasvirheet,
palvelinvirheet
ja
uudelleenohjausvastaukset.
Sovelluksen on vastattava näillä tai HTTP OK JSON-vastauksella, jonka runko
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, liikkeen,
sovelluksen tai henkilön nimi.
<icon>-arvon on oltava kuvakekuvan absoluuttinen HTTP- tai HTTPS-URL.
Tiedoston on oltava SVG-, PNG- tai WebP-kuva, tai lompakon on hylättävä se
virheellisenä.
Lompakon ei tule tallentaa vastausta välimuistiin, ellei HTTP-välimuisti -vastausotsikot toisin määrää.
Lompakon tulee näyttää tunniste ja renderöidä kuvake käyttäjälle.
POST-pyyntö
Lompakon on tehtävä HTTP POST JSON-pyyntö URL-osoitteeseen, jonka runko on:
{ "account": "<account>" }
<account>-arvon on oltava base58-koodattu julkinen avain tilistä, joka voi
allekirjoittaa tapahtuman.
Lompakon tulee tehdä pyyntö Accept-Encoding-otsikolla, ja sovelluksen tulee vastata Content-Encoding-otsikolla HTTP-pakkausta varten.
Lompakon tulee näyttää URL-osoitteen verkkotunnus pyynnön aikana. Jos
GET-pyyntö on tehty, lompakon tulee myös näyttää tunniste ja renderöidä
vastauksesta saatu kuvake.
POST-vastaus
Lompakon on käsiteltävä HTTP
asiakasvirheet,
palvelinvirheet
ja
uudelleenohjausvastaukset.
Sovelluksen on vastattava näillä tai HTTP OK JSON-vastauksella, jonka runko
on:
{ "transaction": "<transaction>" }
<transaction>-arvon on oltava base64-koodattu
sarjallistettu transaktio.
Lompakon on purettava transaktion base64-koodaus ja
deserializoitava se.
Sovellus voi vastata osittain tai kokonaan allekirjoitetulla transaktiolla. Lompakon on validoitava transaktio epä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
recentBlockhashviimeisimmäksi lohkohasiksi tai nolla-arvoksi (new PublicKey(0).toBase58()tai"11111111111111111111111111111111"). - Lompakon on jätettävä huomiotta transaktion
feePayerja asetettavafeePayerpyynnönaccount-arvoksi. - Lompakon on jätettävä huomiotta transaktion
recentBlockhashja asetettavarecentBlockhashviimeisimmäksi lohkohasiksi.
Jos transaktion
signatures
eivät ole tyhjiä:
- Sovelluksen on asetettava
feePayerensimmäisen allekirjoituksen julkiseksi avaimeksi. - Sovelluksen on asetettava
recentBlockhashviimeisimmäksi lohkohasiksi. - Sovelluksen on sarjallistettava ja deserializoitava transaktio ennen sen allekirjoittamista. Tämä varmistaa tilin avainten johdonmukaisen järjestyksen kiertotienä tälle ongelmalle.
- Lompakko ei saa asettaa
feePayereikärecentBlockhash-arvoja. - Lompakon on tarkistettava allekirjoitukset, ja jos jokin niistä on virheellinen, lompakon on hylättävä transaktio virheellisenä.
Lompakon on allekirjoitettava transaktio ainoastaan pyynnön account-arvolla,
ja se saa tehdä sen vain, jos pyynnön account-arvolle odotetaan
allekirjoitusta.
Jos mitä tahansa muuta allekirjoitusta kuin pyynnön account-arvolle odotettua
allekirjoitusta odotetaan, lompakon on hylättävä transaktio haitallisena.
Sovellus voi sisällyttää valinnaisen message-kentän vastauksen runkoon:
{ "message": "<message>", "transaction": "<transaction>" }
<message>-arvon tulee olla UTF-8-merkkijono, joka kuvaa transaktion vastauksen
luonnetta.
Esimerkiksi tämä voi olla ostettavan tuotteen nimi, ostoon sovellettu alennus tai kiitosviesti. Lompakon tulisi näyttää arvo käyttäjälle.
Lompakon ja sovelluksen tulisi sallia lisäkentät pyynnön rungossa ja vastauksen rungossa, jotka voivat tulla tulevan määrittelyn mukaisesti.
Esimerkki
URL, joka kuvaa transaktiopyynnön.
solana:https://example.com/solana-pay
URL, joka kuvaa transaktiopyynnön kyselyparametreilla.
solana:https%3A%2F%2Fexample.com%2Fsolana-pay%3Forder%3D12345
GET-pyyntö
GET /solana-pay?order=12345 HTTP/1.1Host: example.comConnection: closeAccept: application/jsonAccept-Encoding: br, gzip, deflate
GET-vastaus
HTTP/1.1 200 OKConnection: closeContent-Type: application/jsonContent-Length: 62Content-Encoding: gzip{"label":"Michael Vines","icon":"https://example.com/icon.svg"}
POST-pyyntö
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-vastaus
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 määrittelyyn voidaan sisällyttää lisämuotoja ja -kenttiä uusien käyttötapausten mahdollistamiseksi varmistaen samalla yhteensopivuus sovellusten ja lompakoiden kanssa.
Ole hyvä ja avaa Github-issue ehdottaaksesi muutoksia määrittelyyn, jotta saat palautetta sovellus- ja lompakkokehittäjiltä.
Is this page helpful?