Я новичок в Ethereum и пробовал все, чтобы подключить тестовую сеть с двух узлов локальной машины. Я попытался запустить две консоли на одной машине с помощью admin.addPeers (nodeUrl) и смог подключиться. когда я пытался использовать одно и то же для разных машин, используя один и тот же сетевой идентификатор, он показывает количество одноранговых узлов как ноль. пожалуйста, помогите решить это. заранее спасибо
Поскольку вы используете два узла на двух разных машинах, вам необходимо указать IP-адрес узла при подключении через addPeer(enodeURI)
.
Подробное прохождение:
Вам нужно иметь один и тот же файл генезиса на каждой машине, на которой вы хотите запустить узел.
Все узлы должны иметь одинаковые--networkid
И --rpcport
должны --port
быть разными для каждого экземпляра geth.
Если вы работаете на одной и той же машине, каждый экземпляр geth должен иметь разные файлы --datadir
.
Запуск экземпляров geth:
Узел 1:
geth --genesis path/to/genesis.json --datadir path/to/directory --networkid 1234 --port 30301 --rpcport 8101 console
Узел 2:
geth --genesis path/to/genesis.json --datadir path/to/directory --networkid 1234 --port 30302 --rpcport 8102 console
Вы можете добавить такие команды, как --maxpeers
и --nodiscover
, если хотите.
После запуска этих экземпляров проверьте наличие похожего сообщения в консоли:
I0829 13:30:07.347738 3987 backend.go:303] Successfully wrote genesis block. New genesis hash = 82b6159155c00fb0b420046012a02257a176ad5dcfce4be4a15da39c166518e2
Если это так, вы успешно запустили узлы с частной цепочкой блоков. Если вы видите сообщение, похожее на Warning: Wrote default ethereum genesis block
, значит, что-то не так.
Соединительные узлы:
Узел 1: (в консоли JavaScript)
admin.nodeInfo.enode
Вывод будет примерно таким:
"enode://da97197a3335806658f17fdc167e943bd040fdf59ed882389d5f87b29f31362b12f13bd58438b7b5619497b54bab252a696cafc7cdd9696c4db1cacdb7e6a962@[::]:30301"
Обратите внимание, что номер порта в конце URI равен 30301.
Узел 2:
Выполните ту же команду на узле 2, и вы получите аналогичный вывод с 30302 в конце:
"enode://47e61e304d802fb98403fbf877e1018d13044630a16eb9c15c1d0fb139d465e02d995acd239768f6ced04579d9639d8a75c73c30d7443a9d6d6146a44c8b5e7b@[::]:30302"
Чтобы соединить эти узлы, узнайте IP-адрес узла 2. Так как это локальная сеть, каждая машина должна иметь уникальный частный IP-адрес. При использовании addPeer(enodeURI)
функции [::]
в enodeURI следует заменить IP-адрес машины, на которой работает узел. Теперь на узле 1:
admin.addPeer("enode://47e61e304d802fb98403fbf877e1018d13044630a16eb9c15c1d0fb139d465e02d995acd239768f6ced04579d9639d8a75c73c30d7443a9d6d6146a44c8b5e7b@10.0.0.123:30302")
После того, как эта команда вернет true , она net.peerCount
должна вернуть 1 и admin.peers
должна вернуть сведения о добавленном/подключенном узле. Перед подключением проверьте, net.listening
возвращает ли значение true на обоих узлах.
Источники:
Ответ Роланда хорош, но вы должны иметь в виду, что geth (и все эфириумы на данный момент) привязаны к одним и тем же портам по умолчанию, что означает, что вы должны изменить их по умолчанию при запуске нескольких экземпляров на одном хосте (например, 127.0.0.1) .
Довольно легко просто увеличить порты по умолчанию для каждого экземпляра, а затем создать сценарий (bash) для их независимого запуска (как фоновые процессы).
Если вы хотите большей независимости между экземплярами geth, рассмотрите возможность создания отдельного каталога данных для каждого (измените аргумент командной строки --datadir из другого ответа):
--datadir "~/privethnet/geth_client"
--datadir "~/privethnet/geth_bootstrap"
Создайте файл с именем genesis.json со следующим содержимым:
{
"nonce": "0xdeadbeefdeadbeef",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x8000000",
"difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {
}
}
Запустите следующее:geth --datadir ./ init genesis.json
geth --identity "nodeA" --rpc --rpcport "8000" --rpccorsdomain "*" --datadir "~/privethnet/" --port "30303" --ipcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --rpcapi "db,eth,net,web3" --autodag --networkid 1900 --nat "any" console
geth --identity "nodeB" --rpc --rpcport "8000" --rpccorsdomain "*" --datadir "~/privethnet/" --port "30303" --ipcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --rpcapi "db,eth,net,web3" --autodag --networkid 1900 --nat "any" console
Добавьте одноранговый узел, используя URL-адрес однорангового узла:
найдите одноранговый узел в журнале запуска geth.0712 13:34:00.865021 p2p/discover/udp.go:217] Listening, enode:...
admin.addPeer(nodeURL)
Проверьте, был ли добавлен одноранговый узел:admin.peers
Примеры nodeURLS: Node A nodeURL:
enode://da97197a3335806658f17fdc167e943bd040fdf59ed882389d5f87b29f31362b12f13bd58438b7b5619497b54bab252a696cafc7cdd9696c4db1cacdb7e6a962@151.62.56.89:30303
URL-адрес узла узла B:
enode://9d4687d7cfa8c2215d2f2b4278a3e0ab4bde22ab838dd203b234866d69405b4b704fce4a71638f8c66018ba187a3599c612267ac382589bb81131c7dc18ff251@151.62.56.89:30303
Пользователь на Github по имени FleetingCloud собрал приятный скрипт пользовательского интерфейса в командном стиле для настройки Ethereum в частной сети. Я очень рекомендую это.
https://libraries.io/github/FleetingClouds/InitializeEthereumPrivateNetwork
Редактировать:
После клонирования репозитория просто запустите скрипт initializeEthereumPrivateNetwork.sh. Затем он спросит вас, как вы хотели бы назвать свою сеть, каталоги geth на корневых и клиентских узлах и т. д.
--genesis больше недействителен. Вместо этого нужно использовать init. Вот мой код, который я заменил на шаг 1:
geth --identity "MyTestNode" --nodiscover --networkid 1999 --port 30301 -- rpcport 8101 --datadir /home/appo/geth/ init /home/appo/.json console
Вы можете установить любые флаги и порты, которые вы хотите, это просто код, который я запускал на своей машине.
Степан Яковенко
Пратик Гайквад