NXTER MAGAZINE

Programmation de la Blockchain Nxt pour le plaisir et le profit

Les Blockchains peuvent être utiles dans diverses applications, en faisant face à l’audience mondiale et en soutenant l’infrastructure interne d’une entreprise. Une chaîne de blocs est une base de données distribuée, une copie de la chaîne de blocs est stockée sur chaque noeud dans un réseau pair à pair. Cette redondance extrême peut être considérée comme inefficace, mais s’il vous plaît rester avec moi pour quelques minutes de la théorie des blocs de chaîne.

Comme chaque nœud valide toutes les transactions enregistrées dans la chaîne de blocs et que les transactions passées ne peuvent pas être annulées ou falsifiées comme dans un  »RDBMS » traditionnel, cette redondance rend le bloc-chaîne * immuable *, et c’est une proposition de valeur très importante de chaîne de blocs. L’immutabilité des données est quelque chose que les bases de données traditionnelles ne peuvent pas fournir. Vous pouvez ou ne pas avoir besoin d’immutabilité des données et de la confiance sans confirmation que les données n’ont pas été modifiées.

Dans ce tutoriel je suppose que vous avez besoin de ceci;

L’une des blockchains les plus polyvalentes et flexibles est la Nxt Blockchain (https://nxt.org). Il a plus d’une centaine d’appels API https://nxtwiki.org/wiki/The_Nxt_API

Aujourd’hui, vous apprendrez les bases de la programmation de la chaîne de blocs Nxt. Je n’utiliserai que deux appels API dans ce didacticiel. Avec plus d’une centaine d’appels API, les possibilités pour les programmeurs sont illimitées.

Logique d’Application

Un client d’une entreprise ou un employé d’une organisation télécharge un fichier via un formulaire Web.
Le fichier est renommé en un nom unique et est enregistré dans un emplacement quelconque sur le serveur.

Un an plus tard, le client / employé doit vérifier, à l’aide de de la chaîne de blocs Nxt, que le fichier n’a pas été modifié. Par exemple, cela peut être requis à des fins légales. Il n’a pas besoin d’être des fichiers. Les mémoires d’entreprise internes peuvent être hachés et stockés dans la base de données, pour être vérifiés lors d’une vérification ultérieure.

Nxt nous permet d’envoyer et d’enregistrer des messages arbitraires (AM) dans sa chaîne de blocs.

Chaque transaction sur la chaîne de blocs est payante. Si la taille de la transaction est importante, elle peut être coûteuse; Heureusement Nxt a un sous-type de AM appelé messages pouvant être supprimés. Ceux-ci sont taillés après 90 jours qui les rendent bon marché, ils sont disponibles pour la récupération des noeuds d’archives après 90 jours.

La taille maximale d’un message arbitraire dans la chaîne de blocs  Nxt est d’environ 42 Ko, la taille d’un bloc. Un message pouvant être supprimé de 1 KB coûte 1 NXT (0,03 $). 1 Ko est suffisant pour stocker un hachage d’un fichier et c’est notre coût final pour enregistrer de façon permanente un hachage dans le bloc distribué immuable Nxt.

Lorsque le client télécharge un fichier, je crée un hachage SHA256 du fichier et stocke le hachage dans la base de données du serveur de l’organisation. Pour simplifier j’ai choisi SQlite, mais vous pouvez utiliser Mysql, Postgresql, Oracle. Je vais utiliser PDO pour accéder à la base de données SQlite en PHP.

Lorsque nous n’utilisons pas la base de données immuable (blockchain), le fichier peut être modifié, le nouveau hash du fichier modifié enregistré dans la base de données, ce qui rend difficile de prouver que le fichier était comme ça depuis le début.

La chaîne de blocs vient à la rescousse

Chaque message pouvant être supprimé peut être récupéré à partir des noeuds d’archivage. Chaque enregistrement dans la chaîne de blocs est immuable. Vous pouvez être sûr que le hachage du fichier que vous avez téléchargé il ya un an, quand il est extrait de la chaîne de blocs, est le même hachage. Tout ce que vous avez besoin maintenant est de le comparer avec le hachage dans le RDBMS interne de l’organisation.

Conditions préalables:
PHP avec curl, json et certaines extensions db (j’utilise sqlite3). Un serveur web est facultatif, vous pouvez utiliser php-cli. Java 8 (Oracle ou OpenJDK pour exécuter Nxt). Logiciel de référence Nxt: https://nxtforum.org/nrs-releases/nrs-v1-10-1/.

Installez le NRS (logiciel de référence Nxt (en fonction du contexte indistinctement appelé Nxt Client ou Nxt Server)) et créez un compte. Financer le avec quelques pièces de monnaie. Vous pouvez échanger des Bitcoin vers NXT à un service d’échange comme https://shapeshift.io ou échanger avec quelqu’un sur https://nxtforum.org. Il est également possible de « détruire » certains NXT gratuits comme récompense pour l’exécution d’un nœud; Http://nxter.org/the-forging-bounty-lottery-campaign-will-pay-5-million-in-rewards-to-forgers-and-nxt-nodes/ 
Tout d’abord, nous créons une table de base de données simple pour notre application, rien de fantaisiste, vous pouvez ajouter d’autres types de colonnes si vous devez stocker plus d’informations. J’aime utiliser DB Browser pour SQLite de http://sqlitebrowser.org.
Faisons une base de données vide ‘files.db’ et l’enregistrons dans /home/lurker10/phptutorial/files.db
À l’aide de DB Browser pour SQLite, créez le tableau suivant.
CREATE TABLE "files" (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`txid` TEXT,
`hash` TEXT,
`uploadtime` TEXT,
`filename` TEXT
)

‘Txid’ est le champ pour stocker l’id d’une transaction que nous recevons des Nxt lorsque la transaction est acceptée. Il est unique. ‘Hash’ est le sha256 hash du fichier.

Dans ce didacticiel je saute la partie de téléchargement de fichier du code pour la garder concise.

Supposons que le fichier est déjà téléchargé et stocké sur le serveur Web. Nous définissons la variable d’emplacement du fichier dans le code.

$uploadDir = "/home/lurker10/phptutorial/tmp/";
$fileName = "copy12345.tar"; 

Par défaut, le serveur Nxt écoute les demandes d’API sur le port 7876. Si vous l’exécutez sur la même machine que votre code php, votre code doit envoyer des requêtes à http://127.0.0.1:7876/nxt

Les autres variables importantes sont la phrase de passe du compte Nxt que vous avez créé et financé et le compte du destinataire.

Vous pouvez envoyer le message à vous-même, le destinataire peut être votre propre compte.

$host = "http://127.0.0.1:7876/nxt";
$secretPhrase = "your passphrase";
$recipientID = "NXT-XXXX-XXXX-XXXX-XXXXX";

La partie suivante du code est la fonction qui soumet une requête en utilisant curl dans une requête POST.

Pour effectuer une requête, nous devons définir les variables $payload et $payload_string et les envoyer à sendRequest(). Il est possible d’exécuter le Nxt Server via HTTPS et d’utiliser une boucle pour vérifier le certificat SSL, mais pour cette application simple, nous avons désactivé la vérification SSL dans la connexion en boucle.

Un autre point d’intérêt est le $errorDescription, json-decoded à partir de la réponse du serveur.

S’il ya un problème avec la requête ( « Pas assez de fonds » dans votre compte lorsque votre solde est zéro),
Vous devez ajouter une routine de gestion des erreurs. Je l’omet aussi. Pour cette application, je suppose que le serveur a répondu correctement et renvoyer la réponse dans l’application pour un traitement ultérieur.

function sendRequest($host, $payload, $payload_string) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 10000);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10000);
curl_setopt($ch, CURLOPT_POST, count($payload));
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload_string);
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);
$errorDescription = trim(@json_decode($output)->errorDescription);
if ($errorDescription != "") { // perform error handling; return false; }
return $output;
}

Comme le fichier est déjà téléchargé, je crée un hachage sha256 du fichier et de l’horodatage.

$fileHash = hash_file("sha256", $uploadDir.$fileName);
$txTime = time();

Je vais utiliser PDO pour travailler avec la base de données.

Ouvrez le DB et insérez un nouvel enregistrement.

Nous ne savons pas le txid jusqu’à ce que nous parlons au serveur Nxt qui peut nous le donner quand la transaction est acceptée sur le réseau NXT, donc pour l’instant, je vais insérer null pour le txid.

$pdo = new PDO('sqlite:/home/lurker10/phptutorial/files.db');
$sql = "INSERT INTO files (txid, hash, uploadtime, filename)
VALUES (null, '$fileHash', '$txTime', '$fileName')";
$result = $pdo->exec($sql);

Ensuite, nous créons une requête à envoyer au serveur NXT.

Cette requête particulière est « sendMessage », vous pouvez trouver beaucoup plus de requêtes pour interagir avec la blockchain et leurs paramètres obligatoires et facultatifs à https://nxtwiki.org/wiki/The_Nxt_API.

Comme je l’ai dit plus tôt, les frais de transaction sont de 1 NXT. 1 NXT = 100 000 000 NQT (nanoquants).
1 NQT est la plus petite unité de dénomination en NXT identique à 1 satoshi en Bitcoin.
Le Nxt Server accepte les frais en NQT, nous payons donc exactement 100 millions de NQT (0,03 $)

Le paramètre « broadcast » peut être changé en false, dans ce cas, vous recevrez ‘transactionBytes’ dans la réponse, qui peut être diffusée sur le réseau plus tard en utilisant la requête ‘broadcastTransaction’. Mais aujourd’hui, je l’ai mis à «vrai» pour diffuser la transaction instantanément.

N’oubliez pas d’urlencode() le message. J’insère le nom de fichier séparé du hachage avec un deux-points dans le message.

$payload = array(
"requestType" => "sendMessage",
"recipient" => $recipientID,
"secretPhrase" => urlencode($secretPhrase),
"feeNQT" => 100000000,
"deadline" => 1440,
"broadcast" => "true",
"message" => urlencode($fileName . ":" . $fileHash),
"messageIsPrunable" => "true"
);
$payload_string = "";
foreach ($payload as $key => $value) {
$payload_string .= $key . "=" . $value . "&";
}
rtrim($payload_string, "&");

Envoyez la requête au serveur NXT en utilisant la fonction sendRequest ():

$output = sendRequest($host, $payload, $payload_string);

Et décoder la réponse JSON du serveur pour obtenir l’id de transaction:

if ($output != false) {
$txId = json_decode($output)->transaction;
}

Maintenant qu’il ya une réponse positive sur la transaction acceptée et que son ID est connu, mettons à jour l’enregistrement dans le db interne.

$lastId = $pdo->lastInsertId();
$sql = "UPDATE files SET txid = '$txId' where id = '$lastId'";
$result = $pdo->exec($sql);

Nous pouvons éventuellement fournir ces liens au client pour des références futures et pour prouver que le hash a été téléchargé:

echo "NXT Transaction ID: " . $txId . ",
JSON response";
echo "

Utilisez ces liens pour vérifier le hash Sha256 de votre fichier enregistré dans notre base de données interne contre l’enregistrement permanent dans le bloc block NXT:

" . $fileHash;

En option, envoyez un e-mail au client, le $txId, qui pourra ensuite être utilisé pour vérifier le hachage ou, autrement, leur donner des informations de base sur la récupération du hachage à partir du db interne et le comparer au hachage stocké par la blockchain à l’avenir, par horodatage ou avec d’autres critères.

Cette application n’inclut pas l’authentification des utilisateurs. Normalement, le client ou l’utilisateur d’un service intranet pourrait voir ses fichiers après s’être authentifié sur le site.

Cette application suppose également que l’application de vérification est hors de portée du responsable de la base de données interne pour éviter de falsifier les résultats de la vérification.

Maintenant, l’enregistrement est enregistré dans la base de données de l’entreprise. Afficher l’enregistrement db pour confirmer qu’il est là.

$sth = $pdo->prepare("SELECT id, txid, hash, uploadtime, filename FROM files ORDER BY id DESC");
$sth->execute();
$result = $sth->fetch(PDO::FETCH_OBJ);
if ($result != false) {
var_dump($result);
}

L’Application de Vérification

Pour utiliser l’application de vérification de hachage, le client doit avoir l’ID de transaction dans la chaîne de blocs NXT
Transmis à la Nxt Blockchain.

Supposons que le client ne l’a, enregistré dans l’archive de courrier ou récupéré par d’autres moyens.

$txId = "111111111111111111";


Voyons ce que notre base de données interne a pour le hash du fichier. Fetch et l’enregistrer dans $ hashInDb.

$pdo = new PDO('sqlite:/home/lurker10/phptutorial/files.db');
$sth = $pdo->prepare("SELECT hash FROM files where txid = '$txId'");
$sth->execute();
$result = $sth->fetch(PDO::FETCH_OBJ);
if ($result != false) {
$hashInDb = $result->hash;
}

Envoyer une requête au serveur NXT et extraire toutes les informations stockées dans le bloc NXT pour la transaction avec l’ID donné.

$payload = array (
"requestType" => "getTransaction",
"transaction" => $txId
);
$payload_string = "";
foreach ($payload as $key => $value) {
$payload_string .= $key . "=" . $value . "&";
}
rtrim($payload_string, "&");

$output = sendRequest($host, $payload, $payload_string);

Décoder la réponse JSON et extraire le champ de la pièce jointe où le hachage est stocké.

Dans la première partie de l’application, nous avons enregistré le nom de fichier séparé du hachage avec un deux-points.
Maintenant, nous extrayons simplement la partie de hachage du message arbitraire.

$attachmentPlainData = json_decode($output)->attachment->message;
$hashInBlockchain = explode(":", $attachmentPlainData)[1];

Et comparer ce que nous avons dans la base de données de l’entreprise avec ce qui a été enregistré il ya un an dans la chaîne de blocs Nxt.

if ($hashInDb == $hashInBlockchain)
echo "Hashes are identical";
else
echo "Hashes are not identical";

NXT-crypto-developer

 

View this in: English Русский Español

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.