Вопросы на собеседовании: Блокчейн-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: Блокчейн-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Распределённый реестр представляет собой общую запись, копии которой поддерживают несколько участников сети по единым правилам обновления.
- Каждый участвующий узел может хранить и проверять собственную копию, не полагаясь на один сервер базы данных.
- Протокол консенсуса определяет, какие корректные обновления и какой их порядок принимает сеть при разногласиях между узлами.
- Репликация повышает отказоустойчивость, но требует дополнительных сетевых обменов и не превращает каждую распределённую базу данных в блокчейн.
- Блокчейн является одним из видов распределённого реестра, в котором обновления обычно объединяются в связанные хешами блоки.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы модель общих копий и роль консенсуса, не называя блокчейном любую реплицируемую базу данных.
Заголовок содержит компактные метаданные для идентификации и проверки блока, а тело содержит включённые в него транзакции или другие записи.
- Заголовок обычно ссылается на хеш предыдущего блока, связывая блок с его родителем.
- Он также фиксирует содержимое тела через корень транзакций, например корень Меркла, поэтому изменение транзакции меняет это значение.
- Поля консенсуса, такие как временная метка, высота, данные валидатора, сложность или nonce, зависят от конкретной сети.
- Узлы обрабатывают тело, чтобы проверить транзакции и заново вычислить значения, записанные в заголовке.
Зачем это спрашивают: Сильный ответ разделяет компактные метаданные консенсуса и данные транзакций, а также объясняет, как заголовок фиксирует содержимое тела.
Каждый блок фиксирует хеш родительского блока, поэтому изменение старого блока разрывает цепочку хешей начиная с этого места.
- Даже изменение одного бита с подавляющей вероятностью создаёт другой криптографический хеш.
- Следующий блок продолжает ссылаться на исходный хеш, поэтому изменённая история сразу не проходит проверку.
- Атакующему пришлось бы пересобрать изменённый блок и всех его потомков, а затем преодолеть правила консенсуса сети.
- Хеши делают вмешательство обнаружимым, а консенсус и экономические затраты мешают сети принять альтернативную историю.
Зачем это спрашивают: Интервьюер хочет убедиться, что вы отличаете обнаружение изменений с помощью хешей от устойчивости к переписыванию, которую обеспечивает консенсус.
Публичный блокчейн обычно открыт для просмотра и участия всем желающим, а приватный допускает только одобренных участников.
- Публичные сети, например Ethereum, используют permissionless-валидацию и экономические стимулы, поскольку валидаторы могут не знать и не доверять друг другу.
- Приватные сети, например Hyperledger Fabric, могут ограничивать круг тех, кто читает данные, отправляет транзакции или проверяет обновления.
- Разрешительное членство может повысить пропускную способность и приватность, но концентрирует контроль у участвующих организаций.
Зачем это спрашивают: Интервьюер оценивает, можете ли вы связать правила участия с доверием, приватностью, производительностью и контролем.
Модель счетов обновляет балансы и состояние, связанные с адресами, а модель UTXO расходует существующие выходы и создаёт новые.
- У счетов Ethereum есть такие поля, как баланс и nonce, которые транзакции изменяют в общем глобальном состоянии.
- В Bitcoin выход расходуется целиком, поэтому платёж обычно создаёт один выход получателю, а другой возвращает сдачу отправителю.
- UTXO легко проверять независимо и можно обрабатывать параллельно, если они не расходуют одни и те же выходы.
- Счета упрощают представление балансов и состояния смарт-контрактов, но транзакции могут конкурировать за одно состояние.
Зачем это спрашивают: Сильный ответ объясняет, как каждая модель представляет владение и как это влияет на построение транзакций и доступ к состоянию.
Полная нода самостоятельно проверяет правила блокчейна, а лёгкая проверяет ограниченные доказательства и получает большую часть данных от полных нод.
- Полная нода загружает блоки и проверяет транзакции, подписи и правила консенсуса перед принятием состояния.
- Лёгкий клиент обычно хранит заголовки блоков и может проверить включение через доказательство Меркла, не загружая каждую транзакцию.
- Лёгким клиентам нужно намного меньше места и трафика, поэтому они подходят для телефонов и браузерных кошельков.
- Их безопасность зависит от протокола и доступных доказательств, а работа через одного RPC-провайдера добавляет риски доверия и приватности.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы компромисс между ресурсами и доверием, а не считаете лёгкую ноду полноценным валидатором.
Узлы передают новые транзакции и блоки подключённым пирам, и так данные распространяются по сети по принципу gossip.
- Кошелёк обычно отправляет подписанную транзакцию одному узлу, который выполняет базовую проверку перед дальнейшей передачей.
- Пиры отслеживают уже увиденные объекты, чтобы повторные объявления не вызывали бесконечную ретрансляцию.
- Новый блок проходит тот же процесс передачи между пирами, причём каждый получивший его узел проверяет блок перед принятием.
- Из-за сетевых задержек узлы могут некоторое время видеть разный порядок транзакций или конкурирующие вершины цепочки.
Зачем это спрашивают: Интервьюер хочет услышать, как проверка, устранение дубликатов и задержки сети влияют на одноранговое распространение данных.
Мемпул представляет собой локальный набор корректных неподтверждённых транзакций узла, ожидающих возможного включения в блок.
- Перед добавлением транзакции узел проверяет подписи, nonce или доступные для расходования выходы, а также правила комиссий.
- Мемпулы узлов могут различаться, поскольку транзакции приходят в разное время, а узлы применяют разные ограничения размера и комиссий.
- Производители блоков обычно предпочитают транзакции с более высокой комиссией, хотя правила протокола или билдера могут менять порядок.
- Попадание в мемпул не гарантирует подтверждение, поскольку транзакция может устареть, быть удалена, вступить в конфликт или быть заменена.
Зачем это спрашивают: Сильный ответ описывает мемпул как локальную очередь с собственными правилами, а не как единую глобальную очередь с гарантированным включением в блокчейн.
Транзакция получает одно подтверждение при включении в блок, а финальность показывает уверенность приложения в том, что результат уже не будет отменён.
- Каждый следующий блок добавляет подтверждение и снижает вероятность реорганизации в сети proof-of-work.
- Финальность в proof-of-work вероятностная, поэтому приложения ждут больше подтверждений при более высокой сумме или риске.
- Во многих proof-of-stake сетях валидаторы голосованием финализируют контрольные точки, после чего откат требует серьёзного нарушения протокола и влечёт штрафы.
Зачем это спрашивают: Интервьюер оценивает, отличаете ли вы включение транзакции от разных гарантий финальности, которые дают механизмы консенсуса.
Узел принимает блок только после самостоятельной проверки его родителя, данных консенсуса, транзакций и итоговых коммитментов.
- Ссылка на родителя должна указывать на известный корректный блок, а поля заголовка должны отвечать правилам консенсуса сети.
- Узел проверяет подписи транзакций, nonce или потраченные выходы, балансы и другие условия протокола.
- Он выполняет корректные транзакции по порядку и пересчитывает записанные в заголовке корни транзакций, квитанций или состояния.
Зачем это спрашивают: Интервьюер проверяет, отличаете ли вы получение предложенного блока от самостоятельной проверки всех правил консенсуса и состояния.
Консенсус позволяет распределенным узлам согласовать единую корректную историю транзакций, даже если часть узлов отказала или лжет.
- Узлам нужен одинаковый порядок, потому что две по отдельности корректные транзакции могут пытаться потратить одни и те же средства.
- Византийская ошибка означает, что участник может вести себя произвольно, в том числе отправлять разным соседям противоречивые сообщения.
- Это сложнее обычного сбоя, при котором узел лишь перестает отвечать и не может активно вводить других в заблуждение.
- Протокол консенсуса задает порог отказов, при котором сохраняются безопасность и прогресс, часто через долю голосующей мощности, а не число узлов.
Зачем это спрашивают: Интервьюер проверяет, связывает ли кандидат консенсус с конфликтующим состоянием и отличает ли злонамеренное поведение от обычного отказа узла.
В proof of work майнеры ищут хеш блока ниже текущего целевого значения сети.
- Майнер многократно меняет nonce или другие данные заголовка и хеширует блок-кандидат, пока результат не удовлетворит целевому значению.
- Найти такой результат дорого, но любой узел может проверить его одним вычислением хеша и провалидировать транзакции блока.
- Узлы следуют корректной ветке с наибольшей накопленной работой, а не просто ветке с наибольшим числом блоков.
- Сеть корректирует сложность, чтобы блоки появлялись примерно с заданным интервалом при изменении общего хешрейта.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат майнинг, дешевую проверку, выбор цепочки и корректировку сложности как единый механизм.
Proof of stake связывает участие в консенсусе с заблокированным капиталом, который протокол может вознаграждать или штрафовать.
- Валидаторы блокируют нативный актив вместо постоянного соревнования в вычислении хешей.
- Протокол выбирает пропозеров и учитывает голоса валидаторов согласно своим правилам стейка и случайности.
- Корректные предложения и голоса приносят награды, а пропущенные обязанности могут лишить награды или вызвать штраф за неактивность.
- Доказуемые противоречивые голоса могут привести к потере стейка, поэтому атака имеет прямую экономическую цену.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат объяснить proof of stake через выбор участников, стимулы и штрафы, а не назвать его майнингом с низким энергопотреблением.
Валидатор участвует в консенсусе, выбранный пропозер публикует блок, а остальные валидаторы аттестуют свое представление о цепочке.
- Соло-валидатор Ethereum вносит 32 ETH и запускает ПО, которое выполняет назначенные обязанности консенсуса.
- Для каждого слота один выбранный пропозер собирает и рассылает блок-кандидат.
- Другие валидаторы публикуют аттестации с голосами за голову цепочки и связи между контрольными точками, а протокол суммирует вес их стейка.
- Пропуск обязанности лишает потенциальной награды, а подпись противоречивых сообщений может привести к слешингу.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат отделить общую роль валидатора от обязанностей пропозера и голосующих участников в слоте.
Форк создает конкурирующие корректные ветки, а правило выбора ветки протокола определяет одну из них как каноническую.
- Временный форк может возникнуть, когда разные блоки публикуются почти одновременно и доходят до узлов в разном порядке.
- Узлы проверяют каждую ветку до применения правила выбора, поэтому некорректный блок не победит лишь за счет продолжения ветки.
- Цепочки proof of work обычно предпочитают корректную ветку с наибольшей накопленной работой, а цепочки proof of stake используют голоса валидаторов и собственные правила протокола.
- Блоки вне выбранной ветки становятся неканоническими, а их транзакции могут включить снова, если они остаются корректными.
Зачем это спрашивают: Интервьюер проверяет, отличает ли кандидат корректность блока от отдельного правила выбора среди корректных веток.
При реорганизации недавние канонические блоки заменяются, когда другая корректная ветка побеждает по правилу выбора.
- Узел откатывает изменения состояния из удаленных блоков и применяет блоки победившей ветки.
- Транзакция из удаленного блока может снова стать ожидающей, исчезнуть или позже попасть в другую позицию.
- Приложения должны отслеживать хеши блоков и ждать подходящего числа подтверждений или финальности, прежде чем считать платеж необратимым.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат и откат состояния, и практическую обработку подтверждений на стороне клиентов.
При вероятностной финальности откат со временем становится менее вероятным, а при экономической финальности он требует наказуемой потери стейка.
- В proof of work каждый дополнительный блок добавляет работу поверх транзакции, поэтому заменить ее ветку становится все менее вероятно и все дороже.
- В proof of stake контрольная точка может стать финализированной после того, как за нее проголосует требуемая правилами протокола доля стейка.
- Для отката экономически финализированной контрольной точки валидаторам пришлось бы нарушить проверяемые правила и рисковать значительной частью стейка.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат сравнить уверенность от накопленной работы с гарантией финальности, обеспеченной стейком под риском слешинга.
Большинство консенсусной мощности позволяет влиять на выбор цепочки, но не дает контроля над чужими ключами или корректными правилами протокола.
- Атакующий может цензурировать транзакции или отдельные адреса, отказываясь включать их транзакции в блоки.
- Атакующий может изменить порядок своих транзакций и попытаться провести двойную трату, заменив ветку с предыдущим платежом.
- Атакующий не может подделать подпись другого пользователя, потратить его монеты или заставить честные узлы принять некорректное изменение состояния.
Зачем это спрашивают: Интервьюер проверяет, знает ли кандидат реальные риски контроля цепочки и не считает ли большинство неограниченным доступом к средствам или состоянию протокола.
Слешинг уничтожает часть стейка валидатора, когда криптографические доказательства подтверждают запрещенное действие в консенсусе.
- В Ethereum к наказуемым действиям относятся предложение двух блоков для одного слота и противоречивые или окружающие голоса.
- Подписанные сообщения служат доказательством, которое другие узлы проверяют без доверия к тому, кто его передал.
- Слешинг отличается от небольшого штрафа за неактивность, который может применяться к отключенному, а не нечестному валидатору.
- Штрафы растут, когда одновременно слешат много валидаторов, что мешает операторам использовать одну общую конфигурацию с единым риском отказа.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат, какое поведение можно доказать, зачем его наказывают и чем слешинг отличается от штрафа за простой.
Блокчейны защищаются от атак Сивиллы, связывая влияние в консенсусе с дефицитным ресурсом, а не с числом идентификаторов.
- Создать тысячи пар ключей почти бесплатно, поэтому одни подписи не доказывают, что ключи принадлежат независимым участникам.
- Proof of work взвешивает влияние по вложенным вычислениям, для которых нужны оборудование и энергия.
- Proof of stake взвешивает влияние по заблокированному стейку, поэтому разделение тех же средств между множеством валидаторов не создает дополнительной общей силы голоса.
- Permissioned-сети могут вместо этого ограничивать участие через проверенные организации, сертификаты или процесс контроля доступа.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат, почему дешевые псевдонимные идентификаторы требуют допуска к консенсусу через ресурс или контролируемое членство.
Закрытые вопросы
- 21
Как связаны приватный и публичный ключи?
- 22
Почему цифровая подпись не равна шифрованию?
encryption - 23
Как из публичного ключа получают адрес EOA в Ethereum?
ethereum - 24
Чем различаются кошелек, аккаунт и приватный ключ?
wallets - 25
Что такое seed-фраза BIP39 и как она используется для получения ключей HD-кошелька?
wallets - 26
Какие свойства делают криптографический хеш полезным в блокчейнах?
blockchain - 27
Что такое дерево Меркла и как работает доказательство Меркла?
cryptography - 28
Какая информация входит в транзакцию Ethereum?
ethereumtransactions - 29
Что такое nonce транзакции EOA и почему он важен?
transactions - 30
Опишите жизненный цикл транзакции Ethereum от подписания до включения в блок.
ethereumtransactions - 31
Почему выполнение в EVM должно быть детерминированным?
evm - 32
Как связаны исходный код Solidity и байткод EVM?
solidevmsolidity - 33
Чем различаются стек, память, хранилище и calldata в EVM?
evmmemorydata-location - 34
Чем транзакция Ethereum отличается от вызова сообщения?
ethereumtransactions - 35
Что происходит с изменениями состояния при откате выполнения EVM?
evmerror-handling - 36
Что такое газ в EVM и как работают лимиты газа транзакции и блока?
evmtransactionsgas - 37
Как рассчитываются комиссии транзакций по EIP-1559?
transactions - 38
Чем eth_call отличается от отправки транзакции?
transactions - 39
Что такое ABI Ethereum и селектор функции?
ethereum - 40
Как работают события, логи и indexed-параметры в Ethereum?
indexesethereum - 41
Какие основные части вы ожидаете увидеть в Solidity-контракте?
solidsolidity - 42
Что делает конструктор Solidity и когда он выполняется?
solidsolidity - 43
Чем отличаются уровни видимости public, external, internal и private в Solidity?
csssolidsolidity - 44
Что означают view, pure и payable у функций Solidity?
solidsolidity - 45
Чем отличаются типы-значения, ссылочные типы и mappings в Solidity?
soliditydata-structuressolid - 46
Когда в Solidity следует использовать require, revert и assert?
solidityerror-handlingsolid - 47
В чём разница между receive и fallback в Solidity?
solidsolidity - 48
Для каких разных задач в Solidity служат наследование, интерфейсы и библиотеки?
typesoopsolidity - 49
Что определяет интерфейс ERC-20 и как работают события и allowances?
tokenstypes - 50
Как в ERC-721 работают владение, approvals и безопасные переводы?
ownershiptokens - 51
Вам нужно выпустить базовый ERC-20 с фиксированным начальным предложением на текущей версии OpenZeppelin Contracts. Как вы его реализуете и проверите?
tokens - 52
Вашему ERC-20 нужен минт после деплоя, но выпускать токены должен только одобренный сервис. Как вы реализуете и протестируете такой контроль доступа?
tokensdeployment - 53
Как вы спроектируете в кошельке сценарий approve для ERC-20, чтобы не дать spender больше allowance, чем намеревался пользователь?
designtokenswallets - 54
Как вы реализуете функцию минта ERC-721 со стабильными метаданными на текущей версии OpenZeppelin Contracts?
tokens - 55
Вы добавляете платный публичный минт в контракт ERC-721. Как вы безопасно примете ETH и предотвратите ошибочный или повторный минт?
tokens - 56
Как вы реализуете простое ETH-хранилище, где каждый пользователь может внести и вывести только собственный учтённый баланс?
secrets - 57
Вы хотите выпускать доли хранилища, чтобы прибыль или убыток распределялись пропорционально. Как вы рассчитаете депозиты и погашения?
secretsdistributed - 58
Как вы реализуете простой краудфандинговый контракт с целью сбора, deadline, выплатой создателю и возвратами?
estimation - 59
Как вы реализуете простую продажу ERC-20 по фиксированной цене с жёстким лимитом токенов?
tokens - 60
Как вы добавите паузу и аварийное управление в контракт, не передавая одному оператору полный контроль?
- 61
Функция withdraw отправляет Ether до обнуления баланса вызывающего. Как вы исправите и проверите её?
- 62
Контракт выполняет target.call(data) и продолжает работу, не читая результат. Что вы измените?
- 63
Административная функция использует require(tx.origin == owner). Как вы её защитите?
- 64
Контракт на Solidity 0.8 увеличивает балансы, а ревьюер предлагает обернуть арифметику в unchecked ради экономии газа. Что вы сделаете?
solidsoliditygas - 65
Функция обмена принимает только amountIn, поэтому другая транзакция может изменить цену до исполнения. Какую защиту вы добавите?
transactions - 66
На ревью вы обнаружили, что setFee и mint может вызвать кто угодно. Как вы исправите отсутствие контроля доступа?
- 67
Функция mint принимает любого получателя и сумму, включая нулевой адрес и ноль. Какую валидацию вы добавите?
validation - 68
Контракт выплат предполагает, что address(this).balance всегда равен записанным депозитам пользователей. Как сделать этот учёт безопасным?
- 69
Функция distribute проходит циклом по всем получателям и с ростом списка перестала помещаться в лимит газа. Как вы предотвратите этот отказ в обслуживании?
gas - 70
Функция deposit вызывает IERC20(token).transferFrom и игнорирует возвращённый boolean. Как вы защитите это взаимодействие?
tokens - 71
Функция объявлена как function sum(uint256[] memory values) external pure returns (uint256) и только читает values. Как снизить расход газа?
memorygas - 72
Контракт объявляет uint128 deposited; uint256 total; uint128 withdrawn; address owner; bool paused. Как улучшить эту раскладку в storage?
- 73
Функция withdraw выполняет require(balances[msg.sender] >= amount), а затем balances[msg.sender] = balances[msg.sender] - amount. Как убрать повторное чтение storage?
- 74
Функция record одновременно добавляет Payment(msg.sender, amount, block.timestamp) в массив payments в storage и обновляет totalPaid[msg.sender], но историю платежей читает только внешний дашборд. Как её улучшить?
- 75
Вывод средств использует require(amount <= balances[msg.sender], "Insufficient balance for requested withdrawal"). Как сделать эту ошибку дешевле и сохранить её полезность для клиентов?
- 76
Контракт сохраняет address public owner из конструктора и инициализирует uint256 public feeBps = 30, причём оба значения никогда не меняются. Как улучшить эти объявления?
- 77
Контракт хранит address[] members, а isMember перебирает весь массив в поиске аккаунта. Как улучшить проверку членства при росте списка?
- 78
Функция getDepositors при каждом вызове копирует в memory весь растущий массив из storage. Как сделать такой getter практичным?
memory - 79
Цикл использует for (uint256 i; i < values.length; i++) для суммирования массива из calldata. Как оптимизировать только инкремент, не отключая безопасность для суммы?
optimizationdata-location - 80
На ревью предлагают заменить mapping(address => bool) allowed на написанный вручную bitmap с assembly исключительно ради экономии газа. Как решить, принимать ли это изменение?
gasdata-structures - 81
Вам нужно протестировать перевод ERC-20 в Hardhat 3. Что вы проверите помимо успешного выполнения транзакции?
tokenstransactionshardhat - 82
Перевод должен завершиться ошибкой InsufficientBalance(address,uint256,uint256). Как вы протестируете эту custom error в Foundry или Hardhat 3?
foundryhardhat - 83
Как вы проверите, что перевод ERC-20 испускает правильное событие Transfer?
tokens - 84
Тесты контракта меняют балансы и права доступа. Как вы изолируете каждый тест в Hardhat 3 и Foundry?
contractfoundryhardhat - 85
Функция claim доступна до сохранённого deadline. Как вы протестируете временные границы без ожидания в реальном времени?
estimation - 86
Как вы протестируете функцию только для владельца с несколькими аккаунтами в Hardhat 3 и Foundry?
foundryhardhat - 87
Как превратить один пример перевода ERC-20 в полезный fuzz-тест Foundry?
tokensfoundry - 88
Как написать простой invariant-тест Foundry для депозитного контракта, который хранит total managed assets и депозит каждого пользователя?
foundry - 89
Вы интегрируете развёрнутый price feed. Когда вы выберете fork-тест вместо локального mock?
mockingdeployment - 90
Как вы проверите, что функция вывода защищена от reentrancy?
reentrancy - 91
Во фронтенде есть provider ethers.js v6 и аккаунт кошелька. Как создать экземпляр контракта для чтения и для записи?
walletsethers - 92
Как с помощью ethers.js v6 прочитать баланс ERC-20, отправить перевод и показать в интерфейсе подтверждённый успех?
tokensethers - 93
После переключения тестнета вызов контракта начал завершаться ошибкой. Как определить, неверны ли ABI, адрес или сеть?
- 94
Квитанция перевода ERC-20 содержит несколько логов из вложенных вызовов контрактов. Как извлечь событие Transfer с помощью ethers.js v6?
tokensethers - 95
WebSocket переподключился, и приложение пропустило несколько событий Transfer. Как надёжно совместить подписку ethers.js и загрузку пропущенных событий?
websocketsethersbackfill - 96
Как перед отправкой перевода токена применить staticCall и estimateGas в ethers.js v6 и чего эти проверки не гарантируют?
estimationtokensethers - 97
Вызов staticCall завершился с CALL_EXCEPTION, а Solidity-контракт объявляет InsufficientBalance(address,uint256,uint256). Как декодировать ошибку в ethers.js v6?
solidsolidityethers - 98
Alice владеет токенами ERC-20, а Bob должен перевести разрешённую сумму Carol. Как реализовать цепочку approve, затем transferFrom через ethers.js v6?
tokensethers - 99
EIP-1559 транзакция пользователя несколько минут остаётся pending из-за слишком низкой комиссии. Как заменить или отменить её через ethers.js v6?
transactionsethers - 100
Нужно развернуть Box(address owner, uint256 initialValue) в Sepolia через Hardhat 3 и верифицировать его в обозревателе. Опишите воспроизводимый процесс и поиск ошибки в constructor arguments.
deploymenthardhatconcurrency