Una de las áreas de desarrollo de Horizen es la de comunicaciones seguras. Este artículo describe a detalle las funciones de mensajería ya implementadas a ZenChat y menciona los planes a futuro que tenemos para la aplicación.

Para asegurar la compatibilidad entre aplicaciones hemos basado la mensajería por ZenChat en un protocolo bien definido para que permanezca compatible con apps como billeteras, otros clientes de chat, etc. Aunque un sistema de mensajería basado en tecnología blockchain puede parecer contraintuitivo en un principio, considerando las limitantes de rendimiento en cuanto a transacciones, consideramos que nuestros esfuerzos por escalar las capacidades de nuestras cadenas permitirán que mantener conversaciones vía mensajes almacenados en una cadena de bloques sea viable en un futuro cercano.

El valor de nuestro protocolo de mensajería no solo depende de la comunicación entre usuarios regulares, sino también de la comunicación entre nodos y/o aplicaciones a nivel protocolo.

Ejemplos de configuraciones de mensajería:

  • Mensajería uno a uno y en grupos – En el primero de estos casos, dos entidades se comunican entre sí (un chat tradicional). En el segundo, un grupo de usuarios se envía mensajes a un “canal” compartido. Pueden agregarse nuevos usuarios al grupo cuando así se desee.
  • Mensajes con remitentes identificables y mensajes anónimos – Hay casos en los que un usuario desea comprobarle su identidad al receptor, mientras que en algunos otros resulta más deseable el anonimato.

Con base en lo anterior surgen cuatro principales variantes de uso; uno a uno y en grupo combinadas con la capacidad de identificarse o mantenerse anónimo. Debe notarse que un usuario no tiene por qué ser humano; bien podrían ser inteligencias artificiales o bots las entidades usando el protocolo de mensajería.

Usuarios

Cualquier usuario puede poseer varias identidades de mensajería ZEN para presentarse ante otros usuarios (pues esta información es pública). El cliente de mensajería/billetera/GUI se hace responsable de administrar estas identidades. Una identidad de mensajería dada debe contar con la información siguiente:

  • Un apodo o nombre arbitrario adoptado por el usuario
  • Una dirección para enviar y recibir mensajes designada específicamente a la identidad de mensajería
  • Una dirección T empleada para firmar cada mensaje antes de enviarlo (específica también a cada identidad de mensajería)

El usuario cuenta con la libertad de incluir otros detalles como su nombre y apellido e información de contacto como cuentas de correo, teléfonos o cuenta de Twitter. La manera en la que los usuarios comparten sus identidades para entrar en contacto no se ha definido de manera estricta, y puede implementarse de varias maneras:

Las billeteras y servicios de mensajería GUI les permiten a los usuarios importar, exportar, copiar y pegar su identidad ZEN o la información de algún contacto como un objeto JSON. El usuario puede compartir su identidad ZEN en privado (en otro canal) o través de un canal ZEN dedicado.

Una vez que el usuario A importa la identidad del usuario B, el cliente GUI respectivo le pregunta a A si desde enviarle su identidad a B como un mensaje especial ZEN, lo cual es posible solo mientras el mensaje quepa dentro de una sola transacción Z➝Z (en el caso del protocolo de mensajería ZEN versión 1). Una vez recibido el primer mensaje, el cliente del usuario B le pedirá que importe la identidad del usuario A recibida en el mensaje.

Posteriormente, podría implementarse un “servidor de mensajería ZEN” (desafortunadamente centralizado), el cual les permitiría a los usuarios publicar sus identidades ZEN. Los clientes de mensajería GUI accederían el servidor a través de alguna interfaz estandarizada. Dicho servidor también tendría la función de permitirles a los usuarios buscar cualquier identidad almacenada en él.

La solución a largo plazo deseada, sin embargo, es almacenar un registro distribuido de las identidades de ZenChat en la cadena de bloques de Horizen.

Protocolo de mensajería

Los mensajes de cada usuario se transportan en el campo de notas (memo) como parte transacciones ZEN T➝Z y Z➝Z. El campo de notas tiene una extensión máxima de 512 bytes y, de especificarse en una línea de comando, necesita estar en formato HEX. Existen actualmente algunas limitantes para las transacciones JoinSplits/➝Z que complican un poco el diseño del protocolo:

Cuando una dirección Z recibe una transacción entrante el receptor puede ver la fecha, cantidad y mensaje pero no las direcciones T o Z del remitente. Este sucede en el caso de transacciones ZEN T➝Z y Z➝Z. Cuando una transacción se envía desde una dirección Z, esta no aparece registrada en los datos almacenados por la billetera del usuario.

Las limitantes hacen necesario que la identidad del remitente se establezca a nivel protocolo de mensajería (firmando el mensaje con una dirección T). Cada remitente de un mensaje (que esté utilizando mensajería ZEN) debe contar con dos direcciones:

  • Una dirección Z para enviar y recibir el mensaje/transacción (empleada solo para el “transporte” del mensaje)
  • Una dirección T para firmar el mensaje enviado y comprobar la identidad del remitente (en caso de que este decida no permanecer anónimo).

Un remitente humano puede llegar a tener múltiples identidades de mensajería y detalles de contacto, pero debe crearse y designarse un par de direcciones Z y T para cada una. Cada mensaje ZEN se envía como una sola transacción Z➝Z del remitente al receptor en la primera versión del protocolo.

Un mensaje (“zenmsg”) de ZenChat se compone de un campo de datos que indica la versión (“ver”) del protocolo ejecutada por el programa, la dirección del remitente (“from”), el mensaje en sí y una firma (“sign”). Con esta formato, la extensión efectiva máxima de cada mensaje (“message”) es de aproximadamente 340 caracteres, aunque futuras versiones del protocolo permitirán el envío de mensajes más extensos divididos en varias transacciones.

Cuando un usuario envía un mensaje, la dirección T lo firma e incluye la firma del mensaje. No hay necesidad de incluir un receptor porque la información de receptor se ya se encuentra incluida en la firma.

{
   "zenmsg":
   { "ver": 1,
     "from": "znn9wRVAkgNnKCYJvsHu9nm4Q7c6AxLE2qR",
     "message": "Actual chat message is here etc. whatever", 
     "sign": "H5L3vhCQ+3EAz7BRrpNqy2x42VF+oY1WowGxCwEJkMlcbfX+GLU3PWOzPwJK+BUBY5YoDk/hAkF4GwtqyWWOngI="
   }
}

Mensajes anónimos

Cuando el usuario se comunica de manera anónima cambia ligeramente la estructura del mensaje. Al enviar el usuario A su primer mensaje al usuario B el cliente GUI genera un identificador de hilo único para los mensajes A➝B y lo almacena permanentemente. Todas las comunicaciones subsecuentes A➝B recibirán el mismo identificador. El cliente GUI presentará todos los mensajes anónimos con el mismo identificador pero como provenientes de un remitente anónimo, por lo que un mensaje anónimo no contiene información de tipo alguno sobre quien lo envía.

{
   "zenmsg":
   { 
     "ver": 1,
     "message": "Actual chat message is here etc. whatever", 
     "threadid": "123e4567-e89b-12d3-a456-426655440000"
   }
}

La diferencia principal entre este tipo de comunicación con respecto a hilos con usuarios identificables es que el identificador del hilo reemplaza la firma del usuario y, ya que la comunicación es anónima, el receptor del mensaje no podrá contestar al mensaje recibido. Otra opción es que el primer (y solo el primer) mensaje contenga la dirección Z del usuario A, en cuyo caso B podrá responder (todas sus respuestas usarán también el mismo identificador de hilo).

El nuevo campo, la dirección del remitente, puede terminar por revelar la identidad del usuario (ya sea directa o indirectamente), debilitando así la anonimidad de los mensajes. Además, un identificador de hilo no necesariamente sirve como garantía de que los mensajes provienen de un mismo usuario, en especial en el caso de canales de mensajería grupales.

{
   "zenmsg":
   { 
     "ver": 1,
     "message": "Actual chat message is here etc. whatever", 
     "threadid": "123e4567-e89b-12d3-a456-426655440000",
     "returnaddress": "zcZLZ6hjYYCqZEg64aHpvCpaX7yQyvAedjhHkP2e1LWVSNmxhj6CUYJqAsPGXzxB5prMppyv2jsJxbGbw4JDvdxpPUbNNUa"
   }
}

Un mensaje puede firmarse con una dirección T o ser anónimo y poseer un identificador de hilo, pero nunca ambas cosas.

Mensajes especiales

Un tipo de mensaje especial es aquel que contiene los detalles de una identidad de mensajería como primer mensaje. El usuario envía este tipo de mensaje para informar al receptor sobre su identidad, evitando que este tenga importar dicha información de alguna otra manera. Estos mensajes contienen información personal enviada por medio de una transacción especial.

Mensajes grupales

La mensajería en grupo involucra a varios usuarios enviándose mensajes a través de un solo canal o grupo, donde los mensajes recibidos son visibles para todos los miembros del grupo. El canal empleado cuenta con una dirección Z a la cual cada participante envía sus mensajes. Como en casos anteriores, el remitente de un mensaje puede tener datos identitarios o permanecer anónimo. Para que los miembros del canal conozcan la identidad de un remitente dado es necesario que este propague su identidad por medio del mensaje especial antes mencionado. Si este mensaje no se envía los participantes conocerán la dirección T del usuario pero no sabrán a quién representa.

El procedimiento para obtener una dirección Z para un canal de mensajería es específica a la implementación de la plataforma de mensajería. La manera más conveniente de obtener la dirección es la de permitirles a los usuarios emplear una frase común, como por ejemplo un hashtag, para crear el canal. Cada usuario convierte la frase a una dirección Z y la importa luego a su billetera o cliente GUI.

Resumen

Un servicio de mensajería representa un complemento importante a las funciones disponibles desde nuestra plataforma blockchain. ZenChat no solo es permite a sus usuarios comunicarse uno a uno o en grupos y canales, pero también empleando diferentes clientes de software, billeteras y aplicaciones. Cada usuario puede crear tantas identidades de mensajería como desee y puede decidir si comunicarse desde el anonimato o de manera abierta. Un mensaje en ZenChat es en realidad una transacción con un mensaje adjunto en un campo de datos adicional, y puede tener una extensión de alrededor de 340 caracteres.

Mientras que por el momento los usuarios deben compartir sus identidades de mensajería de manera externa, el plan de Horizen a largo plazo es el de incluir un registro distribuido de todas las identidades en la plataforma de Horizen. Par crear un canal de mensajería, una frase común o hashtag puede convertirse en una dirección Z.

¿Por qué no prueba ZenChat usted mismo? Descargue nuestra aplicación insignia, Sphere by Horizen, active el modo completo en los ajustes y envíe su primer mensaje. Si aún no cuenta con ZEN, visite nuestra Fuente ZEN para recibir gratis algunas monedas y empezar a explorar.