NXTER.ORG

Programando en la Blockchain de Nxt por diversión y para obtener ganancias

Las cadenas de bloques o blockchains son útiles para múltiples aplicaciones, permitiendo llegar a una audiencia global y reforzando la infraestructura interna de una compañía. Una blockchain es una base de datos distribuida, dónde una copia de esta cadena de bloques está almacenada en cada uno de los nodos de una red entre pares (red peer-to-peer o p2p). Esta redundancia extrema podría ser considerada ineficiente pero, por favor, déjame que te explique brevemente un poco de teoría sobre las blockchains.

Puesto que cada nodo valida todas las transacciones almacenadas en la blockchain y dado que las transacciones pasadas no pueden ser deshechas ni alteradas como sucede en los tradicionales Sistemas de Gestión de Bases de Datos Relacionales (RDBMS por sus siglas en inglés), esta redundancia convierte a la blockchain en «inmutable», siendo este uno de los grandes valores de las cadenas de bloques. La inmutabilidad de la información es algo que las bases de datos tradicionales no pueden proporcionar. Puede que necesites, o no, esta inmutabilidad de los datos, así como una una confirmación, sin tener que confiar en terceros, de que los datos no han sido alterados.

En este tutorial presupongo que esto es lo que necesitas.

Una de las cadenas de bloques más versátiles y flexibles es la blockchain de Nxt (https://nxt.org). Cuenta con más de un centenar de llamadas API https://nxtwiki.org/wiki/The_Nxt_API.

En esta ocasión te voy a mostrarlos conceptos básicos para programas en la blockchain de Nxt. Sólo voy a usar dos llamadas API en este tutorial. Dado que existen más de un centenar de llamadas API posibles, las oportunidades para los programadores no tienen límite.

Lógica de aplicación

Un cliente de una compañía o un empleado de una organización sube un archivo a través de un formulario web.

El archivo es renombrado para dotarlo de un nombre único y es almacenado en algún lugar del servidor.

Un año más tarde el cliente / empleado necesita verificar, usando la blockchain de Nxt, que el archivo no ha sido alterado. Por ejemplo, esto puede ser necesario por motivos legales. No tiene porque ser sólamente archivos. A los memorandos internos de la compañía se les puede aplicar un algoritmo hash y ser incorporados a la base de datos, para poder ser verificados en una futura auditoría.

Nxt nos permite enviar y almacenar mensajes arbitrarios (M.A.) en su cadena de bloques.

Cada transacción en la blockchain acarrea una tasa o fee. Si el tamaño de la transacción es grande, podría ser caro. Afortunadamente Nxt tiene un subtipo de M.A. llamado mensaje podable. Estos mensajes son «podados» o eliminados pasados 90 días, lo que los hace más baratos. También sería posible recuperar estos mensajes pasados 90 días a partir de los Nodos de Archivo.

El tamaño máximo de un mensaje arbitrario en la blockchain de Nxt es de aproximadamente 42Kb, el tamaño de un bloque. Un mensaje podable de 1KB cuesta 1 NXT (0,03$). 1KB es suficiente para almacenar el hash de un archivo y este será nuestro coste final para almacenar permanentemente un hash en la inmutable y distribuida cadena de bloques de Nxt.

Tan pronto cómo el cliente sube el archivo yo creo un hash del tipo SHA256 del archivo y lo almaceno este hash en la base de datos del servidor de la organización. Por sencillez yo he elegido SQlite, pero puedes usar Mysql, Postgresql, Oracle. Usaré la extensión Objetos de Datos de PHP (PDO por sus siglas en inglés) para acceder a la base de datos SQlite en PHP.

Cuando no utilizamos la base de datos inmutable (blockchain), el archivo puede ser modificado, almacenarse en la base de datos el nuevo hash del archivo modificado, haciendo difícil demostrar que el archivo era el mismo que en un principio.

La blockchain viene al rescate

Cada mensaje podable se puede recuperar desde los nodos de archivo. Cada registro de la blockchain es inmutable. Puedes estar seguro de que el hash del archivo que subiste hace un año será el mismo cuando lo descargues de la cadena de bloques. Todo lo que necesitas hacer es compararlo con el hash del RBDMS interno de la organización.

Prerrequisitos:

PHP con curl, json y algún tipo de extensión de la base de datos (yo uso sqlite3). Un servidor web es opcional, puedes utilizar php-cli. Java 8 (Oracle o OpenJDK para ejecutar Nxt). Software de Referencia Nxt: https://nxtforum.org/nrs-releases/nrs-v1-10-1/.

Instala el Software de Referencia Nxt (NRS por sus siglas en inglés. Dependiendo del contexto se le llama indistintamente Cliente Nxt o Servidor Nxt) y crea una cuenta. Dótala con unas pocas monedas. Puedes intercambiar Bitcoin por Nxt en un servicio de exchange como https://shapeshift.io o intercámbialas directamente con otros usuarios en https://nxtforum.org. También es posible «minar» algunos NXT gratis como recompensa por tener un nodo: http://test.nxter.org/the-forging-bounty-lottery-campaign-will-pay-5-million-in-rewards-to-forgers-and-nxt-nodes/.

Primero creamos una base de datos sencilla para nuestra aplicación, nada extraordinario, si necesitas almacenar más información puedes añadir más columnas. A mí me gusta utilizar el navegador de bases de datos (DB browser) para SQLite de http://sqlitebrowser.org.

Vamos a crear una base de datos vacía llamada ‘files.db’ y la guardamos en /home/lurker10/phptutorial/files.db

Usando el DB browser para SQLite crea la siguiente tabla:

CREATE TABLE "files" (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`txid` TEXT,
`hash` TEXT,
`uploadtime` TEXT,
`filename` TEXT
)

‘txid’ es el campo para almacenar el id de la transacción que recibimos de Nxt cuando la transacción es aceptada. Es único. ‘hash’ es el hash sha256 del archivo.

En este tutorial me voy a saltar la parte del código de subida de archivos para hacerlo más breve.

Vamos a suponer que el archivo ya ha sido subido y almacenado en el servidor web. Definimos la variable para la ubicación del archivo en el código:

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

Por defecto, el servidor Nxt recibe las solicitudes API en el puerto 7876. Si lo estás ejecutando en la misma máquina que tu código php, tu código debe enviar solicitudes a http://127.0.0.1:7876/nxt

Las otras variables importantes son la contraseña de la cuenta de Nxt que has creado y dotado de fondos previamente, así como la cuenta del receptor.

Puedes enviarte un mensaje a ti mismo, puesto que el receptor puede ser tu misma cuenta.

$host = "http://127.0.0.1:7876/nxt";
$secretPhrase = "tu contraseña";
$recipientID = "NXT-XXXX-XXXX-XXXX-XXXXX";

La siguiente parte del código es la función que envía la consulta usando curl en una solicitud POST.

Para hacer una solicitud debemos definir las variables $payload y $payload_string y después alimentarlas para sendRequest(). Es posible ejecutar el Nxt Server sobre HTTPS y usar curl para verificar el certificado SSL, pero para hacer esta app más sencilla hemos desactivado la verificación SSL en la conexión curl.

Otro punto de interés es la descripción de $error, con descodificado json desde la respuesta del servidor.

Si hay un problema con la solicitud («No hay fondos suficientes» en tu cuenta cuando el saldo es cero), tienes que añadir una rutina para el manejo de los errores. Voy a omitir esto también. Para esta app asumo que el servidor responde como corresponde, y devuelve la respuesta a la aplicación para su posterior procesado.

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;
}

Puesto que este archivo ya ha sido subido, creo un hash a sha256 del archivo y su marca de tiempo (timestamp):

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

Usaré PDO para trabajar con la base de datos.

Abre la base de datos e inserta una nueva entrada.

No sabemos el txid (identificador de transacción) hasta que hablamos con el servidor Nxt, que nos lo puede dar cuando la transacción ha sido aceptada en la red Nxt, así que por el momento insertar null para el 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);

A continuación una solicitud para el envío al servidor Nxt.

Esta solicitud en particular es «sendMessage». Puedes encontrar muchas más solicitudes con las que interactuar con la blockchain y sus parámetros obligatorios y opcionales en:

https://nxtwiki.org/wiki/The_Nxt_API.

Como ya he dicho antes, la fee por transacción es de 1NXT. 1 NXT = 100,000,000 NQT (nanoquantos).

1 NQTes la unidad más pequeña con la que se puede denominar a Nxt, similar a 1 satoshi en Bitcon.

El servidor Nxt acepta la fee en NQT, así que pagamos exactamente 100 millones de NQT (0,03$).

El parámetro «broadcast» se puede cambiar a false, en cuyo caso recibirás  ‘transactionBytes’ en la respuesta, que puede ser emitida a la red más adelante usando la petición ‘broadcastTransaction’. Pero en esta ocasión lo he fijado en ‘true’  para emitir la transacción instantáneamente.

Recuerda dotar de urlencode() al mensaje. Yo inserto el nombre de archivo en el mensaje separado del hash con una columna.

$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, "&");

Envía la petición al servidor NXT usando la función sendRequest():

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

y decodifica la respuesta JSON del servidor para obtener el identificador de la transacción:

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

Ahora que tenemos una respuesta positiva de la transacción aceptada y su ID es conocido, vamos a actualizar el registro en la base de datos local:

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

Opcionalmente podemos proporcionar estos links a los clientes para consultas futuras y para demostrar que el hash ha sido subido:

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

Usa estos links para verificar el hash Sha256 del archivo guardado en tu base de datos local en lugar de un registro permanente en la blockchain de Nxt:

" . $fileHash;

Opcionalmente puedes enviarles por email a los clientes el $txId que podrán utilizar en un futuro para verificar el hash o, de algún otro modo más, proporcionales información acerca de como en un futuro recuperar información del hash de la base de datos propia y compararla con el hash almacenado en la blockchain, por el timestamp o por otro criterio.

Esta app no incluye autenticación del usuario. Normalmente el cliente o usuario de un servicio de intranet será capaz de ver sus archivos después de haberse autentificado en el sitio.

Esta aplicación también asume que la aplicación de verificación está fuera del alcance del que mantiene la base de datos interna, para evitar engaños en los datos de los resultados de verificación.

Ahora el registro es almacenado en la base de datos de la compañía. Muestra el registro de la base de datos para confirmar que se encuentra allí:

$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);
}

La aplicación de verificación

Para usar la verificación por hash el cliente tiene que tener el ID de la transacción en la blockchain de Nxt aprobada por ellos cuando la transacción fue enviada a la blockchain de Nxt.

Supongamos que el cliente la tiene, almacenada en el email o recuperada de algún otro modo. Aquí está:

$txId = "111111111111111111";

Vamos a ver lo que nuestra base de datos propia tiene para el hash del archivo. Busca y guarda en $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;
}

Envía una petición al servidor NXT y busca toda la información almacenada en la blockchain de Nxt para transacciones con ese ID.

$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);

Decodifica la respuesta JSON y extrae el campo añadido dónde se almacena el hash.

En la primera parte de la app nosotros almacenamos el nombre del archivo separado del hash con una columna. Ahora extraemos sólo la porción correspondiente al hash del mensaje arbitrario

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

Y compara lo que tenemos en la base de datos de la compañía con lo que fue almacenado hace 1 año en la blockchain de Nxt:

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

NXT-crypto-developer

Anuncio: Características de la versión 1.8

El trabajo efectuado sobre Nxt y su cliente NRS, continúa. Los desarrollares del núcleo de Nxt han enviado una lista con las nuevas características que se implementarán en el próximo lanzamiento de la versión NRS 1.8, esperada para Abril.

  • Cartera en el escritorio

    Ejecuta el cliente como una aplicación de escritorio.

Riker escribe:

Hasta ahora, cuando iniciamos el cliente NXT, el usuario tenía que:  esperar a que el servidor arrancase, luego, abrir el navegador y dirigirnos a http://localhost:7876 para iniciar la cartera en el navegador web.

A partir de este lanzamiento, cuando ejecutemos el cliente NXT, se iniciará inmediatamente como una aplicación de escritorio del monedero, basada en el mismo diseño.

Consulte: https://bitbucket.org/JeanLucPicard/nxt/issues/338/desktop-wallet

  • Monitorización de cuentas

    Componente del servidor que dota de fondos automáticamente a las cuentas específicas en base a varios criterios. Asegurando que la cuenta del titular siempre cuente con la cantidad suficiente de NXT para realizar las transacciones.

ScripterRon comenta:

Usted puede monitorizar NXT, Activos o Monedas.

Cuando el balance de la cuenta monitorizada comienza a ser inferior al prefijado, se inicia la transferencia, de NXT, Activos o Monedas, desde la cuenta de los fondos hacia la cuenta monitorizada.

Usted puede activar múltiples monitorizaciones. Las cuentas monitorizadas son identificadas mediante una propiedad de cuenta.  La propiedad de la cuenta debe ser establecida por el titular de la cuenta de financiación.

  • Personalización de la cartera

    Abrir la cartera en una página específica o modal.

Riker escribe:

Esta característica permite vincular la cartera online de Nxt a una página, específica o modal, o enlace web externo.

Por ejemplo: conectando a: http://localhost:7876#account=NXT-22222-…&modal=send_money_modal&recipient=NXT-33333

ingresarías a la cuenta NXT-22222 abriría el modelo estándar «Send Money» y rellenaría el campo del destinatario con el valor NXT-33333

Consulte: https://bitbucket.org/JeanLucPicard/nxt/issues/320/start-the-client-on-a-specific-page-or

  • Add-Ons

    Estructura sencilla para incorporar plugins

Únete a la conversación sobre Nxt 1.8 en Nxtforum:
https://nxtforum.org/general-discussion/upcoming-features-in-1-8-release/

En paralelo a lo anterior, el desarrollador, Jean-Luc ha comenzado a trabajar en el diseño Nxt 2.0.

Lea más sobre la propuesta de diseño para Nxt2.0:
http://test.nxter.org/nxt-2-0-design/
[vídeo] http://test.nxter.org/nxt-2-0-design-proposal-should-investors-and-asset-issuers-be-afraid/

Puedes publicar comentarios e ideas para el diseño de Nxt2.0 en:
https://nxtforum.org/core-development-discussion/nxt-2-0-design/

Versión Nxt 2.0 – Beneficios y preguntas abiertas

Aquí tienes un gran audio que merece la pena escuchar– Riker, desarrollador del núcleo de Nxt, hablando sobre Nxt y otras criptomonedas e inversiones junto a Marc De Mesel, un inversor que posee un 35% del total de sus inversiones en NXT.

Marc quiere saber más acerca de: Jean Luc, el anónimo desarrollador principal del núcleo de Nxt; en qué punto está Nxt en estos momentos, si lo comparamos con Ethereum y otras blockchains “competidoras”; y también sobre los recientes cambios propuestos al protocolo de Nxt (La propuesta Nxt 2.0).

Riker explica cómo Nxt 2.0 pretende solventar el problema del crecimiento desmesurado de la blockchain y haga que Nxt se convierta en la primera criptoplataforma global escalable.

También: cómo Nxt, en caso de que la versión 2.0 sigue adelante, puede convertirse en una cadena lateral o sidechain y, cómo con las versiones 2.x se podrían agregar más sidechains. En lugar de implementar el trading entre activos (Activo X <> Activo Y), Nxt 2.0 haría que todos los activos del AE puedan comercializarse entre sidechains, a escala mundial.

Teniendo una sidechain vinculada a un valor fiduciario y otras sidechains vinculadas a otras criptomonedas, como Bitcoin, los activos de Nxt podrían intercambiarse en varios mercados nuevos, creando de ese modo una multi moneda, totalmente descentralizada, con bajas tasas de transacción, con un mercado de activos escalable a nivel mundial impulsado por el Nxt AE.

[youtube id=»tN4FjZ-31uk» width=»600″ autoplay=“no”]

Nada es definitivo, pero dado que el diseño de Nxt 2.0 ha sido discutido y refinado durante los últimos 6 meses entre los desarrolladores de Nxt, todo indica que se programará de la manera propuesta, con todos los detalles restantes pulidos en colaboración con los usuarios de la activa comunidad Nxt.

Riker menciona como Nxt 2.0 puede beneficiar a las empresas, un nicho de usuarios que han mostrado mucho interés en el Sistema Monetario de Nxt (MS), pero que se han mostrado reacios a utilizarlo debido a la necesidad actual de los usuarios a pagar las tasas de transacción en NXT.

Con Nxt 2.0, las empresas serían capaces de lanzar sidechains totalmente seguras usando las características de Nxt pero sin que los usuarios de esa sidechain tengan que comprar Nxt para poderla usar. Por ejemplo: los tokens del Sistema Monetario de Nxt pueden usarse como entradas para un concierto y solo el negocio en funcionamiento en la sidechain tendría que pagar las tasas en Nxt a los forjadores de la cadena principal.

Otra aplicación evidente de la característica de crowdfunding del sistema monetario sería la de realizar campañas de crowdfunding en la moneda de la cadena lateral, como por ejemplo: monedas fiat o Bitcoin.

Algunas organizaciones probablemente querrían tener sus propias blockchains privadas y poder solicitar ayuda a los desarrolladores de Nxt. Pero ¿podrían algunos de estos trabajos privados (por los que los desarrolladores centrales de Nxt podrían ser pagados) ser beneficiosos para el inversor en Nxt? ¿Deberíamos buscar a empresas que estén dispuestas a pagar por el desarrollo del núcleo de código abierto de Nxt? O, por el contrario, ¿tendrían entonces estas empresas demasiado poder sobre el desarrollo?

Existe el riesgo de que, si Nxt se convirtiese en una cadena lateral con Nxt 2.0, el valor de NXT se estrelle, arrastrando consigo todos los precios de los activos dentro del AE, tal y como algunas personas han estado afirmando en el debate abierto sobre la propuesta de diseño? Si es así, ¿deberían los emisores e inversores de los activos huir de la blockchain de Nxt cuanto antes?

Tendrás que decidirlo por ti mismo, por supuesto. El mercado de las criptomonedas es muy volátil e impredecible, quien sabe.

Un montón de ruido en el vídeo pero un montón de buena información también
Gracias a Marc y Riker por llevar a cabo esta entrevista en Amsterdam.

Debate la propuesta del diseño de Nxt 2.0 en Nxtforum

Para seguir a Marc de Messel en Youtube, puedes suscribirte a su canal.
arc-de-mesel-nxt-blockchain