• 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
      • Calculadora XIRR con Flujos Irregulares
      • Simulador FIRE (Financial Independence, Retire Early)
    • Negocios
      • CLV
      • Scoring
    • Herramientas
      • Formateador / Minificador de JSON
      • Conversor CSV ↔ 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 test de normalidad interactivo en el laboratorio de Analytics Lane
En Analytics Lane
Nuevo test de normalidad interactivo en el laboratorio 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 test de normalidad interactivo en el laboratorio de Analytics Lane
  • Nuevo conversor de timestamp Unix en el laboratorio de Analytics Lane
  • Calculadora de Contrastes de Hipótesis: interpreta correctamente el p-valor y toma decisiones estadísticas con confianza
  • Calculadora de Tamaño del Efecto: la herramienta clave para entender cuánto importa realmente una diferencia
  • Simulador de DBSCAN: descubre cómo encontrar clusters reales (y ruido) sin fijar K
  • Conversor de Colores: convierte, compara y valida cualquier color en tiempo real
  • Analytics Lane lanza su Generador de UUIDs: identificadores únicos, seguros y listos para producción en segundos
  • 1200 publicaciones en Analytics Lane
  • Analytics Lane lanza su Conversor TIN ↔ TAE: la herramienta definitiva para entender el coste real de depósitos, préstamos e hipotecas

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

De la Regresión Logística al Scorecard: La Transformación Matemática

mayo 19, 2026 Por Daniel Rodríguez

Noticias

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

mayo 18, 2026 Por Daniel Rodríguez

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

mayo 14, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Gráficos de correlación en Seaborn: Mapas de calor y gráficos de pares publicado el julio 27, 2023 | en Python
  • Números calientes en Bonoloto: mismos resultados que el azar publicado el octubre 9, 2020 | en Opinión
  • Copiar y pegar Activar copiar y pegar en VirtualBox publicado el mayo 1, 2019 | en Herramientas
  • Hoja de cálculo para repartir los escaños en base al método D’Hont Aplicar el método D’Hondt en Excel publicado el abril 14, 2021 | en Herramientas
  • 7 extensiones de Visual Studio Code para ciencia de datos publicado el enero 27, 2023 | 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.1 (11)

Aplicar el método D’Hondt en Excel

Comentarios recientes

  • bif en JSON en bases de datos: cuándo es buena idea y cuándo no
  • bif en Cómo desinstalar Oracle Database 19c en Windows
  • 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

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