Комбинированные транзакции выполняются вместе?

Если я прав, одноразовый номер отвечает за выполнение транзакций заказа. Предположим, у вас есть две транзакции T1 и T2. Т1 зависит от Т2. Итак, я хочу иметь заказ T1, а затем T2. Это делается путем предоставления одноразового номера T1 и одноразового номера T2 + 1. (пожалуйста, поправьте меня, если это неверно)

Теперь в некоторых случаях может возникнуть ситуация, когда T2 зависит также от состояния контракта. Поэтому я хочу убедиться, что T1 выполняется только тогда, когда T2 может быть выполнен. Есть ли способ сделать это?

Так что на самом деле убедитесь, что T1 и T2 включены в один и тот же блок. Я думаю, что это можно было бы сделать с помощью контракта на костюм, но не уверен, что есть лучшее или стандартное решение для этого.

Большое спасибо за любой совет!

PS: Пример: Я хочу что-то купить. T1 вносит деньги (или утверждает) контракт. T2 купить что-то с помощью контракта.

Реальный пример: я хочу купить токен на Ether Delta. Т1: депозит. T2: Купить токен. Нет смысла вносить депозит, если кто-то был быстрее и уже купил этот токен по указанной цене.

Что значит, что Т1 зависит от Т2? Например, у A нет денег, B отправляет A несколько токенов в T2, а A отправляет C в том же блоке?
Да как-то так. Простой пример. Я хочу купить кое-что. T1 внесите деньги (или одобрите) в контракт. T2 купить что-то с помощью контракта.
Я не знаю ответа, но вы можете обновить свой вопрос, чтобы улучшить его. Я предполагаю, что на самом деле это невозможно: каждая транзакция депозита/покупки, вероятно, инициируется разными лицами, поэтому для покупки вам нужны данные в блокчейне о том, что кто-то сделал депозит. Только если депозит и покупка запускаются одним и тем же методом одним и тем же объектом, у вас будут данные в одном блоке, но я не думаю, что вы разрабатываете такой контракт.
Есть «трюк с конструктором контрактов». Это позволяет выполнять две «транзакции» в конструкторе от имени контракта, и в конце он самоуничтожится. Это позволяет атомарно выполнять две внутренние транзакции, т.е. обе будут выполняться или сбой в любой из них приведет к отмене обеих. Это может быть не дешевле и требует некоторой подготовки, но позволит избежать атак гонки между обеими транзакциями.

Ответы (1)

Итак, я хочу иметь заказ T1, а затем T2. Это делается путем предоставления одноразового номера T1 и одноразового номера T2 + 1. (пожалуйста, поправьте меня, если это неверно)

Если и T1, и T2 отправляются с одной и той же учетной записи, то порядок nonce будет соблюдаться, да.

T2 зависит также от состояния контракта. Поэтому я хочу убедиться, что T1 выполняется только тогда, когда T2 может быть выполнен. Есть ли способ сделать это?

Сценарий 1: если T1 и T2 принадлежат одной и той же учетной записи, то этот порядок уже гарантирован одноразовыми номерами.

Сценарий 2: если они из разных учетных записей, то T2 будет успешным, только если он внесет допустимое изменение в состояние. Если он не внесет допустимых изменений в состояние, произойдет сбой и он не будет включен в блок.

Если T1 требуется, чтобы сделать состояние «действительным» до прибытия T2, вы можете просто убедиться, что в случае сбоя T2 (поскольку T1 еще не произошло) он будет повторно отправлен.

Если T1 не требуется для того, чтобы сделать состояние «действительным», а T2 может работать без T1, то вам нужно быть осторожным с обеспечением порядка.

Так что на самом деле убедитесь, что T1 и T2 включены в один и тот же блок.

Непонятно, почему вы хотите, чтобы они были включены в один и тот же блок. Пока T1 предшествует T2 — даже в более раннем блоке — тогда изменения состояния будут работать.

Кроме того, вы не можете гарантировать их включение в один и тот же блок. Это зависит от шахтеров. Можно попытаться добиться этого с ценами на газ, но опять же, нет никакой гарантии.

Всем привет. Спасибо за объяснение. Я обновил свой вопрос. Конкретный сценарий заключается в том, чтобы купить что-то, где сначала требуется депозит. Но может случиться так, что исполнится T1 (депозит 1 ETH). Но тогда Т2 не выполняется сразу и предмет покупает кто-то другой.
Один и тот же человек (аккаунт) выполняет T1 и T2 или два разных человека?
Да тот же человек! Но товар мог купить другой человек. Таким образом, T2 может быть выполнен только в том случае, если никто не совершал покупку.
Хорошо, T2 всегда будет после T1, если они от одного и того же человека. Если я правильно вас понимаю, ваш контракт может определять депозит первого пользователя (T1), а затем замораживать ставку для всех остальных, чтобы они не покупали его со своим T2. Замораживание может истечь по истечении определенного времени или количества блоков. Но это будет полностью зависеть от дизайна вашего контракта.
извините, я был недостаточно точен. Я взаимодействую с иностранным контрактом. Так что ничего не могу сделать на стороне контракта. Моя идея заключалась в том, что я мог бы написать свой собственный контракт, и у него была бы функция, которая выполняет T1 и T2 и взаимодействует с внешним контрактом.
Ах хорошо. Как только T1 и T2 созданы и транслируются — даже если вы делаете это через созданный вами контракт — нет никакой гарантии, что они могут быть доставлены в быстрой последовательности и до чьей-либо транзакции покупки. (Порядок гарантируется одноразовыми номерами, как в сценарии № 1 в моем ответе.)
Хорошо, но если я вызову обе функции в одной функции, она должна работать правильно? Или, по крайней мере, эта функция должна дать сбой. Но, возможно, мое понимание недостаточно хорошо. Я предполагаю, что каждый вызов функции выполняется атомарно.
Если ваш контракт вызывает внешний контракт дважды, даже если эти вызовы находятся в одной функции в вашем контракте, они будут двумя транзакциями. Внешний контракт должен будет реализовать deposit()и buy()в одной комбинированной функции (принимая один вызов), чтобы он мог делать то, что вы просите. (Что похоже на то, что это не так.)
Хорошо, я понимаю ... хм, надеялся, что есть обходной путь ... но, похоже, это не так.