¿Por qué el núcleo de Bitcoin crea transacciones bloqueadas por tiempo de forma predeterminada?

Recientemente me di cuenta de que Bitcoin Core está produciendo transacciones con un tiempo de bloqueo distinto de cero y números de secuencia de entradas que son 0xFFFFFFFE, aunque no le indiqué que lo hiciera. El tiempo de bloqueo parece ser el número de bloque actual.

  • ¿Cuál es la razón de este comportamiento?
  • ¿Cuál es el algoritmo para establecer el número de secuencia?

(Sé que al menos una entrada debe tener un número de secuencia menor que 0xFFFFFFFF. ¿El Core establece solo la primera entrada o todas las entradas? No pude verificar esto porque no tengo ninguna transacción con más de una entrada).

¡Gracias por sus respuestas!

Respuestas (1)

TL;DR: El objetivo es desalentar las reorganizaciones y aumentar la privacidad.

En wallet.cpp, justo arriba de donde se establece nLockTime , dice:

// Discourage fee sniping.
//
// For a large miner the value of the transactions in the best block and
// the mempool can exceed the cost of deliberately attempting to mine two
// blocks to orphan the current best block. By setting nLockTime such that
// only the next block can include the transaction, we discourage this
// practice as the height restricted and limited blocksize gives miners
// considering fee sniping fewer options for pulling off this attack.
//
// A simple way to think about this is from the wallet's point of view we
// always want the blockchain to move forward. By setting nLockTime this
// way we're basically making the statement that we only want this
// transaction to appear in the next block; we don't want to potentially
// encourage reorgs by allowing transactions to appear at lower heights
// than the next block in forks of the best chain.
//
// Of course, the subsidy is high enough, and transaction volume low
// enough, that fee sniping isn't a problem yet, but by implementing a fix
// now we ensure code won't be written that makes assumptions about
// nLockTime that preclude a fix later.

txNew.nLockTime = chainActive.Height();

// Secondly occasionally randomly pick a nLockTime even further back, so
// that transactions that are delayed after signing for whatever reason,
// e.g. high-latency mix networks and some CoinJoin implementations, have
// better privacy.

if (GetRandInt(10) == 0)
  txNew.nLockTime = std::max(0, (int)txNew.nLockTime - GetRandInt(100));

Como notó Martin Habovštiak, el número de secuencia se establece en MAX-1para cada entrada. Está en el código justo debajo de la sección de código mencionada anteriormente .

Parece que la secuencia está configurada en max()-1 para cada entrada. El código está justo debajo de lo que mencionaste . ¡Gracias por tu respuesta!
¿Tiene una versión de texto de la explicación? El código que publicaste es realmente ilegible en el móvil, porque necesitas desplazarte hacia la derecha para cada línea.
@Ferrybig: puse TL; DR en la parte superior.
¿Hay alguna razón para ese extraño número de secuencia? las razones indicadas en esta respuesta solo parecen explicar el nLockTime, no el número de secuencia
@knocte: nLockTimesolo está activo si el número de secuencia está debajo de UINT_MAX.