• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Simulador FIRE (Financial Independence, Retire Early)
    • Herramientas
      • Formateador / Minificador de JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Validación de transacciones: creación de una criptomoneda (5º Parte)

junio 4, 2018 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 5 minutos

Blockchain

La entrada anterior de la serie introdujo el concepto de transacción dentro de una criptomoneda. Mediante las transacciones se puede mover el dinero que existe en una cuenta a otra. Permitiendo así realizar una de las principales funciones de una moneda, transferir valor entre los usuarios. En esta entrada continúa profundizando en este concepto estudiando la validación de las transacciones. Permitiendo identificar así si una transacción es valida y cuales son las transacciones aún no gastadas en la cadena de bloques.

Transacciones no gastadas

En primer lugar, es necesario crear un nuevo objeto para registrar las transacciones no gastadas. En este objeto se ha de registrar el hash, el índice, la dirección y la cantidad. Para esto se puede utilizar el siguiente código:

class UnspentTransaction:
    def __init__(self, hash_id, index, address, amount):
        self.hash_id = hash_id
        self.index = index
        self.address = address
        self.amount = amount

La segunda tarea es crear una clase que contenga el listado de las transacciones no gastadas. Permitiendo de este modo disponer de todas estas en un único objeto. En nuestra implementación (el código completo de la implementación se puede encontrar en el respiratorio) se llama UnspentList y su definición es la siguiente:

Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
En Analytics Lane
Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane

class UnspentList:
    def __init__(self):
        self.unspent = []
        self.unconfirmed = []

    def __spend(self, transaction):
        use_transactions = []

        if not isinstance(transaction.inputs, datetime):
            for inputs in transaction.inputs:
                for unspent in self.unspent:
                    if unspent.hash_id == inputs.hash_id and \
                            unspent.index == inputs.index:
                        use_transactions.append(unspent)

        for unspent in use_transactions:
            self.unspent.remove(unspent)

        for index in range(len(transaction.outputs)):
            unspent = UnspentTransaction(transaction.hash_id, index,
                                         transaction.outputs[index].address,
                                         transaction.outputs[index].amount)

            self.unspent.append(unspent)

    def address_amount(self, address):
        amount = 0

        transactions = self.address_transactions(address)

        for transaction in transactions:
            amount += transaction.amount

        return amount

    def address_transactions(self, address):
        result = []

        for unspent in self.unspent:
            if unspent.address == address:
                result.append(unspent)

        for unconfirmed in self.unconfirmed:
            if not isinstance(unconfirmed.inputs, datetime):
                for unconfirmed_inputs in unconfirmed.inputs:
                    for unspent in result:
                        if unconfirmed_inputs.index == unspent.index and \
                                unconfirmed_inputs.hash_id == unspent.hash_id:
                            result.remove(unspent)

        return result

    def append_unconfirmed(self, transaction):
        if self.validate_transaction(transaction):
            self.unconfirmed.append(transaction)
            return True

        return False

    def confirm_unconfirmed(self):
        for unconfirmed in self.unconfirmed:
            self.__spend(unconfirmed)

        self.unconfirmed = []

        return True

    def spend_transaction(self, transaction):
        if self.validate_transaction(transaction):
            self.__spend(transaction)

            # Finish the spend
            return True

        return False

    def validate_transaction(self, transaction):
        if not isinstance(transaction, Transaction):
            return False

        use_transactions = []
        need_validation = True

        if transaction.inputs is None or isinstance(transaction.inputs, datetime):
            need_validation = False

            for unconfirmed in self.unconfirmed:
                for unconfirmed_outputs in unconfirmed.outputs:
                    for outputs in transaction.outputs:
                        if unconfirmed_outputs == outputs:
                            return False
        else:
            for inputs in transaction.inputs:
                for unspent in self.unspent:
                    for unconfirmed in self.unconfirmed:
                        for unconfirmed_inputs in unconfirmed.inputs:
                            if unconfirmed_inputs == inputs:
                                return False

                    if unspent.hash_id == inputs.hash_id and \
                            unspent.index == inputs.index:
                        if is_signature_valid(transaction.hash_id,
                                              transaction.signature, unspent.address):
                            use_transactions.append(unspent)
                        else:
                            return False

        if need_validation and len(transaction.inputs) != len(use_transactions):
            return False

        total_in = 0
        total_out = 0

        for unspent in use_transactions:
            total_in += unspent.amount

        for output in transaction.outputs:
            total_out += output.amount

        if need_validation and total_in != total_out:
            return False

        return True

Una vez definidas estas clases se puede profundizar en el funcionamiento de estas. Inicialmente el constructor solamente crea dos listas de objetos: las transacciones que no han sido gastadas (unspent) y las transacciones que no han sido confirmadas (unconfirmed).

Validación de transacciones

Uno de los primeros métodos de interés en esta clase es validate_transaction. Este método se utiliza par comprobar si una transacción es valida y agregarla a listados de transacciones sin confirmar. La primera comprobación es obvia, validar que el objeto que se ha pasado es de clase Transaction. Posteriormente continua el resto de las validaciones que son más interesantes.

En el proceso de validación se comprueba si la clase transacción contiene operaciones de entrada. En caso de que no sea así, esta transacción puede ser la transacción de recompensa que recibe el que ha minado el bloque. Estas requieren un proceso de validación especial. Mientras que en el caso contrario será una transacción normal. Estas requieren que se compruebe

  • Todas las transacciones de entrada se encuentran en la lista de transacciones no gastadas.
  • Todas las transacciones de entrada están correctamente firmadas con la clave privada de la cuenta ordenante.
  • La cantidad de todas las operaciones de entrada es igual a todas las operaciones de salida.

En el caso de que no se verifique la alguna de estas comprobaciones la operación no será valida. Por lo que seria rechazada a la hora de agregarla a la cadena de bloques. En caso contrario esta se podría gastar.

Nótese que tal como se ha definido en la entrada anterior la clase Transaction todas las operaciones de entrada han de proceder de la misma cuenta. Esta es una limitación de esta implementación que podría resolver fácilmente, pero se encuentra fuera del alcance de esta implementación.
# Gastar una transacción

El método que se ha definido para gastar una transacción es spend_transaction. Este lo que hace es comprobar que la transacción se puede gastar y llama al método interno __spend. Este método, en el primer bucle, elimina todas las transacciones entrantes. Posteriormente, las elimina del listado de transacciones disponibles para que no puedan volverse a gastar.

Finalmente, todas las transacciones de salida son agregadas al listado de transacciones sin gastar. Por lo que los titulares de las misas las tengan disponibles.

Publicidad


Transacciones sin confirmar

Utilizar un bloque de la cadena de bloques para guardad una única transacción supone malgastar recursos. Los normal es que las transacciones lleguen a un nodo para validar y guardar en la cadena de bloques. Pero esto no se realiza hasta que el bloque tiene un tamaño mínimo. Mientras no se guarda en la cadena de bloques estas son las transacciones sin confirmar. Transacciones validas que se ha guardado hasta que puedan ser agregadas a la cadena de bloques.

En la clase existe un método para agregar estas transacciones (append_unconfirmed) y otro para confirmarlas (confirm_unconfirmed). El primero confirma que la operación es valida y la agrega a la lista de operaciones sin confirmar. En el segundo se gastan todas estas operaciones, método que se ha de llamar cuando le bloque halla sido agregado a la cadena.

Gestión de las cuentas

Además de los métodos descritos anteriormente, en esta clase se existen otros creados para obtener información de las cuentas. Estos son, uno una para obtener el saldo sin gastar disponible en una cuenta (address_amount) y otro para obtener el listado de transacciones sin gastar de una cuenta (address_transactions).

Conclusiones

En esta entrada se ha visto como operar con las transacciones que dan lugar a la creación de una criptomoneda. En una próxima entrada se tratará el concepto de “Wallet”, clave para la abstraer a los usuarios del concepto de transacción.

Imágenes: Pixabay (mmi9)

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicidad


Publicaciones relacionadas

  • Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
  • Nueva calculadora de préstamos e hipotecas en el laboratorio de aplicaciones de Analytics Lane
  • Hardening avanzado de NGINX: CSP, OCSP Stapling y defensa en profundidad
  • Nuevo generador y verificador de hashes en el laboratorio de aplicaciones de Analytics Lane
  • Nueva simulación de la estrategia Martingala en ruleta en el laboratorio de aplicaciones de Analytics Lane
  • Exactitud, precisión, recall… y los errores que cometemos al interpretarlas en proyectos reales
  • Nuevo simulador del problema de Monty Hall en el laboratorio de aplicaciones de Analytics Lane
  • Nuevo simulador interactivo de K-Means en el laboratorio de aplicaciones de Analytics Lane
  • Por qué los chatbots de inteligencia artificial parecen estar siempre de acuerdo contigo – Conversar con una inteligencia artificial – Parte I

Publicado en: Criptografía Etiquetado como: Blockchain, Criptomonedas

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Nueva herramienta: Comparador y Formateador de Texto y JSON en el laboratorio de Analytics Lane

abril 21, 2026 Por Daniel Rodríguez

Chatbots vs redes sociales: la diferencia clave entre la inteligencia artificial y los algoritmos de recomendación – Conversar con una inteligencia artificial – Parte II

abril 21, 2026 Por Daniel Rodríguez

Nueva Calculadora de Estadísticos Descriptivos en el laboratorio de aplicaciones de Analytics Lane

abril 20, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Buscar en Excel con dos o más criterios publicado el septiembre 7, 2022 | en Herramientas
  • Gráfica con los datos y las anomalías detectadas con OneClass SVM One-Class SVM: Detección de anomalías con máquinas de vector soporte publicado el marzo 15, 2024 | en Ciencia de datos
  • Nueva herramienta: Comparador y Formateador de Texto y JSON en el laboratorio de Analytics Lane publicado el abril 21, 2026 | en Noticias
  • Método del codo (Elbow method) para seleccionar el número óptimo de clústeres en K-means publicado el junio 9, 2023 | en Ciencia de datos
  • Cómo desinstalar Oracle Database 19c en Windows publicado el noviembre 25, 2022 | en Herramientas

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.9 (11)

Pandas: Cambiar los tipos de datos en los DataFrames

Comentarios recientes

  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • CARLOS ARETURO BELLO CACERES en Justicio: La herramienta gratuita de IA para consultas legales
  • Piera en Ecuaciones multilínea en Markdown

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto