¿Qué es un "tipo de transacción inseguro", como lo menciona Bitcoin Wallet para Android?

Estoy ejecutando Bitcoin Core v0.11.0.0-gd26f951 (64-bit)Ubuntu en casa y lo he instalado Bitcoin Wallet for Androiden mi teléfono. Envié dos transacciones desde casa a mi teléfono: Primero , Segundo . Uno tenía una tarifa muy baja y tardó días, así que envié otro con una tarifa un poco más alta que tardó solo unos minutos. Sin embargo, ambos llegaron, ya tienen casi dos mil confirmaciones y se muestran en verde en la aplicación.

La aplicación Bitcoin ahora (lo noté por primera vez hoy y no creo que lo haya dicho inicialmente) dice

 This payment was delayed because the sender used an insecure transaction type.

debajo de ambas transacciones. ¿Qué significa eso?

Busqué en Google la frase y obtuve exactamente un resultado, en un paquete de recursos que es parte del código para el proyecto de billetera bitcoin en github , que parece ser la aplicación de Android. La clave correspondiente es transaction_row_message_received_rbf, que no generó ningún resultado.

¿Alguien puede decirme qué podría ser este "tipo de transacción insegura" y por qué Bitcoin-Qt lo usaría? ¿Debo prevenirlo, y si es así, cómo lo hago?

Edité la pregunta y la respuesta para incluir toda la información de los numerosos comentarios y eliminé los comentarios para reducir el desorden visual.
He estado en contacto con el mantenedor de Bitcoin Wallet para Android y BitcoinJ. Solo para confirmar, las dos transacciones que publicó en un comentario aquí y que he editado en su pregunta son, de hecho, las que aparecen como "tipo de transacción insegura". El mantenedor no pudo reproducir el problema, por lo que solo estamos verificando nuestras suposiciones.
@Murch Creo que sí, aunque el proceso de determinar la identificación de la transacción me parece un poco misterioso. Bitcoin Wallet para Android no los muestra, así que solo busqué la dirección de destino en blockchain.info. Suponiendo que Bitcoin Core haya registrado los ID, puedo volver a verificarlos cuando llegue a casa.
Eso sería maravilloso. Si necesita ayuda, simplemente publique aquí. Podría ayudar cuando vuelva más tarde.
@Murch Verifiqué que esos ID de transacción son correctos, aunque Bitcoin Core agrega un "-000" a ambos, no sé qué significa eso. Y aquí hay una captura de pantalla de la aplicación que muestra el mensaje: drive.google.com/file/d/0B3HeHhx785UOWmdSdUo0SHpIcFU/…
Gracias, he agregado su información y la captura de pantalla al informe de errores.
@PepijnSchmitz Hola Pepijn, actualmente estoy trabajando en el error que estás experimentando. ¿Podría hacerme un favor y usar la función de informe de errores en la aplicación (Opciones> Configuración> Diagnóstico> Informar problema) para enviarnos el volcado de su billetera?
@AndreasSchildbach Claro. ¿Dónde debo enviarlo?
A la dirección de correo electrónico previamente completada.
@AndreasSchildbach ¡Listo!
Gracias a su volcado, pude reproducir el problema y solucionarlo. No estaba en cómo se analizaron los datos de la red P2P, sino que hubo un error en la serialización protobuf del campo de número de secuencia. Se está implementando una versión actualizada de Bitcoin Wallet (v4.49). La cola se puede omitir descargando desde github.com/bitcoin-wallet/bitcoin-wallet/releases
@AndreasSchildbach ¡Gracias! ¿La actualización también arreglará las transacciones que ya están en la billetera, o solo las futuras?
@PepijnSchmitz También debería arreglar su billetera actual. Sería bueno si pudiera confirmar que este es realmente el caso.
@AndreasSchildbach Instalé la nueva versión de la aplicación y, de hecho, solucionó las advertencias. ¡Gracias!

Respuestas (1)

TL;RD:

Parece que las transacciones Bitcoin Wallet for Androidse etiquetan incorrectamente como debidas a un error en . El problema ha sido informado . No necesitas hacer nada.nLockTimeOptInRBFbitcoinj


Aparentemente, Bitcoin Wallet para Android reconoció su transacción como OptInRBF(como lo indica el código que encontró). La advertencia que está viendo se agregó a la aplicación recién el 10 de marzo de 2016 .

¿Qué es OptInRBF?

OptInRBFes la abreviatura de "Opt-in replace-by-fee", que se agregó a Bitcoin Core en 0.12.0. La nueva versión permite que Bitcoin Core reciba y trate correctamente las transacciones de reemplazo por tarifa. Sin embargo, Bitcoin Core no puede crear transacciones rbf todavía. Las billeteras tienen que "suscribirse" para enviarlas.

Reemplazar por tarifa es un indicador que se puede configurar en las transacciones para comunicar que es posible que desee cambiar la transacción antes de que se incluya en un bloque . Por lo tanto, tales transacciones no deben considerarse confiables hasta que obtengan su primera confirmación. Una vez incluidos en un bloque, son tan seguros como cualquier otra transacción.
Los grupos de minería que admiten rbf permitirán que una versión más nueva de la transacción reemplace a la anterior, especialmente si la transacción más nueva paga una tarifa más alta. Esto es útil, por ejemplo, para aumentar la tarifa de una transacción cuando está atascada, o para combinar varias transacciones en una sola cuando decide enviar otra transacción antes de que se confirme una anterior.

¿De dónde viene la advertencia?

Mirando los datos sin procesar de la primera transacción , resulta que el sequencenúmero de la transacción está por debajo del valor máximo: muestra 0xFEFFFFFFmientras que el máximo sería 0xFFFFFFFF. La secuencia con un Een segundo lugar es un little endian sin signo largo para "uno por debajo del máximo". Esta es la secuencia de una nLockTimetransacción .

OptInRBFtienen secuencias que son más pequeñas que la nLockTimesecuencia, es decir, sequence < MAX - 1. Por lo tanto, parece que bitcoinjo Bitcoin Wallet for Androidclasifica erróneamente nLockTimelas transacciones como OptInRBF. El problema es que desde Bitcoin Core 0.11 todas las transacciones tienen una nLockTimesecuencia.

A primera vista, el bitcoinjcódigo que verifica si una transacción está OptInRBFbien:

public boolean isOptInFullRBF() {
    return sequence < NO_SEQUENCE - 1;
}

Sin embargo, Java usa de forma nativa el formato big endian en lugar del formato little endian.
<especulación>Por lo tanto, puede haber un problema con NO_SEQUENCE - 1el que podría resolverse 0xFFFFFFFEy la nLockTimesecuencia 0xFEFFFFFFleída como big endian parecería mucho más pequeña que eso y, por lo tanto, podría etiquetarse como OptInRBF.</especulación> 1

He informado del problema y estoy tratando de crear una corrección de errores .


1 Resulta que mi especulación era incorrecta. BitcoinJy Bitcoin Wallet for Androidmaneje las transacciones con la nLockTimesecuencia fina, y analícela usando el formato little endian según sea necesario. Hasta ahora, el mantenedor no pudo reproducir el problema descrito con las transacciones proporcionadas (en su lugar, se mostraron correctamente sin previo aviso). Por lo tanto, aún se desconoce el motivo de la aparición de la advertencia.

Gracias a Pepijn Schmitz, Gregory Sanders, Andreas Schildbach y Wladimir van der Laan por su ayuda para resolver esto.

Solo para aclarar esto, bitcoinj (y Bitcoin Wallet) está usando little endian para analizar este campo.
@AndreasSchildbach: Gracias, actualicé mi respuesta para reflejar la comprensión actual del problema. Perdón por saltar a esa conclusión, parecía ser una buena explicación. ;)
¿Alguna explicación de por qué aparecería el mensaje en una transacción multigrado que utilizó OptInRBF pero no nLocktime, incluso después de >10 confirmaciones? Esta es la última versión de Bitcoin Wallet para Android (v5.25). Preguntar aquí porque es uno de los pocos aciertos sensatos al buscar el mensaje, y posiblemente relacionado.
Hola @AronVanAmmers, suena interesante. ¿Podría crear una nueva pregunta para que podamos abordar adecuadamente su tema? Si puede proporcionar la mayor cantidad de información posible, por ejemplo, un enlace a la transacción en un explorador de bloques, eso sería genial.