Я настроил частную сеть 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 друг от друга, или это какая-то ошибка?
Идентификатор сети и идентификатор цепочки — это одно и то же.
Вы можете редактировать NetworkId
в eth/config.go
& params/config.go
и избавиться от этой проблемы навсегда, вам больше не нужно указывать network id
в командной строке.
Эфириум geth
жестко запрограммировал значение 1
в файлах, о которых я вам говорил, вот почему у вас возникают эти проблемы.
Теперь chain id
это часть транзакции в результате Предложения по улучшению Ethereum (EIP) № 155, поэтому invalid sender
показано, потому что chain id
отличается. Вы можете отключить это с помощью EIP155BlockNum , но вы будете уязвимы для повторной атаки, если вы используете несколько сетей, например, тестовую сеть.
chain id
не является частью хеша блока, поэтому указывать его в генезис-файле действительно бесполезно. Вместо этого вам нужно указать chainID в исходном коде или с помощью параметров командной строки.
chainID
поле в блок генезиса, но база данных блокчейна не сохранит его. chainID
является параметром только geth
исходного кода, а не базы данных. Это то, что я имею в виду.chainID
был добавлен в Transaction
таблицу s путем добавления предложения EIP155 в geth
. Это единственное хранилище chainID
в базе данных.chainID
admin
в консоли, в protocols
разделе вы можете увидеть network
(это chainID
) и убедиться, что он установлен правильноgeth
читает ваш genesis.json и сохраняет идентификатор цепочки в параметрах внутри. При следующем запуске geth
он считывает chainID оттуда. Но chainID
это не часть хэша блока, поэтому он не запечатан криптографически, если кто-то скопирует вашу базу данных и изменит chainID
, все будет нормально работать с другим chainID
, если не включен EIP155. Если EIP155 включен, geth
вы получите ошибку invalid sender
при обработке первой транзакции с поддержкой EIP155.chainId
файл генезиса. Во второй цепочке вы собираетесь удалить эту строку и инициализировать ее, не указывая chainID в генезисе. Вы обнаружите, что оба блокчейна абсолютно одинаковы.
Ричард Хоррокс