Как добавить пиров в частную сеть?

Я создал приватный блокчейн на двух разных машинах. Теперь я хочу, чтобы эти узлы соединялись друг с другом как «пиры». Я использую gethконсоль.

Я пробовал следующую команду:

> admin.addPeer("enode://3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694@10.10.23.196:30301");

Вот 10.10.23.196IP второй машины и 30301порт, на котором она работает.

Значение trueотображается, но когда я набираю:

> admin.peers

[]отображается.

Что-то не так с подходом? Если это поможет, я использую следующую команду для запуска geth на обеих машинах.

geth --identity "Sukhi" --genesis CustomGenesis.json \
     --rpc --rpcport "8001" --rpccorsdomain "*" \
     --datadir "chaindata" --port "30301" \
     --ipcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" \
     --rpcapi "db,eth,net,web3" --autodag --networkid 1900 --nat "any" console

Более того, одна и та же процедура работает для двух уникальных узлов на одной машине.

Мне интересно, как два узла находят друг друга?

Ответы (7)

Ваша проблема, вероятно, в том же блоке генезиса. Вам нужно указать тот же файл genesis json и быть уверенным, что он используется со всеми командами (и с init тоже). Установите уровень детализации на 10, чтобы понять, что происходит.

Всем привет. В июле вы сказали: «Вам нужно указать тот же файл генезиса json и убедиться, что он используется со всеми командами». Как вы указываете файл генезиса ДРУГИМ, чем когда вы выполняете инициализацию? Как для обычного призыва fo geth? У меня та же проблема, что и у ОП. (Мой проблемный узел — это geth, два моих хороших узла — Parity, если это поможет.) Я также пробовал admin.addPeer, и admin.peers дает мне [] точно так же, как OP.
github.com/paritytech/parity/wiki/Chain-specification вам нужно для паритета, чтобы преобразовать ваш файл генезиса в формат паритета.
Я думаю, вы неправильно понимаете. Узлы четности работают нормально. Вопрос в том, как заставить geth работать. Значит, мне нужно идти в другом направлении, от четности к гету.
Сделайте обратное. geth также использует файл генезиса. Преобразуйте вашу четность в формат geth.
Можете ли вы сказать мне, как это сделать? У меня есть файл генезиса, который я создал вручную, и я думаю, что он правильно основан на файле Parity. Но он не подключается, поэтому мне нужны некоторые подробности, если они у вас есть, пожалуйста.
  • Genesis.json должен быть одинаковым во всех узлах. Если вы не уверены, попробуйте проверить это с помощью контрольной суммы
  • Убедитесь, что нет проблем с сетью. Если вы используете виртуальную машину, попробуйте использовать мостовую сеть или сеть NAT, чтобы узлы могли легко обмениваться данными друг с другом.
  • Пожалуйста, позаботьтесь о номерах портов. Разные узлы должны иметь разные номера портов, как описано здесь .
  • Новый узел должен немного поработать, чтобы иметь возможность синхронизироваться с блокчейном в вашей частной тестовой сети. ( отсюда ).

Пожалуйста, опубликуйте вывод вашей команды geth.

Убедитесь, что порт RPC ( --rpcport) и порт eth ( --port) различаются во всех экземплярах geth. Если машины не находятся в одной сети, вам придется использовать общедоступный IP-адрес при добавлении узла. Чтобы проверить, работают ли экземпляры в частной цепочке блоков, проверьте наличие аналогичного сообщения после запуска экземпляра geth:

I0920 08:59:31.877152   10724 backend.go:303] Successfully wrote genesis block. New genesis hash = 6e92f8b2..........

Вместо этого, если вы получите сообщение, похожее на это, могут быть проблемы с вашим файлом генезиса:

I0920 08:59:31.877152 10724 backend.go:303] WARNING: Wrote default Ethereum Genesis Block.

Используйте net.listeningкоманду в консоли JS и проверьте, возвращает ли она значение true.

Не уверен, что вы уже решили свою проблему, но у меня была аналогичная проблема некоторое время назад.

Для меня проблема заключалась в том, что сеть по умолчанию использует IP-адрес локального хоста (127.0.0.1). Вы должны добавить флаг «--rpcaddr», за которым следует ваш IP-адрес. Итак, это должно выглядеть так:

--rpcaddr 10.10.23.196

Надеюсь, это помогло!

вы также можете установить его на 0.0.0.0, чтобы принимать все адреса

Сначала убедитесь, что между двумя машинами существует неограниченная связь: например, порты заблокированы каким-то брандмауэром.

Если это не проблема, и вы используете тот же файл генезиса, то может случиться так, что вы установили низкую начальную сложность в файле генезиса. До тех пор, пока сложность не изменится, блоки будут добавляться очень быстро, и два узла не успеют синхронизироваться.

Если это не поможет, не могли бы вы предоставить вывод консоли geth с включенной отладочной информацией?

Если вы не указали неправильный IP-адрес или порт, проблема должна быть в блоке генезиса. Чтобы убедиться, что у вас одинаковые блоки генезиса на каждом узле, используйте:

web3.eth.getBlock(0);

Проверьте поле hash, оно должно быть одинаковым на обоих узлах. Если это не так, узлы не будут подключаться.

Если они совпадают, значит, у вас проблемы с сетью, проверьте правила брандмауэра, номера портов и тому подобное.

Также может быть вероятность, что ваши узлы имеют одинаковые ключи узлов. Это может произойти, если вы скопируете каталог блокчейна с расширением cp -r. Затем на одном из узлов вы должны удалить nodekeyфайл, чтобы можно было восстановить новый ключ для узла.

Убедитесь, что порт, указанный вами с помощью флага «--port», открыт на второй машине.

Чтобы открыть этот порт на второй машине (30301 в вашем случае):

sudo ufw allow 30301

Я новичок в этом, и я два дня боролся с этим..!