¿Qué impide el saldo negativo?

Esta es probablemente una pregunta estúpida que tiene una respuesta en alguna parte, pero no pude encontrar nada, ¡así que no dude en redirigirme!

Tengo una comprensión básica de cómo funciona la cadena de bloques de bitcoin, es decir, usted firma y transmite su transacción, los nodos la recogen y finalmente se incluye en un bloque que se extrae.

Entiendo que mientras no haya alguien que controle más del 50% de la potencia minera, es poco probable que pueda realizar un intento de doble gasto.

Sin embargo, ¿qué impide que alguien gaste más bitcoins de los que tiene? Por ejemplo, si tengo 1 BTC en mi dirección, supongamos que ejecuto un nodo de minería, ¿qué me impide intentar minar un bloque en el que gasto 1,2 BTC? ¿En qué punto del proceso se verifica el saldo de mi dirección para asegurarme de que tengo el bitcoin que quiero gastar?

Al principio pensé que eran los nodos los que verificaban que las transacciones en el mempool eran válidas antes de empezar a minarlas pero no puede ser, ya que podrías tener un nodo malicioso que haga lo que sea (aunque sería difícil sacar apagado sin suficiente poder de minería).

Este cheque debe estar de alguna manera "codificado" en alguna parte, en el sentido de que en realidad es imposible crear una transacción de bitcoin inexistente. ¿Podría alguien señalarme un recurso o explicar cómo funciona esto?

Junto a las respuestas detalladas a continuación, también quería vincularme a la wiki, que muestra las reglas del protocolo: en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages

Respuestas (3)

si tengo 1 BTC en mi dirección, supongamos que ejecuto un nodo de minería, ¿qué me impide intentar minar un bloque en el que gasto 1,2 BTC?

Este es el conjunto específico de código en Bitcoin Core que rechaza la transacción de cualquiera que esté poniendo menos dinero en la transacción (entradas) que el que reciben los destinatarios (salidas), por ejemplo, gastando más dinero del que han agregado a la transacción:

const CAmount value_out = tx.GetValueOut();
if (nValueIn < value_out) {
    return state.DoS(100, false, REJECT_INVALID, "bad-txns-in-belowout", false,
        strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(value_out)));
}

Técnicamente, esto no es verificar el "saldo" de una dirección, ya que en el propio sistema Bitcoin, las direcciones no tienen saldos. Cuando recibe bitcoins, los recibe en una salida (pago) identificable individualmente. Cuando gasta bitcoins, identifica exactamente qué salida (o salidas) desea gastar y gasta todo ese valor a la vez.

Si desea pagarle a alguien menos del valor total de uno de sus productos, agrega un producto adicional a su pago que le devuelve el resto. Esto es como pagar un refrigerio de $ 2 con un billete de $ 5 y recibir cambio de $ 3 para usted (y Bitcoin, llamamos a esa salida adicional pagándose a sí mismo la "salida de cambio" por analogía).

Entonces, en el código anterior, al verificar cada gasto en el sistema para evitar que alguien reciba más bitcoins de los que se gastaron inicialmente (excepto los bitcoins recién acuñados), evitamos saldos negativos.

¿En qué punto del proceso se verifica el saldo de mi dirección para asegurarme de que tengo el bitcoin que quiero gastar?

Como se explicó anteriormente, lo que se verifica son las entradas y las salidas (en lugar de los saldos de direcciones). En última instancia, se verifican cuando se recibe un bloque; sin embargo, el software puede verificar si hay transacciones no confirmadas y almacenar en caché el resultado para que pueda procesar los bloques recién recibidos más rápido.


Algo relacionado, tampoco puede pagarle a alguien una salida negativa:

    if (txout.nValue < 0)
        return state.DoS(100, false, REJECT_INVALID, "bad-txns-vout-negative");
¿Es ese el código real y, de ser así, por qué busca "menor que" en lugar de "no igual"? ¿No tendría más sentido exigir que cada transacción no provoque un cambio neto en la cantidad total de Bitcoin disponible?
@Mark La diferencia se paga como honorarios al minero.

A cada salida de la cadena se le asigna un valor determinado. Cuando gasta productos en una transacción, la suma de los nuevos productos creados no puede exceder la suma de los productos que se consumen (los insumos). Esto es parte de la validación de transacciones.

Además, incluso si un minero malicioso minara un bloque en el que creara bitcoins adicionales, el resto de la red lo rechazaría porque ya no cumpliría con las reglas de consenso que incluyen la verificación del monto de la transacción. Por lo tanto, el bloque del minero sería rechazado y perdería el dinero que gastó en extraer ese bloque, ya que la recompensa del bloque también se invalida.

¿Qué quieres decir con "el resto de la red lo rechazaría"? ¿Cómo se produce este rechazo?
Cualquier nodo que reciba una transacción o bloque que no siga las reglas simplemente se negará a transmitirlo más. Será como si nunca hubiera existido. Otros mineros continuarán extrayendo en una cadena que no incluye ese bloque.
Ya veo. ¿Eso significa que podría haber un "ataque de nodo", en el sentido de que ejecuta varios nodos completos que transmiten transacciones que no siguen las reglas?
Prácticamente terminaría ejecutando una red menor, ya que la red btc más grande aún no aceptaría sus transacciones. Todo lo que lograrías es un tenedor en el que solo tú estás

Sin embargo, ¿qué impide que alguien gaste más bitcoins de los que tiene? Por ejemplo, si tengo 1 BTC en mi dirección, supongamos que ejecuto un nodo de minería, ¿qué me impide intentar minar un bloque en el que gasto 1,2 BTC? ¿En qué punto del proceso se verifica el saldo de mi dirección para asegurarme de que tengo el bitcoin que quiero gastar?

Puede estar trabajando a partir de un modelo mental defectuoso. Bitcoin es un sistema de efectivo electrónico. Esto probablemente no significa lo que crees que significa.

https://bitzuma.com/posts/bitcoin-think-of-it-as-electronic-cash/

El dinero electrónico es un sistema en el que los usuarios intercambian tokens digitales por bienes y servicios. En Bitcoin, estos se denominan "monedas" o, más técnicamente, salidas de transacciones no gastadas (UTXO).

Una UTXO se gastará por completo en una transacción. El estado de la salida de una transacción, en otras palabras, solo se puede gastar o no gastar. Una salida (moneda) nunca puede tener un valor negativo; al igual que en los sistemas de efectivo físicos, es imposible que un billete de banco o una moneda tengan un valor negativo.

No hay cuentas en Bitcoin. Las direcciones son una construcción de nivel superior que hacen que parezca que existen cuentas. Es un concepto erróneo potencialmente peligroso:

https://bitzuma.com/posts/cinco-maneras-de-perder-dinero-con-bitcoin-cambiar-direcciones/

Gracias por las precisiones, son útiles. Lo que todavía me cuesta entender es dónde se realiza la verificación "es la salida negativa". Si tengo un programa ejecutándose en mi computadora, es mi computadora la que hará los cálculos y verificará si la salida es negativa. Si este es el papel de los nodos, ¿qué impide que un nodo sea malicioso? En otras palabras, ¿qué lo obliga a usar el código que verifica "la salida es negativa"? Tal vez no haya ninguno, pero entendí que incluso si tiene el poder de minería total, no puede hacer "nada", es decir, no puede crear más bitcoins, por ejemplo.
La verificación la realiza un nodo completo (el tuyo, por ejemplo). Si una transacción contiene una salida con un valor negativo, el bloque que lo contiene será rechazado como inválido. Esto se aplica incluso si el bloque tiene suficiente prueba de trabajo. El comportamiento general de la red es una combinación del comportamiento de los nodos individuales. En otras palabras, todos los nodos honestos también rechazarán dicho bloque.
Gracias, eso aclara las cosas. ¿Significa eso que si una red contiene más nodos maliciosos que honestos, sería posible gastar bitcoins inexistentes o crear bitcoins?
No. El propósito de la red es permitir que los usuarios detecten el doble gasto. Un nodo nunca aceptará un bloque gastando monedas inexistentes o creando dinero de la nada. Pero sí necesita la red como control del doble gasto. La red hace esto creando un costo por reescribir la cadena de bloques en forma de prueba de trabajo.