Το Machine Payments Protocol (MPP) εφαρμόζει τη σημασιολογία πιστοποίησης ταυτότητας του HTTP στις πληρωμές. Ο διακομιστής απαντά με μια πρόκληση (challenge) σε ένα απλήρωτο αίτημα, ο πελάτης επιστρέφει ένα διαπιστευτήριο πληρωμής και ο διακομιστής επιστρέφει μια απόδειξη αφού αποδεχθεί την πληρωμή.
Το MPP διαχωρίζει τρία ζητήματα:
- Ένα intent (πρόθεση) περιγράφει την εμπορική αλληλεπίδραση, όπως μια εφάπαξ
chargeή μιαsessionμε μέτρηση χρήσης. - Μια μέθοδος πληρωμής περιγράφει τον τρόπο μεταφοράς της αξίας. Η μέθοδος του Solana υποστηρίζει το εγγενές SOL και τα SPL tokens για χρεώσεις.
- Ένα transport HTTP μεταφέρει τις προκλήσεις, τα διαπιστευτήρια, τις αποδείξεις και τα σφάλματα.
Το MPP δημοσιεύεται ως σύνολο Internet-Drafts. Αντιμετωπίστε τις τρέχουσες προδιαγραφές ως την πηγή αλήθειας και αναμένετε ότι οι λεπτομέρειες θα εξελιχθούν όσο τα προσχέδια βρίσκονται υπό επεξεργασία.
Ανταλλαγή HTTP
Το MPP χρησιμοποιεί τα τυπικά πεδία πιστοποίησης ταυτότητας του HTTP αντί για κεφαλίδες πληρωμής ειδικές για το πρωτόκολλο:
| Μήνυμα | Αναπαράσταση HTTP |
|---|---|
| Πρόκληση πληρωμής | 402 Payment Required με WWW-Authenticate: Payment ... |
| Διαπιστευτήριο πληρωμής | Επανάληψη του αιτήματος με Authorization: Payment ... |
| Επιτυχής απόδειξη | Απόκριση πόρου με Payment-Receipt: ... |
| Μη έγκυρα στοιχεία πληρωμής | Σώμα Problem Details με χρήση του application/problem+json |
Μια πρόκληση περιλαμβάνει αναγνωριστικό που δημιουργείται από τον διακομιστή, realm, μέθοδο, intent, κωδικοποιημένο αίτημα πληρωμής και λήξη. Το διαπιστευτήριο επαναλαμβάνει την πρόκληση και προσθέτει την απόδειξη πληρωμής που αφορά τη συγκεκριμένη μέθοδο. Ο διακομιστής πρέπει να επαληθεύσει και τα δύο στοιχεία· μια έγκυρη μεταφορά που ανήκει σε διαφορετική πρόκληση δεν πρέπει να ξεκλειδώνει τον πόρο.
Εφάπαξ χρεώσεις στο Solana
Το intent charge του Solana υποστηρίζει δύο τύπους διαπιστευτηρίων:
- Η λειτουργία Pull χρησιμοποιεί μια υπογεγραμμένη συναλλαγή. Ο πελάτης υπογράφει τη μεταφορά και στέλνει τη συναλλαγή στον διακομιστή. Ο διακομιστής την επαληθεύει, προαιρετικά προσθέτει υπογραφή του πληρωτή τελών (fee payer), τη μεταδίδει στο δίκτυο, την επιβεβαιώνει και επιστρέφει την υπογραφή της συναλλαγής στην απόδειξή του.
- Η λειτουργία Push χρησιμοποιεί την υπογραφή μιας συναλλαγής. Ο πελάτης πρώτα μεταδίδει τη συναλλαγή και μετά στέλνει την επιβεβαιωμένη υπογραφή στον διακομιστή. Ο διακομιστής ανακτά και επαληθεύει τη συναλλαγή πριν επιστρέψει τον πόρο.
Η λειτουργία Pull επιτρέπει την κάλυψη των τελών συναλλαγής από τον διακομιστή και λογική επανάληψης από την πλευρά του διακομιστή. Η λειτουργία Push είναι χρήσιμη όταν ένα πορτοφόλι απαιτεί από τον πελάτη να υποβάλει τη δική του συναλλαγή, αλλά δεν μπορεί να χρησιμοποιήσει την κάλυψη τελών από τον διακομιστή.
Για τα κανονιστικά πεδία και τους κανόνες επαλήθευσης, δείτε την προδιαγραφή χρέωσης (charge) του Solana.
Προσθήκη χρέωσης MPP σε ένα API Express
Το Solana Pay Kit παρέχει μια τρέχουσα ενσωμάτωση TypeScript για το MPP και το x402. Εγκαταστήστε το μαζί με το Express:
pnpm add @solana/pay-kit @solana/kit@^6.9.0 expresspnpm add --save-dev @types/express tsx
Αυτό το απλούστερο παράδειγμα χρησιμοποιεί το φιλοξενούμενο sandbox του Surfpool και τον δημόσιο παραλήπτη επίδειξης του πακέτου. Προορίζεται μόνο για τοπική ανάπτυξη:
import express from "express";import { createPayKit, usd } from "@solana/pay-kit";const pay = await createPayKit({accept: ["mpp"],rpcUrl: "https://402.surfnet.dev:8899"});const app = express();app.get("/report", pay.express(usd("0.01")), (_req, res) => {res.json({ report: "Paid report" });});app.listen(4567, () => {console.log("Paid API listening on http://127.0.0.1:4567");});
Εκτελέστε το και συγκρίνετε ένα απλήρωτο αίτημα με ένα αίτημα που υποστηρίζει πληρωμές:
pnpm tsx server.tscurl -i http://127.0.0.1:4567/reportpay --sandbox curl http://127.0.0.1:4567/report
Ο χειριστής της διαδρομής εκτελείται μόνο αφού το middleware αποδεχθεί την πληρωμή.
Αντικαταστήστε κάθε προεπιλογή του sandbox στην παραγωγή
Ρυθμίστε ρητά δίκτυο, παραλήπτη εμπόρου, αποκλειστικό RPC, σταθερό μυστικό δέσμευσης πρόκλησης, υπογράφοντα παραγωγής και ανθεκτικό αποθηκευτικό χώρο αποτροπής επανάληψης (replay). Μην κατευθύνετε ποτέ πραγματικές πληρωμές σε υπογράφοντα επίδειξης ενός πακέτου.
Συνεδρίες με μέτρηση χρήσης
Χρησιμοποιήστε μια session του Solana MPP όταν ένας πελάτης θα πραγματοποιεί πολλές μικρές, συσχετιζόμενες πληρωμές.
Μια session ανοίγει ένα onchain κανάλι πληρωμών με μέγιστη κατάθεση και στη συνέχεια χρησιμοποιεί
συσσωρευτικά υπογεγραμμένα vouchers καθώς αυξάνεται η χρήση. Ο διακομιστής μπορεί να επαληθεύει τα vouchers
offchain και να διακανονίσει αργότερα το υψηλότερο αποδεκτό ποσό.
Αυτό είναι χρήσιμο για inference με μέτρηση ανά token, λήψεις με μέτρηση ανά byte, δεδομένα σε πραγματικό χρόνο και επαναλαμβανόμενες κλήσεις εργαλείων. Δεν ισοδυναμεί με την αποστολή ξεχωριστής onchain πληρωμής για κάθε συμβάν.
Αποκαλέστε τη session πληρωμή session, κανάλι πληρωμών ή επαναλαμβανόμενη εξουσιοδότηση με ανώτατο όριο. Αποκαλέστε την πληρωμή ροής (streamed payment) μόνο όταν η υπηρεσία και η σύμβαση πληρωμής μετρούν πράγματι μια ροή χρήσης.
Επαλήθευση στην παραγωγή
Για κάθε χρέωση στο Solana, ο διακομιστής πρέπει να επαληθεύει τουλάχιστον ότι:
- Η πρόκληση είναι αυθεντική, δεν έχει λήξει, είναι δεσμευμένη σε αυτό το αίτημα και προορίζεται για αυτό το realm.
- Η συναλλαγή χρησιμοποιεί το αναμενόμενο δίκτυο, στοιχείο ενεργητικού ή mint, παραλήπτη, ποσό και token program.
- Τυχόν εντολές πληρωτή τελών ή associated token account επιτρέπονται ρητά και δεν μπορούν να αδειάσουν τον υπογράφοντα του διακομιστή.
- Η συναλλαγή ολοκληρώθηκε επιτυχώς στο απαιτούμενο επίπεδο commitment.
- Η υπογραφή της συναλλαγής δεν έχει ήδη καταναλωθεί.
- Ο έλεγχος επανάληψης και η λειτουργία κατανάλωσης είναι ατομικές σε όλες τις παρουσίες του διακομιστή.
Για τις sessions, αποθηκεύστε επίσης σε κοινόχρηστο αποθηκευτικό χώρο την κατάσταση του καναλιού, το αποδεκτό συσσωρευτικό ποσό και το όριο διακανονισμού (settlement watermark). Τεκμηριώστε πώς οι πελάτες ανακτούν τα αχρησιμοποίητα κεφάλαια εάν ο διακομιστής καταστεί μη διαθέσιμος.
Σχετικοί πόροι
Is this page helpful?