Primer enlace para Exonum: por qué elegimos Java

El núcleo de nuestro marco para desarrollar blockchains privados de Exonum está escrito en Rust, ya que este PL se centra en la seguridad de trabajar con memoria. Sin embargo, junto con muchas ventajas, Rust tiene una serie de características que complican la "interacción" con él: su sintaxis es inusual para muchos desarrolladores y el umbral de entrada es bastante alto.

Para simplificar el trabajo con la plataforma Exonum y hacerla más accesible para la audiencia, decidimos escribir una biblioteca vinculante. El lenguaje para el enlace se ha convertido en Java.

Por qué elegimos Java, lo contamos debajo de un gato.


/ Exonum

Algunas palabras sobre Exonum


Exonum es nuestro marco de código abierto para desarrollar blockchains privados. La cadena de bloques en Exonum es mucho más rápida que las cadenas de bloques públicas y es capaz de procesar hasta 5 mil transacciones por segundo. A modo de comparación, en Ethereum esta cifra es de varias docenas , mientras que Bitcoin lo tiene aún menos .

Exonum utiliza un algoritmo de consenso bizantino para proteger los datos. No requiere minería y garantiza la correcta ejecución de las transacciones, incluso si un tercio de los nodos de la red están comprometidos.

La plataforma Exonum se puede utilizar en cualquier área: financiera, tecnológica, legal. En particular, el marco es adecuado para crear sistemas de gestión de derechos digitales (se puede encontrar una demostración en el sitio web oficial ) y organizar la votación ( demostración ). En ambos casos, todos los procesos que ocurren son lo más transparentes posibles y están protegidos por mecanismos criptográficos.

El año pasado, utilizando la plataforma Exonum, se implementó el Catastro Estatal de Tierras de Ucrania. Y antes de eso, se lanzó un proyecto de gestión de tierras en Georgia en Exonum. También estamos negociando con docenas de compañías Fortune 500 y la Unión Europea para implementar nuestro sistema en sus procesos comerciales.

El núcleo de Exonum está escrito en Rust. La elección se justifica por el hecho de que este PL se centra en la seguridad y la velocidad: funciona más rápido en algunas tareas que Java, Go, C y C ++. Al mismo tiempo, Rust garantiza la seguridad de la memoria y evita carreras cuando dos hilos intentan acceder a los mismos datos.

El compilador Rust está diseñado para minimizar la cantidad de errores causados ​​por la influencia del factor humano. Por ejemplo, elimina varias clases de errores a expensas del concepto de vida y posesión.

Todos los valores en Rust tienen un "dominio de propiedad". Cuando un nombre va más allá de este alcance, el recurso asociado se libera. Aquí hay un código de ejemplo que se proporciona en la documentación oficial de Rust:

fn use_vec() { let vec = make_vec(); //   print_vec(vec); //   print_vec for i in vec.iter() { //   vec println!("{}", i * 2) } } 

Si lo "alimenta" al compilador, generará un error:

 error: use of moved value: `vec` for i in vec.iter() { ^~~ 

Esto sugiere que vec no está disponible porque su dominio de propiedad ha cambiado. Por lo tanto, "dispararse una pierna" en el proceso de desarrollo se vuelve mucho más difícil.

Por qué decidimos crear enlaces


Sintaxis ruidosa

Rust ofrece una conveniente y amplia gama de tipos de datos que se pueden combinar entre sí. Esto hace posible racionalizar conjuntos de valores en el código y restringir el acceso a los datos, protegiéndolos del acceso no autorizado.

Estas características son muy importantes cuando se trabaja con contratos inteligentes en Exonum. Gracias a ellos, los contratos "inteligentes" de nuestro marco tienen más rendimiento y seguridad de acceso a la memoria que, por ejemplo, las soluciones Ethereum.

En general, Rust es similar a otros lenguajes imperativos (en particular, la sintaxis de Rust se parece a C / C ++), pero representa una gran cantidad de conceptos innovadores. Tiene ciclos, condiciones, funciones, pero al mismo tiempo aparecen áreas de propiedad y tipos. Por lo tanto, puede ser difícil para aquellos que nunca han trabajado con este PL leer programas en él.

Al principio parecen "extranjeros". "Pain" agrega una gestión de memoria inusual (en comparación con otros idiomas) que hace que Rust sea tan seguro. El otoño pasado, los creadores de Rust publicaron una encuesta entre 5 mil miembros de la comunidad. Casi una cuarta parte de los encuestados dijo que era difícil trabajar con Rust.

Compilador demasiado exigente

Como ya hemos señalado, la tarea del compilador Rust es reducir la cantidad de errores en el código. El compilador es estricto con el texto del programa, pero muestra opciones para la resolución de problemas. En este caso, el compilador incluso muestra advertencias con respecto al estilo de programación.

Este enfoque le permite escribir código confiable (que es importante cuando se trabaja con blockchains en general), pero también tiene un lado negativo de la moneda. A veces tiene que escribir programas en Rust para que el compilador "entienda" que no está realizando operaciones de memoria prohibidas. Y dado que el lenguaje aún es joven y continúa evolucionando, es posible que no haya prácticas establecidas. Por lo tanto, como dice el desarrollador de Exonum Ilya Bogdanov, muchos métodos tienen que ser encontrados por el método de búsqueda científica.

Pequeña comunidad

La tercera razón para crear carpetas fue la pequeña comunidad Rust. Aunque la comunidad de este idioma es bastante amigable y sus miembros siempre están listos para responder preguntas, el idioma "sufre" debido a una pequeña cantidad de literatura y bibliotecas. Sin embargo, será justo señalar aquí que este problema se está resolviendo gradualmente.

En los últimos años, Rust ha estado promoviendo activamente Mozilla y Samsung , lo que tiene un efecto positivo en la cantidad de bibliotecas que se están desarrollando y nuevos "envoltorios" para las soluciones existentes del mundo C / C ++. Los "libros de texto" de idiomas también comienzan a aparecer gradualmente. De los que ya existen, vale la pena destacar los " Fundamentos de Rust " de Ivo Balbaert, una guía en línea en el sitio web oficial y el libro reciente de uno de los desarrolladores del proyecto Rust, Steve Klabnik, " El lenguaje de programación de Rust ".

Por qué elegir Java


Una de las principales razones que determinaron la elección fue la gran comunidad de este PL. Según un estudio realizado en el sitio Stack Overflow el año pasado, Java ocupa el tercer lugar en popularidad (solo JavaScript y SQL lo aprobaron). De los 64 mil desarrolladores encuestados, casi el 40% escribe en Java.

Debido al tamaño de la comunidad, este PL ha adquirido un amplio conjunto de herramientas. Esto incluye IDE, soluciones analíticas, marcos de referencia, etc. Hay tantos de ellos que algunas empresas obligan a los desarrolladores a usar solo IDE y marcos específicos para evitar dividir el entorno de trabajo.

Al mismo tiempo, Java tiene una sintaxis simple y tiene una interfaz nativa de Java (JNI) que puede funcionar con la interfaz binaria de aplicación C (ABI). Además, Java permite utilizar otros idiomas en la pila JVM: Scala, Kotlin, Clojure.

Y, por último, la máquina Java es multiplataforma: el código Java se ejecuta en código de bytes, que se interpreta y ejecuta en plataformas Windows, MacOS y Linux. Al mismo tiempo, el lenguaje Java está más vinculado al código abierto (en comparación, por ejemplo, con C #). La mayoría de las herramientas de desarrollo de Java son gratuitas: son tanto el JDK como los entornos de desarrollo integrados basados ​​en él: JDeveloper, NetBeans, Eclipse, etc. Al mismo tiempo, puede encontrar una gran cantidad de proyectos de código abierto en recursos especializados (por ejemplo, en GitHub ). También hay muchos manuales sobre cómo trabajar con tecnologías de código abierto.

Retos clave en el desarrollo de Java Binding


El desarrollo de Java Binding ha sido largo y complejo (y aún en curso). Tuvimos que considerar todas las características que hacen que Rust y Java sean tan diferentes.

Por ejemplo, uno de los desafíos fue organizar la gestión de recursos. El punto es que hay un recolector de basura en Java, pero no en Rust. Se eliminó en una de las versiones anteriores, ya que los desarrolladores llegaron a la conclusión de que podían proporcionar el mismo nivel de confiabilidad utilizando un sistema de tipos.

Java GC, aunque ha aumentado el consumo de recursos (obliga a todas las funciones a devolver objetos no utilizados para evitar posibles pérdidas de memoria), es bastante conveniente. Por lo tanto, necesitábamos implementar un mecanismo de limpieza de recursos que los desarrolladores de Java quisieran.

Otra dificultad resultó estar relacionada con las estructuras de datos específicas presentadas en los árboles Exonum - Merkle. Exonum los usa para combinar estados blockchain en un solo hash. Esto permite probar la autenticidad de las transacciones sin tener que comunicarse con varios nodos de red completos. Esta funcionalidad es importante para el trabajo de nuestros clientes ligeros, por lo tanto, también tuvo que ser interpretada en Java.

La API de Java repite casi por completo la API de Rust. Esto se hace para que sea más fácil para nosotros adaptar la documentación y simplificar el trabajo para los usuarios. Hemos preparado una guía separada para configurar y ejecutar el nodo Exonum con la aplicación Java Binding.

Para crear servicios en Java, puede usar el generador de plantillas de proyectos. Necesita instalar Maven 3 y ejecutar el comando:

 $ mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype \ -DgroupId=com.example.myservice \ -DartifactId=my-service \ -Dversion=1.0 

Puedes usar el modo interactivo:

 $ mvn archetype:generate \ -DarchetypeGroupId=com.exonum.binding \ -DarchetypeArtifactId=exonum-java-binding-service-archetype 

Encontrará una guía completa con ejemplos de configuración de un servicio Java en la documentación del sitio web oficial del proyecto Exonum. Hay recomendaciones para iniciar el nodo Exonum en el repositorio en GitHub .


/ Exonum

Planes futuros


Mientras que Java Binding está en alfa. Planeamos lanzarlo como una característica completa y lista para usar en el futuro cercano. Ahora estamos recopilando comentarios de los usuarios para rastrear posibles problemas en la biblioteca y hacer correcciones.

También se está trabajando en la documentación, escribiendo proyectos de ejemplo, SDK para simplificar la integración con la aplicación en la cadena de bloques y mejorar la experiencia de usuario en general. Puede encontrar la hoja de ruta completa del proyecto en el repositorio en GitHub .

Allí puede tomar todas las fuentes para probar Java Binding y escribir su servicio Java para Exonum. Si tiene alguna pregunta, comuníquese con nuestro equipo de desarrollo en Gitter . Dirán y ayudarán en la medida de lo posible.

Source: https://habr.com/ru/post/es423441/


All Articles