У меня был тестовый код, который отлично работал через 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"
(Эта страница будет реорганизована, когда эта проблема будет решена)
@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
--bootnodes
static-nodes.json
trusted-nodes.json
Вы можете найти способ связать клиентов в Peer discovery, не работающем в частной сети . Некоторая информация также доступна в Соединение между узлами никогда не происходит в пользовательской цепочке блоков .
Какую версию geth
вы используете на разных терминалах?
Похоже, вы используете версию ветки разработкиgeth
в терминале, где вы столкнулись с --ipcpath
проблемой.
Вы можете попробовать использовать версию основнойgeth
ветки, где, --ipcpath
похоже, работает.
Вы все равно должны подать отчет об ошибке, как это было предложено, @Péter Szilágyi
если --ipcpath
не работает с версией ветки разработкиgeth
.
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 в другом месте. Что пошло не так?
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:
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-unstable
PPA-репозиторий Ubuntu ethereum-dev, очистил его и переустановил Version: 1.3.6
— вполне возможно, что это он, хотя эта версия не имеет --keystore
флага. Не могли бы вы прокомментировать это? Большое спасибо.geth --ipcapi "db,eth,net,web3,personal" --ipcpath "$P/geth.ipc"
работает как обычно (для того же двоичного файла), просто сейчас я не в тестовой сети.geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /eth/.ethereum-test-miner --port 33301
IPC-сервер:geth --networkid 1100 --maxpeers 5 --datadir /eth/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/eth/geth.ipc"
Питер Силаджи