Así que estoy en el proceso de implementar un módulo de pago basado en BTC donde por cada transacción a una cuenta que no sea de billetera, una fracción del monto terminará en una cuenta de caridad en una billetera externa no controlada por este módulo.
Una ronda típica para eso sería:
En un nivel inferior, el sistema:
TxFromUser
del usuario con una cantidad de X
BTCTxToMerchant
para reenviar el pago al comercianteTxToCharity
para reenviar la donación a la organización benéficaProfundizando un poco más:
TxToMerchant:
TxFromUser
Merchant's address
, Cantidad: 0.9 * TxFromUser.AmountModule's own wallet address
, Cantidad: 0.1 * TxFromUser.AmountTxToMerchant.Id
TxToCharity:
TxToMerchant
(este será el cambio que solicitamos anteriormente)Charity's address
, Cantidad: TxToMerchant.Amount = 0.1 * TxFromUser.AmountTxToCharity.Id
Soy consciente del hecho de que podría fusionar estas dos transacciones (TxToMerchant y TxToCharity) en una sola transacción, sin embargo, por varias razones (requisito comercial), digamos que esto no es posible en este momento.
El problema que tengo con la implementación anterior es el siguiente: esperar a TxToMerchant
que se confirme crea un retraso, ya que no puedo reenviar el pago a la organización benéfica TxToCharity
hasta TxToMerchant
que se confirme (¿o puedo, sin tener que preocuparme por la maleabilidad de la transacción, etc.?).
Además de eso, cuando llega el momento de agregar la TxToCharity
entrada, tengo que hacer un seguimiento de cómo se devolvió el cambio TxToMerchant
y luego obtener la transacción no gastada correcta (donde listunspent.txid = TxToMerchant.Id), ¿existe una forma más eficiente? y menos propensa a errores para hacer esto?
Supongamos que el usuario desea dividir el pago entre 2 comerciantes (o un comerciante y un servicio de carga, lo que tiene más sentido), por lo que en el ejemplo anterior habría 1 transacción más como TxToMerchant
, llamémosla TxToFreightService
. Digamos ahora que TxToMerchant
funciona bien y se confirma, pero TxToFreightService
falla y nunca se confirma porque la entrada utilizada para ello fue un gasto doble, independientemente de las 6 confirmaciones que obtuvimos (para su entrada) antes de procesarlo. TxToCharity
depende de TxToFreightService
porque el cambio solicitado en TxToFreightService
servirá como entrada para TxToCharity
. ¿Cómo trato este escenario programáticamente sin tener que realizar correcciones a mano cada vez que esto sucede?
Creo que su proceso comercial está confundiendo el problema. Voy a suponer que el lado "comercial" de esto también quiere tomar una parte de la transacción o quiere retrasar el pago de la caridad y es por eso que esto se ha vuelto más complicado.
Hay una serie de consideraciones, entre ellas el hecho de que está utilizando una entrada para pagar al comerciante, y el cambio para pagar el flete, y el cambio de eso para pagar la caridad.
Lo que le preocupa es la incapacidad que ha incorporado para pagar a una de las partes debido a una transacción anterior, pero ese es su proceso comercial con la culpa, no el protocolo de Bitcoin.
También debe considerar el monto de pago mínimo y la eventual tarifa de red, ninguno de los cuales está basado en porcentajes.
Estos no se mencionan y, de hecho, al realizar dos (o posiblemente cuatro) transacciones, está incurriendo en hasta 4 veces las tarifas de transacción de la red bitcoin.
Esta es una de las principales razones por las que (desde una perspectiva comercial) no debe dividir las transacciones, es decir, es más costoso y ¿quién se hará cargo de los costos? ¿La caridad? el comerciante? ¿el flete? ¿Tú?
¿Puedo sugerir también que ha malinterpretado las "confirmaciones" como algo más que su transacción incluida en un bloque? Cuando un par solicita una transacción antes de incluirla en un bloque, el par valida la transacción de forma independiente y, si por alguna razón no es buena, se rechaza. Este NO es el proceso de "confirmación".
Todos los pares en efecto harán la misma validación de su transacción a medida que se propaga a través de la red (que, por cierto, es extremadamente rápido).
La confirmación, por otro lado, es cuando la transacción se ha incluido en un bloque, y la única vez que esto se convierte en un problema es si hay una bifurcación en la cadena de bloques. Pero incluso entonces, aún puede retransmitir una transacción si la "otra bifurcación" se convierte en la final, siempre que la base sobre la que se hizo sea buena.
El punto que quiero señalar es que está poniendo demasiado énfasis en las confirmaciones de las transacciones que usted mismo ha creado y luego espera hasta que alguien más confirme lo que ya sabe que es cierto, y esto parece completamente inútil.
¿Quizás pueda ampliar su pregunta para explicar las "razones comerciales"?
doug peters
doug peters
T9b
doug peters