Skip to content

Instantly share code, notes, and snippets.

@Alpa84
Created December 3, 2018 15:11
Show Gist options
  • Save Alpa84/162fedda55d218d5f165eb75c00d9ee8 to your computer and use it in GitHub Desktop.
Save Alpa84/162fedda55d218d5f165eb75c00d9ee8 to your computer and use it in GitHub Desktop.
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)
}
<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