Почему файл geth ipc не создается, хотя в нем написано «конечная точка открыта»?

У меня был тестовый код, который отлично работал через IPC с использованием готового geth. Я попытался настроить тестовую сеть, и клиент IPC сломался.

Я хочу запустить два процесса — процесс geth майнера, который заменяет сообщество в целом, и процесс geth сервера IPC, который заменяет то, что будет работать на моем собственном веб-сервере.

Вот сценарий, который фиксирует то, что, по моему мнению, я должен делать.

#!/bin/bash

E="/store/ethereum/"

H="/store/home/"

D="$H/.ethereum-test"

G="geth --networkid 1100 --maxpeers 5"

PORT="--port 33301"

RPC="--rpcport 33302"

WSRPC="--wsport 33303"

IPC="--ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath \"$E/geth.ipc\""

MINE="--mine  --minerthreads 1 -rpccorsdomain \"*\""

KS="--keystore \"$E/keystore\""

if [[ "$1" == "setup" ]]
then
    # Start fresh
    rm -rf "$D-miner"
    rm -rf "$D-client"

    # Accept conditions and type exit.
    $G --genesis test-genesis.json -nodiscover -maxpeers 0 --datadir "$D-miner" console
elif [[ "$1" == "newacc" ]]
then
    # Enter passphrase and note address.
    # Last generated address:
    # bcd47eee60f5d8f73977785a55ab081bf8f37582
    # 5b3e83ff30e61287cf2d8eed5b8c1ead40d10432
    # a770c607f4bde0cdf1fa84e8721e9b53fce8a176
    # (older)
    $G $KS --datadir $D-miner account new
elif [[ "$1" == "mine" ]]
then
    # Mine
    $G $MINE $KS --datadir $D-miner $PORT
elif [[ "$1" == "ipc" ]]
then
    $G --datadir $D-client $IPC
else
    echo "Argument: setup newacc mine or ipc"
fi

Я использую это так.

В терминале А:

./testnet setup
./testnet newacc
./testnet mine

Майнинг работает нормально.

В терминале Б:

./testnet ipc

Этот работает нормально. Он выводит, что он создал $E/geth.ipc, как и обещал.

Тогда вот NodeJS, который раньше работал нормально:

var web3_extended = require ('web3_extended');

var options =
{
        host:     './geth.ipc',
        ipc:      true,
        personal: true, 
        admin:    false,
        debug:    false
};

var web3 = web3_extended .create (options);

Это дает

IPC Connection Error { [Error: connect ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'connect' }

Странно, что geth в терминале B выводит эту строку

I0427 12:53:00.381003 node/node.go:298] IPC endpoint opened: "/ethereum/geth.ipc"

Но если яls /ethereum/geth.ipc

Такой файл не создается (как это было с ванильным гетом). Да, у меня есть права на запись в этот каталог. Майнер в терминале А создает свой geth.ipc в другом месте.

Что пошло не так?

РЕДАКТИРОВАТЬ

Miner производит этот вывод при запуске с

geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /ethereum/.ethereum-test-miner --port 33301

И сервер IPC производит этот вывод при запуске с

geth --networkid 1100 --maxpeers 5 --datadir /ethereum/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/ethereum/geth.ipc"
Не могли бы вы открыть отчет об ошибке в нашем трекере? github.com/ethereum/go-ethereum/issues

Ответы (1)

(Эта страница будет реорганизована, когда эта проблема будет решена)

РЕДАКТИРОВАТЬ 30.04.2016

@spraff, глядя на ваши последние данные:

Miner производит этот вывод при запуске с

geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /ethereum/.ethereum-test-miner --port 33301

И сервер IPC производит этот вывод при запуске с

geth --networkid 1100 --maxpeers 5 --datadir /ethereum/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/ethereum/geth.ipc"

пути к файлам IPC выглядят правильно. Однако похоже, что вы пытаетесь связать свой майнер с вашим IPC-клиентом, используя протокол IPC.

Протокол IPC предназначен для связывания узла (майнингового или не майнингового) с клиентом (например, консольным просмотрщиком geth attach ipc://path/geth.ipc, таким как Ethereum Wallet или веб-клиентом).

Что вы, вероятно, захотите сделать, так это создать частную сеть Ethereum, в которой как ваши клиенты для майнинга, так и клиенты, не занимающиеся майнингом, подключены к одной и той же сети блокчейна. Это делается с использованием тех же флагов --networkidи , И затем вы связываете всех майнинговых и не майнинговых клиентов с помощью параметра или с помощью файла конфигурации или .--genesis--bootnodesstatic-nodes.jsontrusted-nodes.json

Вы можете найти способ связать клиентов в Peer discovery, не работающем в частной сети . Некоторая информация также доступна в Соединение между узлами никогда не происходит в пользовательской цепочке блоков .


СТАРЫЕ МАТЕРИАЛЫ НИЖЕ



Вопрос для @spraff

  1. Какую версию gethвы используете на разных терминалах?

    Похоже, вы используете версию ветки разработкиgeth в терминале, где вы столкнулись с --ipcpathпроблемой.

    Вы можете попробовать использовать версию основнойgeth ветки, где, --ipcpathпохоже, работает.

    Вы все равно должны подать отчет об ошибке, как это было предложено, @Péter Szilágyiесли --ipcpathне работает с версией ветки разработкиgeth .

  2. gethНа вашем компьютере установлено более одной версии (и на разных терминалах)? Проверьте с помощью команд:

    find / -name 'geth'
    ls -al `which geth`
    

    Вы используете ту версию geth, которую собираетесь запускать?



Развертывание ваших команд

Ваш файл сценария немного сложен для чтения, поэтому я развернул команды.

Терминал А

# ./testnet setup
rm -rf /store/home//.ethereum-test-miner
rm -rf /store/home//.ethereum-test-client
geth --networkid 1100 --maxpeers 5                    \
  --genesis test-genesis.json -nodiscover -maxpeers 0 \
  --datadir "/store/home//.ethereum-test-miner" console

# ./testnet newacc
geth --networkid 1100 --maxpeers 5      \
  --keystore "/store/ethereum//keystore" \
  --datadir /store/home//.ethereum-test-miner account new

# ./testnet mine
geth --networkid 1100 --maxpeers 5            \
  --mine  --minerthreads 1 -rpccorsdomain "*" \
  --keystore "/store/ethereum//keystore"      \
  --datadir /store/home//.ethereum-test-miner \
  --port 33301

Терминал Б

# ./testnet ipc
geth --networkid 1100 --maxpeers                  \
  --datadir /store/home//.ethereum-test-client    \
  --ipcapi 'admin,eth,miner,db,net,web3,personal' \
  --ipcpath "/store/ethereum//geth.ipc"

Этот работает нормально. Он выводит, что создал $E/geth.ipc, как и было обещано.

Таким образом, файл IPC /store/ethereum/geth.ipcсоздается, как и ожидалось .

Странно, что geth в терминале B выводит эту строку

I0427 12:53:00.381003 node/node.go:298] IPC endpoint opened: "/ethereum/geth.ipc"

Но если я ls /ethereum/geth.ipcне создаю такой файл (как это было с ванильным гетом). Да, у меня есть права на запись в этот каталог. Майнер в терминале А создает свой geth.ipc в другом месте. Что пошло не так?



Вопрос 1. Какую версию gethвы используете или собираетесь использовать?

Я нашел node/node.go в ветке разработки go-ethereum со следующим кодом:

go func() {
    glog.V(logger.Info).Infof("IPC endpoint opened: %s", n.ipcEndpoint)

Когда я запускаю gethсвой компьютер, я получаю следующее сообщение:

I0428 00:42:38.207812   14842 ipc.go:112] IPC service started (/home/user/.ethereum/geth.ipc)
instance: Geth/v1.3.6/linux/go1.5.1

Команда --ipcpathработает правильно в моей версии geth:

$ geth --ipcpath /tmp/geth.ipc console

I0428 01:24:01.896976   20433 ipc.go:112] IPC service started (/tmp/geth.ipc)
instance: Geth/v1.3.6/linux/go1.5.1



Тестирование IPC

Я использовал вашу последнюю команду, чтобы проверить путь к файлу IPC:

user@Kumquat:/tmp$ geth --networkid 1100 --maxpeers 5 \
  --datadir ./eth/.ethereum-test-client               \
  --ipcapi 'admin,eth,miner,db,net,web3,personal'     \
  --ipcpath "./eth/geth.ipc"

...

I0428 09:14:09.309467   22639 cmd.go:115] Starting Geth/v1.3.6/linux/go1.5.1
I0428 09:14:10.789959   22639 ipc.go:112] IPC service started (eth/geth.ipc)

Так что, похоже, он работает для моей gethверсии в Linux.

Вот ваша gethкоманда с выводом, который вы указали в своей ссылке:

geth --networkid 1100 --maxpeers 5                \
  --datadir /eth/.ethereum-test-client            \
  --ipcapi 'admin,eth,miner,db,net,web3,personal' \
  --ipcpath "/eth/geth.ipc"
...
I0427 22:24:27.875773   30370 cmd.go:115] Starting Geth/v1.3.6/linux/go1.5.1
I0427 22:24:30.222976   30370 ipc.go:112] IPC service started ("/ethereum/geth.ipc")

Но он также не работает для вашей gethверсии в Linux.

Примечание : /ethereumнаходится в вашем корневом каталоге. Обычно процессы не могут создавать файлы в корневом каталоге без разрешения суперпользователя. Возможно, в этом причина.

Я только что перепроверил с помощью команды:

geth --networkid 1100 --maxpeers 5                \
  --datadir ./eth/.ethereum-test-client           \
  --ipcapi 'admin,eth,miner,db,net,web3,personal' \
  --ipcpath "/ethereum/geth.ipc"

И это сообщение об ошибке, которое я получаю:

Fatal: Error string IPC: mkdir /ethereum: permission denied

Я создал подкаталог /ethereumбез изменения разрешений:

sudo mkdir /ethereum

И снова запустив последнюю gethкоманду, получите другое сообщение об ошибке:

Fatal: Error string IPC: listen unix /ethereum/geth.ipc: bind: permission denied

Теперь я меняю владельца каталога:

sudo chown user:user /ethereum

И это работает:

I0428 09:29:10.777981   22740 ipc.go:112] IPC service started (/ethereum/geth.ipc)

Хм. Я подумаю об этом еще немного.

Спасибо, это выглядит очень полезным! Я запускал Version: 1.5.0-unstablePPA-репозиторий Ubuntu ethereum-dev, очистил его и переустановил Version: 1.3.6— вполне возможно, что это он, хотя эта версия не имеет --keystoreфлага. Не могли бы вы прокомментировать это? Большое спасибо.
Если вам нужно установить каталог хранилища ключей на что-либо, кроме подкаталога --datadir, просто используйте программные ссылки, как показано на ethereum.stackexchange.com/questions/3402/… .
Нет, это не то. Я сбросил флаги хранилища ключей, но проблема сохраняется, когда я запускаю 1.3.6, ОДНАКО команда geth --ipcapi "db,eth,net,web3,personal" --ipcpath "$P/geth.ipc"работает как обычно (для того же двоичного файла), просто сейчас я не в тестовой сети.
Можете ли вы предоставить полную информацию о команде 1.3.6, которая не работает, со всеми расширенными параметрами?
Майнер: geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /eth/.ethereum-test-miner --port 33301IPC-сервер:geth --networkid 1100 --maxpeers 5 --datadir /eth/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/eth/geth.ipc"
Не работает только версия IPC Server? Что произойдет, если вы добавите «консоль» в конце этой команды? Можете ли вы добавить начальные сообщения о запуске в конец исходного вопроса?
Без проблем. Ethereum.SE является частью моего исследования Ethereum. Вчера я нашел свой первый вариант использования смарт-контрактов для клиента, так что я доволен. Я проверю ваши параметры командной строки на вашем выводе через несколько часов.
Я протестировал вашу команду и получил от вас разные результаты. Мне придется подумать об этом еще немного.