¿Transacciones combinadas ejecutadas juntas?

Si estoy en lo correcto, el nonce es responsable de la orden en que se ejecutan las transacciones. Supongamos que tiene dos transacciones T1 y T2. T1 depende de T2. Entonces quiero tener una orden T1 y luego T2. Esto se hace dando T1 el nonce y T2 nonce + 1. (corríjame si eso es falso)

Ahora bien, en algún caso, podría darse la situación de que T2 dependa también del estado de un contrato. Entonces quiero asegurarme de que T1 se ejecute solo entonces T2 se puede ejecutar. ¿Hay alguna forma de hacer esto?

Entonces, en realidad, para asegurarse de que T1 y T2 estén incluidos en el mismo bloque. Creo que eso podría hacerse mediante un contrato de vestuario, pero no estoy seguro de si hay una solución mejor o estándar.

¡Muchas gracias por cualquier consejo!

PD: Ejemplo: Quiero comprar algo. T1 depositar dinero (o dar aprobación) a un contrato. T2 compra algo usando el contrato.

Ejemplo Real: Quiero comprar un token en Ether Delta. T1: depósito. T2: Comprar token. No tiene sentido depositar si alguien fue más rápido y ya compró ese token por el precio dado.

¿Qué quieres decir con que T1 depende de T2? ¿Como en A no tiene dinero, B le envía a A algunas fichas en T2 y A le envía a C en el mismo bloque?
Si algo como esto. Ejemplo sencillo. Quiero comprar algo. T1 depositar dinero (o dar aprobación) a un contrato. T2 compra algo usando el contrato.
No sé la respuesta, pero puede considerar actualizar su pregunta para mejorarla. Supongo que no es realmente factible: cada una de las transacciones de depósito/compra probablemente sea activada por diferentes entidades, por lo que para comprar necesita datos en blockchain que indiquen que alguien hizo un depósito. Solo si el depósito y la compra se activan con el mismo método por la misma entidad, tendría datos en el mismo bloque, pero no creo que este sea el tipo de contrato que está desarrollando.
Ahí está el 'truco del constructor de contratos'. Permite ejecutar dos 'transacciones' en un constructor en nombre del contrato y al final se autodestruirá. Permite ejecutar atómicamente dos transacciones internas, es decir, ambas se ejecutarán o una falla en cualquiera de ellas revertirá ambas. Puede que no sea más barato y requiera cierta preparación, pero evitará ataques de carrera entre ambas transacciones.

Respuestas (1)

Entonces quiero tener una orden T1 y luego T2. Esto se hace dando T1 el nonce y T2 nonce + 1. (corríjame si eso es falso)

Si tanto T1 como T2 se envían desde la misma cuenta, entonces se cumplirá la orden de nonce, sí.

T2 depende también del estado de un contrato. Entonces quiero asegurarme de que T1 se ejecute solo entonces T2 se puede ejecutar. ¿Hay alguna forma de hacer esto?

Escenario 1: si T1 y T2 son de la misma cuenta, entonces este pedido ya está garantizado por los nonces.

Escenario 2: si son de cuentas diferentes, T2 solo tendrá éxito si realiza un cambio válido en el estado. Si no realiza un cambio válido en el estado, fallará y no se incluirá en un bloque.

Si se requiere que T1 haga que el estado sea "válido" antes de que llegue T2, entonces puede asegurarse de que si T2 falla (porque T1 aún no ha sucedido), entonces se vuelve a enviar.

Si no se requiere T1 para que el estado sea "válido", y T2 podría funcionar sin que T1 haya ocurrido, entonces deberá tener cuidado para garantizar el pedido.

Entonces, en realidad, para asegurarse de que T1 y T2 estén incluidos en el mismo bloque.

No está claro por qué desea que se incluyan en el mismo bloque. Siempre que T1 sea anterior a T2, incluso en un bloque anterior, los cambios de estado funcionarán.

Además, no puede garantizar su inclusión en el mismo bloque. Depende de los mineros. Podría intentar que esto suceda con los precios de la gasolina, pero nuevamente, no hay garantía.

Hola. Gracias por la explicación. Actualicé mi pregunta. El escenario concreto es comprar algo donde primero se requiere un depósito. Pero puede suceder que se ejecute T1 (depósito 1 ETH). Pero entonces T2 no se ejecuta inmediatamente y otra persona compra el artículo.
¿Es la misma persona (cuenta) haciendo T1 y T2, o dos personas diferentes?
¡Sí, la misma persona! Pero el artículo podría ser comprado por otra persona. Entonces T2 solo se puede ejecutar si nadie hizo la compra.
Bien, T2 siempre vendrá después de T1 si son de la misma persona. Si lo entiendo correctamente, su contrato podría detectar el depósito del primer usuario (T1) y luego congelar la oferta para que todos los demás dejen de comprarlo con su T2. La congelación podría expirar después de una cierta cantidad de tiempo o cantidad de bloques. Pero dependería completamente del diseño de su contrato.
Lo siento, no fui lo suficientemente preciso. Estoy interactuando con un contrato extranjero. Así que no puedo hacer nada en el lado del contrato. Mi idea era que podría escribir mi propio contrato y tendría una función que ejecuta T1 y T2 e interactúa con el contrato extranjero.
Ah bien. Una vez que T1 y T2 se crean y transmiten, incluso si lo hace a través de un contrato que usted creó, no hay garantía de que se puedan entregar en una sucesión rápida y antes de la transacción de compra de otra persona. (El orden está garantizado por los nonces, como en el escenario n. ° 1 en mi respuesta).
Ok, pero si yo pero ambas llamadas de función en una función, debería funcionar, ¿verdad? O al menos esa función debería fallar. Pero tal vez mi comprensión no es lo suficientemente buena. Supongo que cada llamada de función se ejecuta atómicamente.
Si su contrato llama al contrato extranjero dos veces, incluso si esas llamadas tienen una sola función en su contrato, serán dos transacciones. El contrato extranjero necesitaría implementar deposit()y buy()en una sola función combinada (tomar una sola llamada) para poder hacer lo que está pidiendo. (Lo que parece que no es el caso).
Ok, entiendo... hmm esperaba que hubiera una solución... pero parece que no es el caso