En esta guía, repasaremos algunas de las principales codificaciones de Blockchain. Y si recién está comenzando, consulte nuestros cursos completos de blockchain.
La tecnología blockchain es increíblemente fascinante. No será descabellado pensar en un futuro que se basará completamente en él. Entonces, ¿qué necesitas aprender para comenzar a desarrollar en blockchain? ¿Qué idiomas te darán la ventaja? ¡Comencemos con la codificación blockchain!
Programación de problemas de blockchain
Antes de comenzar, veamos algunos de los desafíos que enfrenta un desarrollador de blockchain. Crear y mantener una cadena de bloques pública no es fácil por varias razones.
(Antes de continuar, un gran reconocimiento a David Schwartz por su discurso de apertura sobre el uso de C ++ en el desarrollo de software blockchain en CPPCON 2016).
Codificación Blockchain
Desafío de dificultad de codificación blockchain n. ° 1: seguridad
Las cadenas de bloques, como dice David Schwartz, deberían ser fortalezas. En primer lugar, el código es público y está abierto para que todos lo vean. Cualquiera puede revisar el código y buscar errores y vulnerabilidades. Sin embargo, a diferencia de otros recursos de código abierto, la desventaja de encontrar vulnerabilidades en el código blockchain es enorme. Cualquier programador puede piratear y salirse con la suya potencialmente con millones y millones de dólares. Debido a estas preocupaciones legítimas de seguridad, el desarrollo en blockchain suele ser muy lento.
Desafío de dificultad de codificación blockchain n. ° 2: gestión de recursos
Es importante seguir el ritmo de la red. No puede quedarse atrás y no mantenerse al día con todas las demandas de la red. Debe estar bien equipado para manejar consultas locales y remotas.
Desafío de dificultad de codificación blockchain n. ° 3: rendimiento
La cadena de bloques siempre debe funcionar con sus capacidades más altas posibles, pero para que eso suceda, el lenguaje elegido debe ser extremadamente versátil. El caso es que hay ciertas tareas en la cadena de bloques que son paralelizables, mientras que hay algunas tareas que no se pueden hacer en paralelo.
Un buen ejemplo de una tarea “paralelizable” es la verificación de firma digital. Todo lo que necesita para la verificación de la firma es la clave, la transacción y la firma. Con solo tres datos, puede realizar verificaciones de manera paralela.
Sin embargo, no todas las funciones en una cadena de bloques deben realizarse de esa manera. Piense en la ejecución de la transacción en sí. No se pueden ejecutar varias transacciones en paralelo; debe hacerse uno a la vez para evitar errores como gastos dobles. Algunos lenguajes son buenos para operaciones paralelas, mientras que otros son buenos para operaciones no paralelas.
Desafío de dificultad de codificación Blockchain # 4: Aislamiento
¿Qué es el comportamiento determinista?
- Si A + B = C, entonces no importa cuáles sean las circunstancias, A + B siempre será igual a C. Eso se llama comportamiento determinista.
- Las funciones hash son deterministas, lo que significa que el hash de A siempre será H (A).
Entonces, en el desarrollo de blockchain, todas las operaciones de transacción deben ser deterministas. No puede tener una transacción que se comporte de una manera y luego se comporte de otra al día siguiente. Del mismo modo, no puede tener contratos inteligentes que funcionen de dos formas diferentes en dos máquinas diferentes.
La única solución a esto es el aislamiento. Básicamente, aísla sus contratos y transacciones inteligentes de elementos no deterministas.
Entonces, hemos discutido los principales problemas a los que se enfrentan los desarrolladores de blockchain. Ahora veamos finalmente algunos de los lenguajes que los desarrolladores pueden usar para codificar en la cadena de bloques.
Lenguaje de codificación Blockchain # 1: C ++
En primer lugar, comencemos con el abuelo de todos ellos, el imperecedero C ++. C ++ fue creado por Bjarne Stroustrup como una extensión del lenguaje C. El lenguaje fue diseñado para tener la flexibilidad y eficiencia de C pero con algunas diferencias importantes. La mayor diferencia entre C y C ++ es que mientras C está orientado a procesos, C ++ está orientado a objetos.
Lo que esto significa es que, en C ++, los datos y las funciones están empaquetados en un pequeño paquete ordenado llamado “objetos”, lo que significa que una vez que se crea un objeto, se puede llamar y reutilizar fácilmente en otros programas, lo que reduce en gran medida el tiempo de codificación.
Veamos el programa C ++ más simple del mundo. El programa “Hola mundo”:
Entonces, ¿por qué la gente todavía usa C ++ para codificar? Seguramente hay lenguajes mucho más glamorosos ahora, ¿por qué la gente todavía insiste en volver a C ++? ¿Por qué la cadena de bloques de bitcoin está codificada en C ++?
Bueno, resulta que C ++ tiene ciertas características que lo hacen muy atractivo. (Grite a Peter Wiulle y David Schwartz por la siguiente explicación).
Característica # 1: Control de memoria
¿Recuerda lo que dijimos anteriormente sobre los desafíos del desarrollo de blockchain? Las cadenas de bloques no solo deben ser fortalezas seguras, sino que también deben tener una gestión eficaz de los recursos. Se supone que una cadena de bloques interactúa con muchos puntos finales que no son de confianza y, al mismo tiempo, brinda un servicio rápido a todos y cada uno de los nodos.
Este servicio rápido y rápido es fundamental para el éxito de una criptomoneda como bitcoin. Recuerde, todos se basan en el principio de “consenso”, todos los nodos de la red deben aceptar y rechazar exactamente los mismos bloques, o de lo contrario podría haber una bifurcación en la cadena.
Para satisfacer todas estas demandas y rendir al más alto nivel, necesita un control estricto y completo sobre el uso de la CPU y la memoria. C ++ se lo da a sus usuarios.
Característica # 2: Enhebrado
Como hemos comentado antes, uno de los principales retos de la programación blockchain es la integración de tareas que se paralelizan bien y las tareas que no lo hacen. La mayoría de los lenguajes se especializan en uno, sin embargo, la capacidad de subprocesamiento de C ++ es lo suficientemente buena para manejar tareas paralelas y no paralelas. Un hilo es un conjunto de instrucciones que se pueden ejecutar simultáneamente. C ++ no solo permite excelentes instalaciones de subprocesos múltiples con una comunicación eficaz entre subprocesos, sino que también optimiza el rendimiento de un solo subproceso.
Característica # 3: Mover semántica
Uno de los aspectos más interesantes de C ++ es la semántica de movimientos. La semántica de movimiento proporciona una forma de mover el contenido entre objetos en lugar de copiarlo directamente. Veamos las diferencias entre la semántica de copia y la semántica de movimiento. (Los siguientes datos se toman de la respuesta de Peter Alexander en “Stackoverflow”).
Copiar semántica:
afirmar (b == c);
a = b;
afirmar (a == b && b == c);
Entonces, ¿Que esta pasando aquí? El valor de b entra en ayb permanece sin cambios al final de todo.
Ahora, considere esto.
Mover semántica:
- afirmar (b = = c);
- mover (a, b);
- afirmar (a = = c);
¿Que está sucediendo aquí?
¿Puedes ver la diferencia entre los dos bloques de códigos?
Cuando usamos la semántica de movimiento, el valor de “b” no necesita ser sin cambios. Esa es la diferencia entre la semántica de copia y la semántica de movimiento. La mayor ventaja de la semántica de movimientos es que puede obtener copias de ciertos datos solo cuando los necesita, lo que disminuye en gran medida la redundancia en el código y aumenta enormemente el rendimiento. Como puede ver, esta gestión eficiente de la memoria y el alto rendimiento son deseables para la cadena de bloques.
Característica # 4: Polimorfismo de tiempo de compilación
¿Qué es el polimorfismo?
¿Recuerda cuando llamamos a C ++ un “lenguaje de programación orientada a objetos (OOP)”? El polimorfismo es una propiedad OOP. Al usar polimorfismo, usa una característica en particular de más de una manera. En C ++, el polimorfismo se puede utilizar de dos formas:
- Polimorfismo en tiempo de compilación.
- Polimorfismo en tiempo de ejecución.
Aquí, solo nos centraremos en el polimorfismo en tiempo de compilación. Hay dos formas en que C ++ implementa el polimorfismo en tiempo de compilación:
- Sobrecarga de funciones.
- Sobrecarga del operador.
- Sobrecarga de funciones:
La sobrecarga de funciones se produce cuando tiene muchas funciones con el mismo nombre pero con una ingesta de parámetros diferente.
Considere este programa:
Ahora, cuando ejecute esta función, la salida será:
2
2,65
7
Entonces, como puede ver, la misma función func () se usó de 3 formas diferentes.
Sobrecarga del operador:
En C ++, el mismo operador puede tener más de un significado.
P.ej. “+” Se puede utilizar tanto para la suma matemática como para la concatenación.
La concatenación básicamente significa tomar dos cadenas y combinarlas en una.
Entonces 3 + 4 = 7.
Y
Bloque + geeks = Blockgeeks.
El mismo operador hizo dos funciones diferentes, esto es operador de sobrecarga.
El polimorfismo en tiempo de compilación ayuda mucho en el desarrollo de blockchain. Ayuda a colocar las responsabilidades por separado en varias funciones y, a su vez, aumenta el rendimiento de todo el sistema.
Característica # 5: Aislamiento de código
C ++ tiene características de espacio de nombres que se pueden importar de un programa a otro. El espacio de nombres ayuda a evitar colisiones de nombres. Además, dado que C ++ tiene clases, puede actuar como límites entre varias API y ayudar a establecer una separación clara.
Una clase en C ++ es un tipo definido por el usuario o una estructura de datos declarada con una clase de palabra clave que tiene datos y funciones como miembros. Puede acceder a las funciones declaradas en la clase declarando objetos de esa clase en particular.
Característica # 6: Madurez
El lenguaje es maduro y se actualiza periódicamente. Hay al menos 3 compiladores sólidos, como dice David Schwartz, y las nuevas funciones están destinadas a resolver problemas reales. Hay depuradores y herramientas analíticas de todo tipo disponibles para todo, desde la elaboración de perfiles de rendimiento hasta la detección automática de problemas de todo tipo. Esto significa que el lenguaje está en constante crecimiento para incorporar nuevas y mejores características.
Debido a las características anteriores, Satoshi Nakamoto eligió C ++ para ser el lenguaje base del código fuente de bitcoin.
Lenguaje de codificación Blockchain # 2: Javascript
A continuación tenemos Javascript.
Junto con HTML y CSS, es una de las tres tecnologías centrales en la producción de contenido World Wide Web. Javascript se usa generalmente para crear páginas web altamente interactivas. Entonces, ahora veremos cómo crear una cadena de bloques muy simple usando Javascript. Enorme agradecimiento a savjee.be por el contenido de esta sección.
Supongamos que queremos crear una cadena de bloques simple en Javascript. Antes de hacerlo, hay ciertas cosas que debemos abordar.
¿Qué es una cadena de bloques y cómo funciona exactamente … en términos de código?
Una cadena de bloques es básicamente una cadena de bloques que contienen datos. Es básicamente una lista enlazada glorificada. Sin embargo, ¿qué lo hace tan especial? Una cadena de bloques es inmutable. Es decir, una vez que un dato va dentro de un bloque, nunca se puede cambiar. ¿Cómo logra una cadena de bloques la inmutabilidad? Es debido a un mecanismo simple pero ingenioso llamado “hash”. Mira el diagrama a continuación:
Cada bloque está conectado al bloque anterior mediante un puntero hash que contiene el hash del bloque anterior. Entonces, ¿cómo hace esto que la cadena sea inmutable?
Una de las propiedades más fascinantes de las funciones hash criptográficas es que si incluso cambia un poco la entrada, puede afectar en gran medida el hash de salida. P.ej. Mira esto:
El simple hecho de cambiar la primera “T” de mayúscula a minúscula cambió drásticamente el hash de salida.
Entonces, ¿cómo afecta esto a la cadena de bloques?
Cada bloque está conectado al anterior mediante el puntero hash. Entonces, si alguien manipulara los datos en un bloque, cambiaría drásticamente el hash y, como resultado, terminaría afectando a toda la cadena (ya que todos los bloques están vinculados). Esto congelaría la cadena, lo cual es imposible y, por lo tanto, los bloques permanecen sin cambios.
Entonces, ¿cómo hacemos un bloque? ¿En qué consiste un bloque simple? En nuestra criptomoneda simple que vamos a hacer (llamémosla “BlockGeeksCoin”), cada bloque tendrá la siguiente información:
- Índice: Para conocer el número de bloque.
- Marca de tiempo: Para conocer el momento de la creación.
- Datos: los datos dentro del bloque.
- Hash anterior: el hash del bloque anterior.
- Hash: el hash del bloque actual.
Antes de continuar. Debe comprender ciertos términos que usaremos en nuestro programa:
- this: La palabra clave “this” se invoca dentro de una función y le permite acceder a los valores dentro de un objeto específico que llama a esa función en particular.
- Constructor: un constructor es una función especial que puede ayudar a crear e inicializar un objeto dentro de una clase. Cada clase está restringida a un solo constructor.
Ahora que está hecho, comencemos a hacer nuestro bloqueo.
Creando el Bloque
Análisis de código
Ok, entonces esto de aquí está fuera de bloque. Entonces, en la primera línea del código llamamos a la biblioteca crypto-js porque la función hash sha256 no está disponible en JavaScript.
A continuación, invocamos un constructor dentro de la clase para llamar a objetos que tendrán ciertos valores. Lo que probablemente te llame la atención es la función calculateHash (). Veamos qué está haciendo exactamente.
En un bloque, tomamos todos los contenidos y los hash para obtener el hash de ese bloque en particular. Estamos usando la función JSON.stringify para convertir los datos del bloque en una cadena para hacer un hash.
Ok, tenemos el bloque listo y listo. Ahora conectemos los bloques en una cadena de bloques.
Creando la cadena de bloques
Análisis de código
Muy bien, están sucediendo muchas cosas en la cadena anterior, vamos a dividirla en secciones.
Sección 1: El bloque Génesis
¿Qué es el bloqueo génesis?
El bloque de génesis es el primer bloque de la cadena de bloques, y la razón por la que es especial es que, si bien cada bock apunta al bloque anterior, el bloque de génesis no apunta a nada. Entonces, en el momento en que se crea una nueva cadena, el bloque de génesis se invoca inmediatamente. Además, puede ver una función “createGenesisBlock ()” en la que hemos proporcionado los datos del bloque manualmente:
createGenesisBlock ()
{
devolver nuevo Bloque (0, “01/01/2017”, “Bloque Génesis”, “0”);
}
Ahora que hemos construido el bloque de génesis, construyamos el resto de la cadena.
Sección 2: Agregar los bloques
En primer lugar, necesitaremos saber cuál es actualmente el último bloque de la cadena de bloques. Para eso usamos la función getLatestBlock ().
¿Entonces, Que esta pasando aquí? ¿Cómo agregamos los bloques? ¿Cómo comprobamos si el bloque dado es válido o no?
¿Recuerdas el contenido de un bloque?
Un bloque tiene el hash del bloque anterior, ¿verdad?
Entonces, lo que vamos a hacer aquí es simple. Compare el valor hash anterior del nuevo bloque con el valor hash del último bloque.
Si estos dos valores coinciden, esto significa que el nuevo bloque es legítimo y se agrega a la cadena de bloques.
Sección 3: Validación de la cadena
Ahora, debemos verificar que nadie haya estado jugando con nuestra cadena de bloques y que todo esté estable.
Estamos usando el ciclo “for” para ir del bloque 1 al último bloque. El bloque Génesis es el bloque 0.
Análisis de código
Comenzamos importando la biblioteca hash para usar las funciones hash SHA 256 (muy parecido a Javascript).
Al igual que antes, el bloque tiene el mismo valor:
- Índice.
- Marca de tiempo.
- Datos.
- Hash anterior.
- Picadillo.
Una vez en contra, estamos completando los valores hash a través de una función, igual que antes.
Creando el bloque de génesis
Ahora, creemos el bloque Génesis:
importar fecha y hora como fecha
def create_genesis_block ():
return Block (0, date.datetime.now (), “Genesis Block”, “0”)
Análisis de código
Hemos importado la fecha y hora para poner la marca de tiempo.
Simplemente generamos el bloque de génesis y le dimos manualmente algunos datos para trabajar. El valor hash anterior es “0” porque no apunta a ningún otro bloque.
Creando el resto de bloques
Ahora definamos cómo se crearán los bloques siguientes.
Análisis de código
Entonces, ¿cómo vamos a determinar los valores de todos y cada uno de los datos dentro de todos y cada uno de los bloques?
El índice de bloque es simplemente el índice del último bloque + 1.
La marca de tiempo es la fecha y hora actuales.
El dato del bloque es un simple mensaje: “¡Oye! Estoy bloqueando “.
Hash que estamos calculando usando la función que definimos anteriormente.
Y, en última instancia, devolvemos todos estos valores al bloque.
Creando la cadena de bloques
Finalmente, creemos la cadena de bloques.
Análisis de código
En primer lugar, creamos el bloque génesis y le damos su valor a “previous_block”.
Luego determinamos cuántos bloques agregar, en este ejemplo vamos con 15.
Entonces, estamos ejecutando un ciclo que va hasta el 15 y agrega todos y cada uno de los bloques a la cadena de bloques. Al final del vistazo, estamos imprimiendo qué bloque numérico se ha agregado a la cadena de bloques mostrando su número de índice. Además, también estamos imprimiendo el Hash.
Así es como se verá la salida:
Obviamente, tanto en esto como en javascript, podría agregar funciones más complicadas como Prueba de trabajo. Si desea aprender a implementarlo, le recomendamos encarecidamente que lea el artículo de Gerald Nash. Pero por ahora, al menos sabe cómo crear una cadena de bloques simple en Python.
Lenguaje # 4: Solidez
Finalmente, llegamos a Solidity. Para cualquiera que quiera aprender a hacer DAPP (aplicaciones descentralizadas) o entrar en el juego de las ICO, aprender Solidity es una necesidad absoluta. Ya tenemos una guía detallada que puede leer aquí. Sin embargo, aquí le daremos una descripción básica. Solidity fue desarrollado por Gavin Wood, Christian Reitwiessner, Alex Beregszaszi, Yoichi Hirai y varios antiguos colaboradores principales de ethereum para permitir la escritura de contratos inteligentes en plataformas blockchain como Ethereum.
Solidity es un lenguaje deliberadamente reducido y escrito libremente con una sintaxis muy similar a ECMAScript (Javascript). Hay algunos puntos clave para recordar del documento Ethereum Design Rationale, a saber, que estamos trabajando dentro de un modelo de pila y memoria con un tamaño de palabra de instrucción de 32 bytes, la EVM (Ethereum Virtual Machine) nos da acceso al programa ” pila ”que es como un espacio de registro donde también podemos pegar direcciones de memoria para hacer que el Contador de Programa se repita / salte (para el control secuencial del programa), una“ memoria ”temporal expandible y un“ almacenamiento ”más permanente que en realidad se escribe en el blockchain, y lo más importante, el EVM requiere un determinismo total dentro de los contratos inteligentes.
Entonces, antes de continuar, veamos un ejemplo básico de contrato de Solidez. (Códigos tomados de github).
Ejecutemos un bucle while simple en solidez:
Entonces, analicemos.
Sección 1: Asignación de valores
En el primer paso, estamos llenando una matriz llamada “enteros” que toma 10 enteros sin signo de 8 bits. La forma en que lo estamos haciendo es mediante un bucle while. Veamos lo que está sucediendo dentro del ciclo while.
while (x <integers.length) {
enteros [x] = x;
x ++;
}
Recuerde, ya le hemos asignado un valor de “0” al entero x. El ciclo while va de 0 a integers.length. Integers.length es una función que devuelve la capacidad máxima de la matriz. Entonces, si decidimos que una matriz tendrá 10 enteros, arrayname.length devolverá un valor de 10. En el ciclo anterior, el valor de x va de 0 a 9 (<10) y asigna el valor de sí mismo a los enteros matriz también. Entonces, al final del ciclo, los números enteros tendrán el siguiente valor:
0,1,2,3,4,5,6,7,8,9.
Sección 2: Agregar el contenido de la matriz
Dentro de la función getSum () vamos a sumar el contenido de la propia matriz. La forma en que lo va a hacer es repitiendo el mismo ciclo while que el anterior y usando la variable “suma” para agregar el contenido de la matriz.
Sección 3: Matar el contrato
Esta función anula el contrato y envía los fondos restantes del contrato al creador del contrato.
Cuando se le preguntó cuál fue la inspiración y la motivación detrás de la creación de solidez, el Dr. Gavin Woods dijo lo siguiente:
“[Solidity] estaba destinado a ser una herramienta sofisticada para desarrollar contratos que, en última instancia, podría brindar tanto a los desarrolladores como a los usuarios buena información sobre lo que hacía el código. Para ayudar con esto, ideé NatSpec, un formato de documentación compatible con los contratos, y lo convertí en un ciudadano de primera clase en Solidity. También propuse un subconjunto de lenguaje de prueba formal (aún no implementado) para maximizar los tipos de garantías de corrección que se podrían hacer.
Introduje eventos como un ciudadano de primera clase en el lenguaje de Solidity con el fin de proporcionar una buena abstracción para LOGs similar en forma a las llamadas a funciones. La inspiración para eso vino de las “señales” del sistema de metaobjetos Qt.
Una característica posterior que Christian R. y yo descubrimos juntos fueron los modificadores de función; que permite que los atributos colocados como parte de la firma de una función realicen algunas modificaciones en el cuerpo de la función aparente. Al ser un medio de expresión muy declarativo, es un idioma que encaja muy bien en el espacio de la programación orientada a los contratos “.
Codificación Blockchain: Conclusión
En este artículo, solo hemos cubierto 4 idiomas para la codificación de blockchain que se utilizan en el desarrollo dentro y alrededor de blockchain. En realidad, hay muchos más lenguajes que potencialmente puedes usar (Java, Go). Si eres un programador, entonces las posibilidades para ti son realmente infinitas. A medida que el mundo se vuelve cada vez más descentralizado y blockchain se vuelve cada vez más común, el futuro para usted es definitivamente ilimitado.