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?
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");
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.
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/
pebwindkraft