Ethereum — как проверяется результат вычисления контракта? [закрыто]

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

Простой пример: мой контракт принимает два входа, A и B, и возвращает их сумму. Майнер с сомнительной репутацией хочет получить комиссионные за транзакцию и эфириум за газ по этому контракту, не выполняя работы, и взламывает свою реализацию виртуальной машины, чтобы всегда возвращать «4» вызывающему абоненту. Любой, кто тестирует "2+2", подумает, что функция работает.

Предположим, что майнеру удалось добыть блок с запросом на мой контракт, и он вернул «4» (чтобы не тратить свои собственные вычислительные мощности и не класть в карман стоимость газа). Все хэши блоков для принятой транзакции и переданного эфира верны и проверяемы, источник и коды операций контракта проверяемы и верны. Но как проверяется результат вычислений на правильность?

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

Спасибо.

Ответы (1)

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

Но есть связанный с этим вопрос: можно ли получить преимущество, улучшив скорость виртуальной машины или каким-то образом пропустив вычисления?

Я думаю, вы могли бы. Например, вы можете перенести вычисления на GPU. Несмотря на то, что Dagger устойчив к графическому процессору, виртуальные машины требуют небольшого объема памяти и, вероятно, могут работать на графическом процессоре.

Однако преимущество будет весьма незначительным.

Вы немного устарели с алгоритмом майнинга, он менялся несколько раз и теперь предположительно совместим с GPU, ASIC и устойчивым к пулу. Однако пул обладает 40% хэш-мощности сети , поэтому последнее утверждение доказуемо неверно.
Спасибо, я думал, что это что-то вроде этого, но я все еще в замешательстве. Во-первых, все ли результаты вычислений возвращаются в цепочке блоков как часть транзакции? Скорость возврата, кажется, указывает на то, что я получаю результаты первого процессора, независимо от того, будет ли блок признан недействительным позже. Кажется, я не жду N подтверждений блока, прежде чем получить свой результат. Далее, как насчет контракта, который просит вернуть некоторый идентификатор узла, его обрабатывающего? Это будет другой результат в зависимости от того, кто его обрабатывает, и не может быть проверен другими. Или отметка времени в миллисекундах?