Каков порядок операций по проверке транзакции?

Я не спрашиваю, все ли узлы выполняют каждую транзакцию. Я прошу приблизительную временную последовательность событий. Например, в случае попытки двойной траты, а двойная трата вступает в сговор с майнером, добавляющим следующий блок. В какой момент случайный узел в сети, участвующий в майнинге, подтвердит, что это неверно, и пометит проблему?
- Обнаружит ли эту проблему только следующий майнер, который добавит блок?
- Каждый узел проверяет/выполняет транзакцию только в следующий раз, когда они участвуют в майнинге, или только когда они решают PoW и добавляют новый блок?
- В следующий раз, когда они будут онлайн?
- Есть ли триггер, по которому полный узел, который может простаивать, должен запустить код контракта и проверить?

Что, если следующие N майнеров тоже вступают в сговор? Требуется ли только один майнер, чтобы пометить транзакцию как неверную или N+1?

Очевидно, что все узлы не могут выполнить эту транзакцию до того, как будет построен другой блок, поэтому я надеюсь, что существует приблизительная временная шкала событий.

Полный узел должен проверять каждую транзакцию, которая появляется в новом блоке.
Я конкретно прошу порядок операций и сроки. Что делать, если узел отключается? Что делать, если на узле завис компьютер? Все эти узлы не могут быть синхронизированы
Когда узел подключается в первый раз, он получает блоки от других узлов. Для каждого блока сначала будут выполняться базовые проверки, например наличие родительского блока, сложность блока и т. д. Если базовые проверки пройдены, транзакции будут выполняться в том порядке, в котором они присутствуют в блоке. После выполнения всех транзакций он проверит, правильно ли сохранено итоговое состояние в заголовке блока. Если все в порядке, блок принимается.
Есть некоторые режимы, такие как быстрый режим geth, которые пропускают выполнение транзакций старых блоков и запускают их только для последних блоков. Это сделано для экономии времени и места для хранения.
Я до сих пор не получаю удаленного ответа на примерный порядок операций. Если у меня есть смарт-контракт, и я ожидаю, что он будет работать на каждом узле, в какой момент он будет работать на 99% узлов? Есть ли указание? Проверяют ли узлы транзакцию перед майнингом для добавления следующего блока? После того, как они выиграют Pow? В следующий раз, когда они действительно будут участвовать в транзакции в сети? Фоновая задача, которая проверяет блоки, даже если они не активно майнятся?
Точное значение немного отличается от того, что вы ожидаете. Его не обязательно выполнять на 99% узлов. Вместо этого он должен выполняться на 50%+1 майнеров (не по количеству майнеров, а по общей вычислительной мощности). Только у майнеров есть стимулы для выполнения контрактов, и они должны проверять добытые транзакции перед добычей нового блока, иначе они могут потерять вознаграждение за блок, если предыдущий блок был недействительным.
Другие узлы, не занимающиеся майнингом, не обязаны выполнять транзакции, но принятие недопустимого блока может вызвать проблемы. Потому что другие узлы будут заносить в черный список узлы, которые распространяют недопустимый блок. Таким образом, полный узел может в любом случае выполнять контракты, чтобы убедиться, что блок действителен.
Принцип работы совсем другой и его трудно принять. Q1 - каждый узел решает сам. Q2 — Двойная трата не обнаружена. Это никогда не происходило. Каждый узел работает с однозначным порядком событий, в который он верит. Q3: Каждый полный узел обрабатывает каждую транзакцию, а не только майнеры. Q4: См. Q3. Q5: Приходит блок с упорядоченным списком транзакций. Эти сделки должны быть оценены. Q6: Это нелинейно. Все майнеры соревнуются за привилегию заказывать транзакции на короткий период. Большинство определяет истину. Q7: Не очевидное и неверное предположение. Да, это так.

Ответы (2)

Когда майнер решает головоломку с доказательством работы в блоке, который он/она добывает, он помещает его в заголовок блока и распространяет на другие узлы, о которых он знает. Это могут быть другие майнеры или другие полные узлы, не занимающиеся майнингом.

Новый блок сейчас распространяется. Узлы, которые получают новый блок, должны его проверить.

Полные узлы без майнинга будут делать следующее:

  • Убедитесь, что PoW в заголовке блока действителен;
  • Распространить блок на одноранговые узлы;
  • Проверьте правильность переходов состояний в блоке.

Узлы майнинга делают то же самое, но немного в другом порядке, что позволяет им быстрее начать добычу следующего блока:

  • Проверьте PoW в заголовке блока;
  • Проверьте правильность переходов состояний в блоке;
  • Распространите блок на одноранговые узлы.

Проверка переходов состояний в полном блоке 8Mgas занимает порядка 100-200 мс на приличной машине.

На ваши конкретные вопросы.

Я не спрашиваю, все ли узлы выполняют каждую транзакцию.

Они делают это, чтобы убедиться, что их состояние внутренне непротиворечиво. (На самом деле есть теоретический аргумент, который противоречит этому. Я слышал, что некоторые майнеры на самом деле не проверяют содержимое блока на достоверность, а просто предполагают, что это дает им преимущество в добыче следующего блока.)

В какой момент случайный узел в сети, участвующий в майнинге, подтвердит, что это неверно, и пометит проблему?

Это должно быть помечено первым набором пиров майнера, которые должны проверять переходы состояний.

Обнаружит ли эту проблему только следующий майнер, который добавит блок?

Нет, как указано выше.

Каждый узел проверяет/выполняет транзакцию только в следующий раз, когда они участвуют в майнинге, или только когда они решают PoW и добавляют новый блок?

Нет, когда они получают новый распространяемый блок.

В следующий раз, когда они будут онлайн?

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

Существует ли триггер, при котором полному узлу, который может простаивать, необходимо запустить код контракта и проверить его?

Триггер заключается в том, что к нему будет добавлен новый блок.

Очевидно, что все узлы не могут выполнить эту транзакцию до того, как будет построен другой блок, поэтому я надеюсь, что существует приблизительная временная шкала событий.

Теоретически да, иначе они не знают, что строят на действительном состоянии.

Транзакции проверяются только во время майнинга, то есть узлами, которые майнят. Все остальные узлы, получив блок, проверяют, правильно ли для блока решение в зависимости от сложности. Таким образом, они только проверяют решение, предоставленное майнером. Если он правильный, то его принимают, если нет, то отвергают.

Вы можете узнать больше о валидности блока в желтой книге, часть 4.4.2: http://yellowpaper.io/

Что касается порядка исполнения, то я совсем не уверен, так как предпочитаю ничего не говорить. Вы также должны заглянуть в желтую бумагу об этом: http://yellowpaper.io/

Поэтому, исходя из этого, никто не ответил на мой вопрос. Желтая бумага не очевидна в этом отношении, поэтому я задаю вопрос здесь от кого-то, кто знает об этом.