Параметр Geth «networkid» по сравнению с конфигурацией блока Genesis «chainId»?

Я настроил частную сеть Ethereum с пользовательским идентификатором цепочки (например, 67890), указанным в части конфигурации файла genesis.json, выполнил geth init genesis.json и запустил частную сеть. Однако затем я заметил некоторые странные вещи, например, web3 sendTransaction не работает, поскольку он говорит о недопустимом отправителе, только после того, как я явно укажу chainId в транзакции json до 67890, тогда он сможет правильно отправить транзакцию.

Итак, я попробовал несколько тестов и обнаружил, что когда я запускаю web3.eth.net.getNetworkType(), он возвращает частную сеть, но когда я запускаю web3.eth.net.getId(), он возвращает 1. И после некоторого возни я узнал что мне нужно добавить --networkid 67890 в параметр командной строки geth для web3.eth.net.getId(), чтобы вернуть правильное значение 67890.

Итак, мой вопрос: в чем разница между указанием networkid в командной строке geth и указанием chainId в genesis.json? Я думал, что networkid и chainId — это одно и то же, и кажется, что web3 использует значение networkid для значения по умолчанию для chainId транзакции, но почему-то, когда я запускаю geth без явного параметра networkid, он игнорирует конфигурацию chainId и по-прежнему использовать 1 по умолчанию, в результате чего networkid отличается от chainId.

Итак, для блокчейна Эфириума имеет ли смысл отличать networkid и chainId друг от друга, или это какая-то ошибка?

Ответы (1)

  1. Идентификатор сети и идентификатор цепочки — это одно и то же.

  2. Вы можете редактировать NetworkIdв eth/config.go& params/config.goи избавиться от этой проблемы навсегда, вам больше не нужно указывать network idв командной строке.

  3. Эфириум gethжестко запрограммировал значение 1в файлах, о которых я вам говорил, вот почему у вас возникают эти проблемы.

  4. Теперь chain idэто часть транзакции в результате Предложения по улучшению Ethereum (EIP) № 155, поэтому invalid senderпоказано, потому что chain idотличается. Вы можете отключить это с помощью EIP155BlockNum , но вы будете уязвимы для повторной атаки, если вы используете несколько сетей, например, тестовую сеть.

  5. chain idне является частью хеша блока, поэтому указывать его в генезис-файле действительно бесполезно. Вместо этого вам нужно указать chainID в исходном коде или с помощью параметров командной строки.

Я не думаю, что полностью понимаю ваш ответ, поэтому вы имеете в виду, что мы не должны указывать chainId в genesis.json? что бесполезно указывать chainId в файле генезиса? Тогда почему, когда я указываю chainId в файле генезиса, но не сетевой идентификатор в командной строке geth, он возвращает недопустимую ошибку отправителя? Кроме того, транзакция будет отправлена ​​правильно, если я укажу, что chainId в транзакции будет таким же, как в файле генезиса. Таким образом, хотя web3.eth.net.getId() зависит от параметра networkid, web3.eth.sendSignedTransaction зависит от chainID в файле генезиса?
Правильно, вы можете поместить chainIDполе в блок генезиса, но база данных блокчейна не сохранит его. chainIDявляется параметром только gethисходного кода, а не базы данных. Это то, что я имею в виду.
Однако год спустя блок 2675000 chainIDбыл добавлен в Transactionтаблицу s путем добавления предложения EIP155 в geth. Это единственное хранилище chainIDв базе данных.
Итак, если вы настроите свою приватную цепочку, вы можете работать с EIP155 или без нее. Без EIP155 вам не нужноchainID
введите adminв консоли, в protocolsразделе вы можете увидеть network(это chainID) и убедиться, что он установлен правильно
Я все еще очень запутался в этом EIP155. Таким образом, с EIP155 вам нужно поместить chainId в файл генезиса, чтобы при отправке транзакции вам нужно было убедиться, что параметр chainId совпадает с параметром, указанным в файле генезиса. Однако он не требует, чтобы chainId в генезис-файле совпадал с networkid Geth, поэтому вы можете оказаться в приватной цепочке, где web3.eth.getId() возвращает одно число, а вам нужно указать другое число для параметр chainId в транзакции для правильной отправки? Звучит довольно странно, почему они должны это позволять?
Вероятно, при инициализации блокчейна gethчитает ваш genesis.json и сохраняет идентификатор цепочки в параметрах внутри. При следующем запуске gethон считывает chainID оттуда. Но chainIDэто не часть хэша блока, поэтому он не запечатан криптографически, если кто-то скопирует вашу базу данных и изменит chainID, все будет нормально работать с другим chainID, если не включен EIP155. Если EIP155 включен, gethвы получите ошибку invalid senderпри обработке первой транзакции с поддержкой EIP155.
Думаю, чтобы понять, что я имею в виду, нужно сделать упражнение. Создайте 2 частные цепочки. В первой цепочке вы собираетесь указать chainIdфайл генезиса. Во второй цепочке вы собираетесь удалить эту строку и инициализировать ее, не указывая chainID в генезисе. Вы обнаружите, что оба блокчейна абсолютно одинаковы.
Я также отредактировал ответ № 5, чтобы сделать его более понятным.
Что меня сбивает с толку, так это то, что если я укажу «chainId: 67890» в файле генезиса и запущу geth без изменения кода или установки сетевого идентификатора (таким образом, он остается по умолчанию 1), когда я запускаю web3.eth.net. getId() я получу результат как 1. Когда я попытаюсь отправить транзакцию с помощью web3.eth.sendSignedTransaction без указания chainId, он сообщит о «недействительном отправителе», но если я отправлю транзакцию с помощью web3.eth.sendSignedTransaction и указав chainId как 67890, это удастся. Это кажется довольно странной ситуацией.
Я думал, что они должны сообщать об ошибке или что-то в этом роде, если ваш netwokid в параметрах geth и chainId в файле genesis различаются при запуске geth, но, по-видимому, при запуске geth нет ошибки, просто когда вы читаете networkid с помощью web3, вы получаете 1, но когда вы отправляете транзакцию с помощью web3, вам нужно указать 67890 в качестве chainId. Почему они должны допускать такую ​​ситуацию, если networkid и chainId должны быть одним и тем же? Почему мне разрешено запускать частную цепочку, где networkid и chainId на самом деле разные?
ну, это вопрос к Ethereum Foundation.