Created
December 3, 2018 15:11
-
-
Save Alpa84/162fedda55d218d5f165eb75c00d9ee8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var cadenaExistente = [ | |
{ // dar objetos | |
hashBloqueAnterior: '', | |
da: 'nadie', // por ser el primer bloque | |
recibe: 'Ale', | |
cuanto: 30, | |
clave: '40', // no se va a pedir por ser el primer bloque | |
} | |
] | |
var transaccionEjemplo = { | |
da: 'Ale', | |
recibe: 'Pablo', | |
cuanto: 20, | |
} | |
function verSiElQueDaTieneLaPlata(transaccion, cadenaExistente) { | |
var elQueDaTiene = calcularCuantoTieneElQueDa(cadenaExistente, transaccion.da) | |
if ( transaccion.cuanto <= elQueDaTiene ) { | |
return true //dar true false | |
} else { | |
return false | |
} | |
} | |
function calcularCuantoTieneElQueDa(cadenaExistente, calcularPara) { | |
var cuantoTiene = 0 // reforzar scope | |
for (bloque of cadenaExistente) { | |
if (bloque.da == calcularPara) { | |
cuantoTiene = cuantoTiene - bloque.cuanto | |
} | |
if (bloque.recibe == calcularPara) { | |
cuantoTiene = cuantoTiene + bloque.cuanto | |
} | |
} | |
return cuantoTiene | |
} | |
function buscarUltimoHash (cadenaExistente) { | |
var ultimoBloque = cadenaExistente[cadenaExistente.length -1] // dar length para ver el ultimo | |
var bloque = dividirElBloque(ultimoBloque) | |
return bloque[3] | |
} | |
function dividirElBloque(ultimoBloque) { | |
return ultimoBloque.split(',') | |
} | |
function empiezaConCero(hash) { | |
return hash.split('')[0] === '0' | |
} | |
function hashearBloque(bloque) { | |
return md5(bloque.hashBloqueAnterior + ',' + bloque.da + ',' + bloque.recibe + ',' + bloque.cuanto + ',' + bloque.clave) | |
} | |
function verQueAgregarleParaQueElHashEmpieceConCero(bloqueSinClave) { | |
var clave = 0 // otro reforzar scope | |
while (true){ // dar while | |
bloqueSinClave.clave = clave | |
var resultado = hashearBloque(bloqueSinClave) | |
empieza = empiezaConCero(resultado) // split e index | |
if (empieza ){ | |
return clave | |
} else { | |
clave = clave + 1 | |
} | |
} | |
} | |
function recibirTransaccion(transaccion) { | |
var vale = verSiElQueDaTieneLaPlata(transaccion, cadenaExistente) | |
if (vale) { | |
var nuevoBloque = { | |
cuanto: transaccion.cuanto, | |
da: transaccion.da, | |
recibe: transaccion.recibe, | |
} | |
var ultimoBloque = cadenaExistente[cadenaExistente.length - 1] | |
nuevoBloque.hashBloqueAnterior = hashearBloque(ultimoBloque) | |
var clave = verQueAgregarleParaQueElHashEmpieceConCero(nuevoBloque) | |
nuevoBloque.clave = clave | |
cadenaExistente.push(nuevoBloque) | |
// mandarATodosLaCadenaConBloqueNuevo(cadenaExistente) | |
var cadenaString = JSON.stringify(cadenaExistente, null, '\t') | |
document.getElementById('cadena').innerHTML = cadenaString | |
console.log(cadenaExistente) | |
} else { | |
alert('no vale la transacción, la vamos a ignorar') | |
} | |
} | |
function verSiElBloqueCumpleLasReglas(bloque, indexBloque, cadenaRecibida) { | |
if (indexBloque === 0) { // si es el primer bloque no comprobar nada | |
return true | |
} | |
var hash = hashearBloque(bloque) | |
if (!empiezaConCero(hash) ) { | |
alert('el hash del bloque no empieza con 0') | |
return false | |
} | |
var tieneRealmenteElHashDelBloqueAnterior = bloque.hashBloqueAnterior === hashearBloque(cadenaRecibida[indexBloque -1]) | |
if (!tieneRealmenteElHashDelBloqueAnterior) { | |
alert('el bloque no tiene el hash del bloque anterior') | |
return false | |
} | |
var cadenaHastaEsteBloque = cadenaRecibida.slice(0, indexBloque) | |
var valeLaTransaccion = verSiElQueDaTieneLaPlata(bloque, cadenaHastaEsteBloque) | |
if (!valeLaTransaccion) { | |
alert('hay una transaccion en la que el que da no tiene la plata suficiente para dar') | |
return false | |
} | |
return true | |
} | |
function recibirUnaNuevaCadena(cadenaRecibida) { | |
var esValida = verSiLaCadenaEsValida(cadenaRecibida) | |
if (esValida) { | |
// pararLaBusquedaSiEstaActiva() | |
if (cadenaRecibida.length > cadenaExistente.length) { | |
alert('la cadena recibida es valida y mas larga que la existente, vamos a usar esa') | |
cadenaExistente = cadenaRecibida | |
} else { | |
alert('la cadena recibida no es mas larga que la que tenemos') | |
} | |
} else { | |
alert('la cadena recibida no es valida') | |
} | |
} | |
function verSiLaCadenaEsValida(cadenaRecibida) { | |
for (var [indexBloque, bloque] of cadenaRecibida.entries()) { | |
var cumple = verSiElBloqueCumpleLasReglas(bloque, indexBloque, cadenaRecibida) | |
if (!cumple) { return false} | |
} | |
return true | |
} | |
// recibirTransaccion(transaccionEjemplo) | |
function iniciarTransaccion() { | |
var transaccion = { | |
da: document.getElementById('da').value, | |
recibe: document.getElementById('recibe').value, | |
cuanto: parseFloat(document.getElementById('cuanto').value), | |
} | |
recibirTransaccion(transaccion) | |
} | |
function iniciarRecepcionCadena() { | |
var texto = document.getElementById('cadena').value | |
var cadena = JSON.parse(texto ) | |
recibirUnaNuevaCadena(cadena) | |
} | |
function hashearInput() { | |
var texto = document.getElementById('bloque').value | |
var bloque = JSON.parse(texto ) | |
var hash = document.getElementById('hash') | |
hash.innerHTML = hashearBloque(bloque) | |
} | |
function calcularClave() { | |
var texto = document.getElementById('bloqueSinClave').value | |
var bloqueSinClave = JSON.parse(texto ) | |
var clave = document.getElementById('clave') | |
clave.innerHTML = verQueAgregarleParaQueElHashEmpieceConCero(bloqueSinClave) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<body> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.10.0/js/md5.min.js"></script> | |
<script src="block.js"></script> | |
<p>da</p> | |
<input id="da" value="Ale"></input> | |
<p>recibe</p> | |
<input id="recibe" value="Pablo"></input> | |
<p>cuanto</p> | |
<input id="cuanto" type="number" value=20></input> | |
<button onclick="iniciarTransaccion()"> generar transacción</button> | |
<p>recibir una cadena</p> | |
<textarea id="cadena" rows="40" cols="100" >[ | |
{ | |
"hashBloqueAnterior": "", | |
"da": "nadie", | |
"recibe": "Ale", | |
"cuanto": 30, | |
"clave": "40" | |
}, | |
{ | |
"cuanto": 10, | |
"da": "Ale", | |
"recibe": "Pablo", | |
"hashBloqueAnterior": "04db96a43a676580c8948995db89185b", | |
"clave": 5 | |
} | |
] | |
</textarea> | |
<button onclick="iniciarRecepcionCadena()"> recibir esta cadena</button> | |
<p>hashear bloque</p> | |
<textarea id="bloque" rows="9" cols="100" >{ | |
"cuanto": 10, | |
"da": "Ale", | |
"recibe": "Pablo", | |
"hashBloqueAnterior": "04db96a43a676580c8948995db89185b", | |
"clave": 5 | |
} | |
</textarea> | |
<button onclick="hashearInput()">hashear bloque</button> | |
<p id="hash"> </p> | |
<p>calcular clave</p> | |
<textarea id="bloqueSinClave" rows="9" cols="100" >{ | |
"cuanto": 10, | |
"da": "Ale", | |
"recibe": "Pablo", | |
"hashBloqueAnterior": "04db96a43a676580c8948995db89185b" | |
} | |
</textarea> | |
<button onclick="calcularClave()">Calcular Clave</button> | |
<p id="clave"> </p> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment