UC-IIC3253 / 2022

37 stars 6 forks source link

[T1-P3] Ejemplos #34

Closed mugartec closed 2 years ago

mugartec commented 2 years ago

Para asegurar que sus respuestas a la pregunta 3 consideran el formato que esperamos, aquí les dejo algunos ejemplos de código. Comenzamos importando hashlib y las respuestas a la pregunta 3:

>>> import hashlib
>>> from pregunta3 import MerkleTree, verify

Definimos dos funciones de hash, md5 y sha256:

>>> def MD5(string):
...   return hashlib.md5(string.encode()).hexdigest()
... 
>>> def SHA256(string):
...   return hashlib.sha256(string.encode()).hexdigest()
...

A continuación mostramos dos ejecuciones que usan la clase MerkleTree y la función verify. Comenzamos con MD5, definiendo un árbol y mostrando su raíz:

>>> tree = MerkleTree(['asdf', 'wena', '1234', 'hola', 'chao'], MD5)
>>> tree.get_root()
83bed7f2a3d29544d53b3778ceaf1bda

Ahora mostramos una prueba de que el string 1234 está en el árbol.

>>> proof = tree.get_proof_for('1234')
>>> proof
[('4d186321c1a7f0f354b297e8914ab240', 'd'), ('ad21ab3205307ce250876e1fe2de3f98', 'i'), ('9986b7ea5fc6d6229d926df3795c6b6d', 'd')]

Ahora verificamos que esta prueba es correcta con la función verify:

>>> verify(tree.get_root(), '1234', proof, MD5)
True

Si pedimos una prueba de un string que no está en el árbol obtenemos None:

>>> tree.get_proof_for('hello')
None

Finalmente creamos una prueba incorrecta quitando el último elemento a la prueba que teníamos antes

>>> wrong_proof = proof[:-1]
>>> verify(tree.get_root(), '1234', wrong_proof, MD5)
False

Vamos ahora al ejemplo con SHA256. Creamos un árbol de 8 hojas e impriminos su raíz:

>>> tree = MerkleTree(['IIC3253', 'es', 'el', 'mejor', 'curso', 'y', 'lo', 'sabes'], SHA256)
>>> tree.get_root()
'366b9d1289b2e34c466374f840f1ef6c40ecd352c422a4cfca8bc276293b954c'

Obtenemos las pruebas para dos strings que pertenecen al árbol:

>>> proof = tree.get_proof_for('y')
>>> proof
[('a4a670183ad8c9972bce2f85fcefbd0e15118f3310bb6dbd217b847a7578ff17', 'i'), ('2d26e5d60e3a43424820af5a027f0a4f474a3bd1783adbcf2c8af237a1f23acf', 'd'), ('7b138c7c9f60b91765dc2452a6152090a9b31433e0a103529eb6f1c473ca8e47', 'i')]
>>> proof2 = tree.get_proof_for('el')
>>> proof2
[('a9222478217b151579d5f0b500093fa0e636104b14c42f0fde379ea65ad69159', 'd'), ('837c761ca2be72cddd36e1770bb07e23739a313564035097e1368676795cd5da', 'i'), ('d62c0418530d66d60615f0ec2a2bf4ee840e1538c34333a090a1f0e509d59dc4', 'd')]

Finalmente verificamos las pruebas, y vemos que cada prueba corresponde a su propio string.

>>> verify(tree.get_root(), 'y', proof, SHA256)
True
>>> verify(tree.get_root(), 'y', proof2, SHA256)
False
>>> verify(tree.get_root(), 'el', proof2, SHA256)
True
>>> verify(tree.get_root(), 'el', proof, SHA256)
False
mugartec commented 2 years ago

@mathiasvaldebenito y @csolguin no entendí la reacción de los :eyes:, hay algún error o esperan algo más?

csolguin commented 2 years ago

@mathiasvaldebenitoy@csolguin no entendí la reacción de los👀, hay algun error o esperan algo mas?

Por mi parte, al momento de "ver" la issue reaccioné con el emoji de "ojos", solamente para dar a entender que lo estaba probando. Lamento la confusión causada y gracias por los ejemplos.

mathiasvaldebenito commented 2 years ago

lo mismo que @csolguin jajaja perdón si causó confusión!