¿Cómo minimizar el riesgo al aceptar pagos con cero confirmación?

Estoy tratando de configurar una forma de aceptar pagos de Bitcoin en situaciones de la vida real, donde esperar confirmaciones generalmente no es una opción. Entiendo que esto nunca está 100% libre de riesgos (especialmente con basura como bitundo.com), solo quiero minimizar el riesgo.

Tengo una billetera Bitcoin Core con un montón de direcciones sin usar. Le muestro una dirección al cliente, él envía el dinero y ahora puedo hacer algunas cosas: (todo automatizado, es decir, a través de algún tipo de aplicación o script)

  1. Comprobar si la transacción (no confirmada) aparece en mi propio nodo/en mi billetera
  2. Compruebe si la transacción (no confirmada) aparece en sitios que usan API en línea como blockr.io y blockchain.info
  3. Compruebe si no veo una transacción similar (desde la misma dirección de entrada, pero a otra dirección de salida, es decir, un intento de doble gasto) en mi nodo o en los sitios de la API.

Si 1 o 2 están bien y 3 no se produce durante, por ejemplo, de cinco a diez segundos, ¿qué tan (in)segura es la transacción en este punto?

Me di cuenta de que los proveedores de pago como bitpay y coinbase pueden aceptar pagos de inmediato, ¿cómo diferencian las transacciones legítimas de los intentos de doble gasto?

Actualmente estoy tratando de resolver el mismo problema conectándome a tantos nodos como sea posible para detectar un posible doble gasto en unos segundos. Solo para corregir un poco su suposición: 3.) una transacción que proviene de la misma dirección de entrada a una dirección de salida diferente no significa necesariamente un gasto doble si gasta diferentes TXOUT. Por lo tanto, solo debe buscar transacciones que gasten el mismo TXOUT, pero que lo envíen a una dirección diferente.
Para vender una taza de café, un refresco o sándwiches, creo que otras monedas (como Ripple, 42coin o incluso Dogecoin) serían más apropiadas para esto: puedo ver muy bien a la gente esperando hasta 2 minutos, pero no más, en punto en el que su riesgo se reduce enormemente.
@JoePineda Imaginémoslo en detalle por un momento: estás en tu cafetería favorita, haciendo fila para tomar una taza de café y donas (o algo similar). Detrás de ti hay cinco personas más esperando. Todo el mundo solo quiere agarrar algo y correr al trabajo. 10 minutos ciertamente no son válidos, pero incluso dos minutos de pie allí viendo a media docena de personas agarrar sus cosas y continuar con su mañana son inaceptables.
¡Buen punto! Yo mismo estoy dispuesto a esperar hasta unos 2 minutos en el mostrador, una vez que estoy frente al empleado, eso es. Pero no estoy dispuesto a pasar más de 3 minutos en total, sumando los de la fila más los del cajero, y supongo que la mayoría de la gente tampoco lo haría :(
@JoePineda, 10 segundos es el umbral de tolerancia. No olvides que no son solo 10 seg/cliente sino 10 seg/cliente extra , además de los 20 segundos que ya tenemos que esperar mientras el cajero escanea el artículo.
@RocketNuts, ¿Qué pasa con BitUndo?
@Pacerier incluye en el bloque una transacción con tarifa más alta, no la primera. Eso los convierte en un buen procesador para gastos dobles.

Respuestas (2)

Desde http://www.cryptocoinsnews.com/news/the-mathematically-secure-way-to-accept-zero-confirmation-transactions/2014/02/13 , esto es lo que pueden estar haciendo servicios como MyCelium y BitPay:

Más específicamente, con cada segundo adicional, un mayor porcentaje de nodos activos de Bitcoin habrá escuchado la transacción original y todos los que vean la cadena de bloques pueden estar cada vez más seguros de que la transacción se extraerá en el siguiente bloque y recibirán una confirmación, luego dos, y así sucesivamente. Etcétera.

Lo que esto significa es que cualquier transacción de Bitcoin puede aceptarse con cero confirmaciones con un nivel de confianza derivado matemáticamente al que algunos se refieren como "Confianza de transacción". Esta medida de confianza de la transacción nos asegura que, incluso si se intentara un gasto doble, la transacción original y correcta ya está demasiado propagada para ser superada.

Pero como usted señaló acertadamente, no existe una forma 100% libre de riesgo de poder hacer esto si no confía en el remitente. Es por eso que la cadena de bloques existe en primer lugar.

Un riesgo de confiar en la "confianza de transacción" es que no hay nada en la red que impida que alguien envíe una transacción de doble gasto directamente a los mineros, sin transmitirla a la red en su conjunto, según el acuerdo de que cualquier bloqueo que esos mineros find debe elegir su secreto en lugar del que transmiten a la red. Este es un riesgo sin importar cuánto de la red vea la transacción pública, que es una de las razones por las que no puede tener 100% de confianza en una transacción que nunca se convirtió en un bloque.

En particular, si acepta una transacción de confirmación 0 que gasta entradas de otras transacciones de confirmación 0, el riesgo es mucho mayor, porque la transacción directamente para usted o cualquiera de sus entradas de confirmación 0 podría gastarse dos veces, para su detrimento.

Francamente, incluso las transacciones de 1 confirmación no están libres de riesgos. Incluso en circunstancias normales, los bloques quedan huérfanos, lo que podría crear una ventana para el doble gasto, porque es posible que la sucursal ganadora no resuelva las transacciones de la forma en que lo hizo la sucursal perdedora.

Si se toma en serio tratar de minimizar los riesgos de aceptar BTC en situaciones de la "vida real" (también conocidas como físicas) donde la velocidad es importante, no puedo pensar en una mejor idea que ir con un servicio como Coinbase (sin afiliación). Esos servicios operan en una escala en la que pueden darse el lujo de comer pérdidas por gastos dobles, lo que debería ser raro, para que no tenga que preocuparse por eso. Actualmente, tienen un incentivo económico para aumentar la adopción de la moneda al ser muy atractivos para los comerciantes que eligen hacerlo.

Gracias por la respuesta detallada. ¿Los mineros no suelen ser nodos normales en el sentido de que no transmiten ni propagan transacciones al resto de la red? Quiero decir, si enviaría deliberadamente un tx 'secreto' al nodo de un minero (con la esperanza de incluirlo en la cadena de bloques), ¿no se transmitiría también a otros nodos, lo que permitiría detectar su presencia en la red?
Esa es una distinción importante que hacer, y es sutil. Sí, los mineros normalmente ejecutan nodos "normales", pero recuerde que los mineros normalmente solo hacen cosas para ayudar a la red porque promueve su propio interés. Si tiene un acuerdo con los mineros para pagarles una parte de sus ganancias de doble gasto, entonces les conviene mantener sus transacciones en secreto hasta que lleguen a la cadena de bloques. Controlan el software que ejecutan y es de código abierto. Diablos, los mineros ya ejecutan software de nodo modificado. Eligius implementa CPFP, que no está en el software de nodo estándar.
¿Sería factible conectarse a tales pools de minería (o a todos los pools de minería principales), solo para ver qué transacciones se supone que deben incluirse?
Realmente no. Si se incentiva a los mineros para que favorezcan en secreto algunas transacciones sobre otras, entonces no tienen motivos para compartir esa información con nadie más que la persona que los contrató para incluir la transacción de doble gasto. Incluso si lo hicieran, no tendrías motivos para confiar en ellos.
Claro, pero eso solo se aplicaría a mineros individuales, ¿verdad? Que generalmente tienen una posibilidad muy pequeña de extraer el siguiente bloque, en el que intentan incluir un tx secreto (a expensas de que no se confirme un tx público). Pero al verificar los datos de transacción que están siendo extraídos por los grupos, ¿diría que esto debería ser detectable...? ¿O hay alguna manera de hacer minería agrupada o distribuida (es decir, tener muchas personas tratando simultáneamente de hacer hash de una lista de transacciones, incluido un tx secreto) sin revelar realmente el tx secreto?
Eso plantea un buen punto. Si bien los grupos generalmente actúan como "un gran minero" para la mayoría de los propósitos, eso no es necesariamente cierto cuando se trata de mantener en secreto una transacción en particular. Sin haber analizado estos protocolos con demasiado detalle, puede ocultar fácilmente una transacción en los datos utilizados para el estrato o los cada vez más obsoletos protocolos getwork, pero con getblocktemplate, debería ser imposible que el grupo haga esto en secreto (aunque los mineros individuales puede hacer esto por su cuenta)
@JoeAmenta, pero delegar la tarea a un tercero es simplemente empujar el problema sobre la mesa. La pregunta sigue siendo válida: ¿Cómo minimiza el riesgo el tercero cuando acepta pagos de confirmación cero?
@Pacerier, el tercero tiene un montón de opciones a gran volumen, siempre que no esté acabando con su negocio. Si esa parte observa que un promedio del 1% de todo el volumen de transacciones se pierde debido a gastos dobles, entonces puede comenzar a cobrar una tarifa fija del 1% para recuperar las pérdidas. Si un comerciante en particular demuestra ser problemático, entonces simplemente puede dejarlo (o cobrar una tarifa más alta si es solo la naturaleza del negocio del comerciante).
@JoeAmenta, Buena idea sobre "tarifas dinámicas" allí.
Es importante tener en cuenta que Coinbase solo le brinda protección de doble gasto si está utilizando su servicio pago de "intercambio instantáneo" que cobra inmediatamente los pagos por dinero fiduciario. Si mantiene el bitcoin en su billetera Coinbase, no se proporciona dicha garantía. (Su documentación no es del todo clara al respecto, pero acabo de recibir esta aclaración de un representante de soporte de Coinbase).
Esta respuesta definitivamente debería vincular / mencionar el documento Have a Snack, Pay with Bitcoins , búsquelo en Google

Lo primero y más importante: haga negocios solo con personas de su confianza. Eso no significa que tenga que haberlos conocido durante un largo período de tiempo, sino que la persona que está haciendo negocios con usted tiene más probabilidades de optimizar sus ganancias si no lo estafa.

No estoy seguro de las probabilidades de lanzar con éxito un ataque de doble gasto después de esperar unos segundos, pero lo que puede hacer es escribir algún software que se conecte a algunos de los principales grupos de minería y espere si su transacción (o un intento de doble gasto malicioso transacción) aparece. Sería genial si los grupos de minería tuvieran una API web para verificar qué transacciones es probable que se incluyan en su próximo bloque, pero desafortunadamente no es así. Eso significa que tendría que programar dicha aplicación usted mismo (no conozco ninguna biblioteca existente con esta funcionalidad, pero infórmeme si existen).

Por último, siempre se podría trabajar con direcciones verdes . Si su socio acepta confiar en un tercero, las transacciones se pueden liquidar instantáneamente.

Buena sugerencia sobre la conexión a grupos de minería. Solo hacer negocios con personas en las que confío o direcciones ecológicas no son una opción, me temo. Se supone que debe aceptar pagos de clientes aleatorios (es decir, completos extraños).
Entonces no hay solución, excepto conectarse a tantos nodos como sea posible, y especialmente a pools de minería. Simplemente conéctese como un nodo ficticio y obtenga el bloque en el que están trabajando. AFAIS no hay forma de que el grupo pueda engañarte, si está descentralizado y abierto, como P2Pool.