Documentation

Référence de l’API RPC

L’interface HTTP qu’un nœud sert aux portefeuilles§: quatre points d’accès, du JSON pour l’état et les erreurs, un encodage binaire compact pour les blocs et les paiements.

Réseau de test§: les pièces n’ont aucune valeur

L’URL de base du nœud de test public est https://node.tint.top. L’interface ne voit jamais une clé ni un montant§: un portefeuille envoie des paiements terminés et lit des blocs entiers, qu’il déchiffre lui-même.

Points d’accès

Méthode et cheminRépond avec
GET /v1/statusL’état de la chaîne, en JSON.
GET /v1/blocks/{height}Un bloc finalisé, dans l’encodage de transmission.
GET /v1/blocks?from=NLes blocs contenant des paiements à partir de la hauteur N, sous forme de lot de blocs.
POST /v1/transactionsReçoit un paiement dans l’encodage de transmission§; répond avec son identifiant en JSON.

GET /v1/status

request
curl -s https://node.tint.top/v1/status
response (example values)
{
  "chain_id": 6073471695170043905,
  "height": 128431,
  "tip": "9f3c…e21a",
  "genesis": "04b7…c9d0",
  "queued": 0,
  "pools": [
    { "asset": 1, "native": 20000000000000, "other": 10000000000000, "fee_bps": 30 }
  ]
}
ChampSignification
chain_idIdentifiant du réseau, intégré à chaque signature et à chaque hachage de bloc.
heightHauteur du dernier bloc finalisé.
tipHachage du dernier bloc finalisé, en hexadécimal.
genesisHachage du premier bloc, en hexadécimal. Deux réseaux de test peuvent partager un chain_id§; ce champ permet de les distinguer.
queuedPaiements en attente d’un bloc.
pools[].assetLa pièce que le pool échange contre la pièce native (1 correspond à TUSD).
pools[].native, pools[].otherCe que contient le pool, en unités (1 pièce = 100,000,000 unités), à la date du dernier bloc finalisé.
pools[].fee_bpsLes frais du pool en dix-millièmes§; 30 correspond à 0.3 %.

GET /v1/blocks/{height}

Renvoie un bloc finalisé en application/octet-stream. Un bloc finalisé ne change jamais, donc la réponse porte Cache-Control: public, max-age=31536000, immutable. Une hauteur non numérique renvoie invalid_height, une hauteur inconnue not_found.

GET /v1/blocks?from=N

Renvoie les blocs qui contiennent des paiements à partir de la hauteur N, sous forme d’un seul lot de blocs (application/octet-stream), avec la dernière hauteur prise en compte par la réponse (through). Un portefeuille qui se met à jour redemande à partir de la hauteur suivant through. La réponse grossit avec la chaîne, elle est donc envoyée avec Cache-Control: no-store. from doit être un nombre entier.

POST /v1/transactions

Envoyez un paiement terminé, dans l’encodage de transmission, comme corps de la requête. Le portefeuille le construit§; le format est défini dans le module wire.rs de tint-core§: champs de largeur fixe, un seul encodage valide par valeur, aucun octet en trop à la fin.

request
curl -s -X POST https://node.tint.top/v1/transactions \
  -H 'content-type: application/octet-stream' \
  --data-binary @payment.bin
response
{ "txid": "5be1…07af" }

Une transaction commence par l’actif (u32), une hauteur d’expiration (u64) et un type (0 pour un paiement, 1 pour un échange), suivis d’un lot§: des drapeaux, un solde de valeur, une ancre, le nombre d’actions et les actions avec leur preuve. Un échange ajoute la pièce achetée, le montant versé et un second lot.

Erreurs

Les erreurs sont en JSON§: {"error":{"code":"...","message":"..."}}.

HTTPcodeSignification
400malformedLe corps n’est pas un paiement.
400invalid_heightLa hauteur ou from n’est pas un nombre entier.
404not_foundAucun bloc finalisé à cette hauteur, ou ressource inexistante.
409double_spendUne note de ce paiement est déjà dépensée.
409conflictUn autre paiement en attente dépense l’une des mêmes notes.
409price_movedLe pool ne donne plus ce que demande cet échange.
413too_largeLe paiement dépasse ce que la chaîne autorise.
422rejectedLe paiement enfreint une règle de la chaîne§; le message précise laquelle.
429rate_limitedCette adresse cliente a épuisé son quota de requêtes. Réessayez après le délai de l’en-tête Retry-After.
500internalLe nœud n’a pas pu vérifier ou encoder.
503busy, queue_fullLe nœud vérifie d’autres paiements, ou sa file est pleine. Réessayez§; Retry-After: 1.

Limites de débit

Par défaut, chaque adresse cliente peut effectuer 50 requêtes par seconde en continu, avec une rafale de 100, et au plus 4 paiements sont vérifiés à la fois pour l’ensemble des clients. Les opérateurs peuvent modifier ces deux valeurs. Derrière un proxy inverse, le nœud compte les clients d’après la dernière adresse que le proxy a écrite dans X-Forwarded-For§; il ne croit pas les entrées précédentes.

Exemple§: suivre la chaîne

python (server side)
import json, time, urllib.request

BASE = "https://node.tint.top"

while True:
    with urllib.request.urlopen(f"{BASE}/v1/status", timeout=10) as r:
        status = json.load(r)
    print(status["height"], status["queued"])
    time.sleep(5)

Ce qu’un opérateur de nœud peut encore apprendre de cette interface, c’est l’adresse réseau d’où provient un paiement. Les montants, les expéditeurs et les destinataires sont à l’intérieur de la preuve et des notes chiffrées.