Concepts
Le vocabulaire du paiement hors ligne
Dix idées expliquent presque tout dans PayVault. Les montants sont toujours des entiers exprimés dans la plus petite unité de la devise (par exemple le kobo ou le centime), et les horodatages sont en secondes Unix sur le fil.
Allocation (le coffre hors ligne)
Une allocation est un certificat, signé par la clé d'émetteur du partenaire, qui dit : cette clé d'appareil peut dépenser jusqu'à ce montant, dans cette devise, jusqu'à cette date. Il est lié à la clé publique de l'appareil : seul cet appareil peut signer des paiements contre lui.
Il porte une limite par paiement, un nombre maximal de paiements, une date d'émission, une expiration et l'identifiant de la clé d'émetteur qui l'a signé. Son corps de 82 octets est exactement ce que l'émetteur signe (voir la page Protocole).
Le mot coffre désigne l'argent qui le soutient. Avant l'émission du certificat, le partenaire bloque la valeur préfinancée dans son registre. L'appareil ne détient jamais d'argent, seulement un droit signé de dépenser une valeur déjà mise de côté.
Valeur préfinancée et découvert
Le plafond de dépense d'une allocation est le montant préfinancé plus le crédit. La valeur préfinancée est l'argent du titulaire, bloqué à l'avance. Le crédit est une ligne de découvert facultative que le partenaire accorde pour le paiement différé hors ligne.
La dépense puise d'abord dans la part préfinancée. Tout ce qui dépasse est un tirage de crédit, qui devient un prêt après règlement et se rembourse selon les conditions du partenaire. Le commerçant est payé en totalité dans les deux cas.
| Préfinancé | Découvert (crédit) | |
|---|---|---|
| À qui est l'argent | Au titulaire, bloqué avant l'émission | Au partenaire, prêté |
| Utilisé | En premier | Seulement au-delà du montant préfinancé |
| Non dépensé à l'expiration | Rendu au titulaire | Simplement caduc |
| Après règlement | Rien à rembourser | Un prêt avec des frais, dû dans le délai |
Demande de paiement
Le commerçant crée une demande avec son identifiant de commerçant, la devise, le montant, un nonce aléatoire de 8 octets, l'heure et un nom d'affichage de 32 octets au plus, puis l'affiche en code QR.
Le nonce lie le paiement à cette demande. Un paiement signé pour une demande ne peut pas être rejoué contre une autre, et le commerçant peut refuser un nonce déjà utilisé.
Lot de paiement
L'appareil du payeur répond par un lot : le certificat d'allocation plus le paiement signé, 276 octets au total, affiché en code QR. Comme le lot contient le certificat, le commerçant n'a besoin de rien d'autre pour le vérifier que la clé publique de l'émetteur qu'il a mise en cache plus tôt.
Un lot s'authentifie lui-même. N'importe qui peut le transporter, et personne en chemin ne peut le modifier sans casser une signature.
Séquence et chaîne de hachage
Les paiements d'une même allocation sont numérotés 1, 2, 3, etc. Chacun enregistre le total cumulé dépensé et le hachage du paiement précédent. Le paiement 1 pointe vers un hachage de genèse calculé à partir du certificat lui-même.
L'identifiant du paiement est formé des 16 premiers octets du SHA-256 du corps signé. Comme chaque paiement s'engage sur son prédécesseur, l'historique ne peut être ni réordonné ni modifié, et deux paiements différents portant le même numéro de séquence prouvent directement une bifurcation, c'est-à-dire une tentative de double dépense.
Relevé de clôture et retrait anticipé
Un titulaire qui ne veut plus dépenser peut faire signer à son appareil un relevé de clôture : l'identifiant de l'allocation, le dernier numéro de séquence et le cumul auquel il s'est arrêté.
À réception, PayVault rend immédiatement la valeur préfinancée au-delà du total déclaré. Le reste attend l'arrivée de tous les paiements déclarés, puis l'allocation est clôturée. Un paiement au-delà de la séquence déclarée est traité comme une fraude.
Expiration et délai de grâce
Chaque allocation expire au bout d'une durée fixée par le pack pays, par exemple 72 heures. Les commerçants et le serveur tolèrent 5 minutes de décalage d'horloge, car les horloges des téléphones ne sont pas fiables.
Quand le téléphone du titulaire retrouve du réseau après l'expiration, il signe une déclaration de clôture indiquant combien il a dépensé, et le reste est remboursé aussitôt. Un coffre dont le téléphone ne se reconnecte jamais est remboursé 30 jours après l'expiration, car le serveur ne voit pas les paiements encore en attente sur les téléphones. Un paiement qui arrive après ce remboursement est quand même honoré : il est prélevé sur le portefeuille du titulaire quand le registre est hébergé, sinon sur le fonds de risque.
Clés d'émetteur et listes de révocation
Les commerçants vérifient les certificats avec les clés publiques d'émetteur et comparent les identifiants à une liste de révocation. Les deux viennent de l'instantané réseau, GET /api/network, que les appareils mettent en cache dès qu'ils ont du signal.
Une révocation n'est effective qu'une fois le commerçant synchronisé. Elle réduit la fenêtre pour une allocation connue comme frauduleuse sans jamais la fermer, d'où l'importance du plafond. Les révocations restent 30 jours dans le flux.
Synchronisation par coursier
Ce n'est pas forcément le commerçant qui envoie les paiements. Le payeur, le commerçant, un coursier ou un agent dont le téléphone a du signal peut envoyer n'importe quel lot, et le serveur enregistre son mode d'arrivée (merchant, payer, courier ou api).
L'envoi est idempotent par identifiant de paiement, et une requête porte jusqu'à 500 lots. Envoyer deux fois le même lot est sans danger.
Garantie et fonds de risque
Tout paiement ayant passé les contrôles qu'un commerçant peut faire hors ligne est honoré envers le commerçant. Quand le serveur règle un paiement, il répartit le montant dans un ordre fixe : valeur préfinancée, puis découvert, puis recouvrement sur le portefeuille du titulaire, et seulement ensuite le fonds de risque.
Le fonds de risque absorbe ce que la valeur et le crédit du titulaire n'ont pas pu couvrir, ce qui n'arrive que si le titulaire a dépensé deux fois. La perte est bornée par le plafond de l'allocation, le compte est gelé et l'allocation révoquée. Le financement et le dimensionnement du fonds relèvent d'une décision commerciale entre PayVault et le partenaire.