En esta página:
Github
En la parte anterior creamos un nuevo proyecto para nuestro blockchain con Rust.
Importamos las dependencias y creamos las funciones necesarias para que crear los bloques de la blockchain.
En esta segunda parte y última terminaremos de crear nuestro blockchain con Rust, vamos con ello.
Partes
- Parte 1
- Parte 2 (Final – Código Fuente GitHub)
Ahora crearemos las tareas para iniciar o crear el génesis de la blockchain.
El genesis crea el primer bloque y así sucesivamente se irán generando nuevos bloques.
También validamos los bloques que se van creando y realizamos otras tareas más (he colocado comentarios para explicar que hacen las líneas de código más importantes):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
// Implementamos las tareas para la blockchain impl Blockchain { // Función para crear la blockchain fn new() -> Self { Self { blocks: Vec::new() } } // Función para dar origen a la blockchain fn crear_genesis(&mut self) { // Usamos el tiempo let timestamp = Utc::now().timestamp(); // Vinculamos valores de la implementación 'Block' let (hash, nonce) = Block::minar( 0, String::from("genesis"), timestamp, String::from("genesis"), ); // Definimos los datos para la blockchain let bloque_genesis = Block { id: 0, hash, previous_hash: String::from("genesis"), timestamp, data: String::from("genesis"), nonce, }; // Creamos el bloque inicial de la blockchain self.blocks.push(bloque_genesis); info!("El bloque Génesis se creó con éxito y se agregó a la blockchain."); } // Función para verificar si el bloque es válido fn validacion_bloque(&self, block: &Block, bloque_anterior: &Block) -> bool { // Analizamos los datos del bloque if (block.id == bloque_anterior.id + 1) && block.hash.starts_with(DIFICULTAD) && (block.previous_hash == bloque_anterior.hash) && (Block::hash( block.id, block.previous_hash.clone(), block.timestamp, block.data.clone(), block.nonce, ) == block.hash) { // Mostramos un mensaje para confirmar que el bloque es válido info!("El bloque #{} es válido", block.id); return true; } // Si el bloque no es válido, mostramos un mensaje warn!("El bloque #{} no es válido", block.id); false } // Verificamos si la blockchain es válida fn validacion_cadena(&self) -> bool { // Si la blockchain no es válida, mostramos con un mensaje for block_index in 1..self.blocks.len() { if !self.validacion_bloque(&self.blocks[block_index], &self.blocks[block_index - 1]) { warn!("La blockchain no es válida"); return false; } } // Si la blockchain sí es válida, mostramos un mensaje info!("La blockchain sí es valida"); true } // Función para agregar un nuevo bloque a la blockchain fn agregar_bloque(&mut self, block: Block) { // Si no hay un bloque para agregar, mostramos un mensaje let bloque_anterior = self .blocks .last() .expect("Debe haber al menos un bloque en la blockchain"); // Si el bloque es válido lo agregamos a la blockchain // Y si el bloque no es válido, mostramos un mensaje if self.validacion_bloque(&block, bloque_anterior) { self.blocks.push(block); info!("El bloque se agregó con éxito a la blockchain."); } else { warn!( "El bloque no es válido, no se puede enviar el bloque #{} a la blockchain", block.id ); } } } |
Por último nuestra función principal de Rust que contiene todos los métodos y tareas creados anteriormente (he colocado comentarios para explicar que hacen las líneas de código más importantes):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// Función principal fn main() { // Mostramos los mensajes en la terminal pretty_env_logger::formatted_timed_builder() .format(|buf, record| { writeln!( buf, "{} [{}] - {}", Local::now().format("%H:%M:%S"), record.level(), record.args() ) }) .filter(None, log::LevelFilter::Info) .init(); // Creamos la blockchain let mut blockchain = Blockchain::new(); blockchain.crear_genesis(); // Ejecutamos las funciones y tareas creadas anteriormente // Mostramos un par de mensajes de rutina loop { let bloque_anterior = blockchain .blocks .last() .expect("Debe haber al menos un bloque en la blockchain"); let nuevo_bloque = Block::new( bloque_anterior.id + 1, bloque_anterior.hash.clone(), String::from("Creación de Una Blockchain con Rust"), ); blockchain.agregar_bloque(nuevo_bloque); if blockchain.blocks.len() % 10 == 0 { blockchain.validacion_cadena(); } } } |
Estoy usando Visual Studio Code.
Entonces compilo el proyecto en la terminal:
1 2 3 4 5 6 |
cargo build Compiling blockchain-rust v0.1.0 Finished dev [unoptimized + debuginfo] target(s) in 0.67s |
Paso seguido ejecuto el proyecto luego de haberlo compilado:
Así puedes crear una blockchain o cadena de bloques con el lenguaje de programación Rust.
Al inicio de esta parte del tutorial he colocado un enlace a un repositorio de GitHub en donde puedes encontrar todo el código del proyecto.
Conclusión
En este tutorial has aprendido a Como Crear Una Blockchain con Rust.
Te servirá como base para crear proyectos de blockchain más avanzados con el lenguaje de programación Rust.
Tienes que practicar mucho y así serás un crack en la creación de blockchain con Rust.
Nota(s)
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.