В настоящее время я работаю на небольшой торговой платформе, использующей Tendermint, но пока не уверен, как следует использовать состояния приложения Tendermint. В документах Tendermint под https://tendermint.com/docs/app-dev/abci-spec.html#message-types написано:
Обратите внимание, что сообщения могут отправляться одновременно по всем соединениям - поэтому типичное приложение будет поддерживать отдельное состояние для каждого соединения. Они могут упоминаться как состояние DeliverTx, состояние CheckTx и состояние Commit соответственно.
Я расскажу вам, как следует использовать эти три состояния, и, надеюсь, вы скажете мне, правильно ли это.
- Состояние DeliverTx : После каждого действительного сообщения запроса DeliverTx, полученного приложением ABCI, это состояние обновляется. В случае недействительной транзакции (включенной византийским посредником) состояние DeliverTx сбрасывается в состояние CommitTx , которое ранее было установлено при получении последнего сообщения CommitTx.
- Состояние CommitTx : Когда приложение ABCI получает сообщение CommitTx, состояние CommitTx устанавливается как самое последнее Состояние DeliverTx .
- Состояние CheckTx : Может использоваться для защиты от DoS (путем сохранения количества транзакций, поступивших через сообщение запроса CheckTx за последние несколько секунд, как Состояние CheckTx и всякий раз, когда число транзакций в секунду становится слишком много, ответ CheckTx запрещает транзакциям попадать в mempool).
- Кроме того, всякий раз, когда приложение запрашивается (через конечную точку RPC abci_query), приложение отвечает на запрос, основываясь на состоянии CommitTx
Мое представление о трех состояниях, возможно, уже подразумевает, что я не уверен, что происходит, когда приложение получает запрос DeliverTx, но доставленная транзакция недействительна (этот случай вообще происходит?). Каким образом весь процесс предложения, предвосхищения и предварительной передачи связан с этими типами сообщений (CheckTx, DeliverTx, Commit)?