Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

254
Vistas
TypeError: no se pueden leer las propiedades de undefined (leyendo 'longitud') - Blockchain JS

Sigo recibiendo un error que indica que no puede leer el retorno en getLatestBlock. Literalmente seguí un video de YouTube paso a paso. Funcionó para él. No entiendo qué estoy haciendo mal.

El video se lanzó en 2017. ¿Ha habido cambios en JS que desconozco? Gracias a todos.

 const SHA256 = require("crypto-js/sha256"); class Block { constructor(index, timestamp, data, previousHash = "") { this.index = index; this.timestamp = timestamp; this.data = data; this.previousHash = previousHash; this.hash = this.calculateHash(); } // Hash identifies the block calculateHash() { return SHA256( this.index + this.previousHash + this.timestamp + JSON.stringify(this.data) ).toString(); } } class Blockchain { contstructor() { this.chain = [this.createGenesisBlock()]; } createGenesisBlock() { return new Block(0, "01/01/2017", "Genesis block", "0"); } getLatestBlock() { this.chain[this.chain.length - 1]; } addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.hash = newBlock.calculateHash(); this.chain.push(newBlock); } } let savejeeCoin = new Blockchain(); savejeeCoin.addBlock(new Block(1, "10/07/2017", { amount: 4 })); savejeeCoin.addBlock(new Block(2, "12/07/2017", { amount: 10 })); console.log(JSON.stringify(savejeeCoin, null, 4));
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

En primer lugar, hay un error tipográfico en su clase Blockchain : contstructor debe ser constructor . Es por eso que no inicializas tus cosas y obtienes el error.

Refactorizaría un poco la cosa:

  1. Permitiendo establecer datos iniciales, usando valores predeterminados
  2. Mueva el hash actual dentro del bloque, no me gusta mucho que cada bloque contenga (y mantenga) el hash anterior (y la mitad de la memoria requerida de esta manera).
  3. Haga que los miembros sean privados para que solo se puedan escribir en la creación de bloques
  4. Agregue getters para leer valores después de la creación
  5. Reutilice addBlock para crear el bloque inicial
  6. No pase la fecha como una cadena, pero use la marca de tiempo
  7. Guarde la marca de tiempo actual en la creación (evita posibles fraudes)
  8. Evite el objeto de datos, porque es demasiado arbitrario. Use otra clase si necesita más datos, mientras tanto, solo guardé la cantidad como número.
  9. Concat params de manera diferente con un separador (esto podría evitarse, pero fue bueno para mis ojos 😂)
  10. No establezca propiedades desde el exterior (como hash) después de llamar al constructor de bloques. ¡Todo (como se dijo antes) se establece en la creación y debería ser inmutable!

Espero que esto ayude... Me parece más OOP.

Salud

 const SHA256 = require("crypto-js/sha256"); class Block { get amount() { return this._amount; } get hash() { return this._hash; } get index() { return this._index; } get timestamp() { return this._timestamp; } constructor(index, amount, prevHash = '') { // make all props private so they can be written only once this._index = index; this._timestamp = +new Date(); this._amount = amount; this._hash = SHA256( `${this.index}-${prevHash}-${this.timestamp}-${this.amount}` ).toString(); } } class BlockChain { get chain() { return this._chain; } constructor() { this._chain = []; this.addBlock(0, 'Genesis block'); } getCurrentHash() { this.chain[this.chain.length - 1].hash; } addBlock(amount, prevHash = this.getCurrentHash()) { this.chain.push(new Block(this.chain.length - 1, amount, prevHash)); } } let savejeeCoin = new Blockchain(); savejeeCoin.addBlock(4); savejeeCoin.addBlock(10); console.log(JSON.stringify(savejeeCoin, null, 4));

Blitz aquí donde implementé miembros privados (#) y una compilación fn para imprimir bloques individuales y la cadena...

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda