Ich hatte einen Testcode, der gut über IPC mit dem sofort einsatzbereiten Geth funktionierte. Ich habe versucht, ein Testnetzwerk einzurichten, und es hat den IPC-Client beschädigt.
Ich möchte zwei Prozesse ausführen – einen Miner-Geth-Prozess, der stellvertretend für die Community im Allgemeinen steht, und einen IPC-Server-Geth-Prozess, der stellvertretend für das steht, was auf meinem eigenen Webserver laufen würde.
Hier ist das Skript, das festhält, was ich meiner Meinung nach tun sollte.
#!/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
Ich benutze es so.
Im Terminal A:
./testnet setup
./testnet newacc
./testnet mine
Bergbau funktioniert gut.
Im Terminal B:
./testnet ipc
Dieser scheint gut zu funktionieren. Es gibt aus, dass es $E/geth.ipc
wie versprochen erstellt wurde.
Dann ist hier das NodeJS, das vorher gut funktioniert hat:
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);
Dies ergibt
IPC Connection Error { [Error: connect ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'connect' }
Seltsam ist, dass geth in Terminal B diese Leitung ausgibt
I0427 12:53:00.381003 node/node.go:298] IPC endpoint opened: "/ethereum/geth.ipc"
Aber wenn ichls /ethereum/geth.ipc
Es wird keine solche Datei erstellt (wie es bei Vanilla Geth der Fall war). Ja, ich habe Schreibrechte für dieses Verzeichnis. Der Miner in Terminal A erstellt seine geth.ipc woanders.
Was ist schief gelaufen?
BEARBEITEN
Miner erzeugt diese Ausgabe, wenn er gestartet wird
geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /ethereum/.ethereum-test-miner --port 33301
Und der IPC-Server erzeugt diese Ausgabe, wenn er gestartet wird
geth --networkid 1100 --maxpeers 5 --datadir /ethereum/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/ethereum/geth.ipc"
(Diese Seite wird neu organisiert, wenn dieses Problem behoben ist)
@spraff, wenn Sie sich Ihre neuesten Daten ansehen:
Miner erzeugt diese Ausgabe, wenn er gestartet wird
geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /ethereum/.ethereum-test-miner --port 33301
Und der IPC-Server erzeugt diese Ausgabe, wenn er gestartet wird
geth --networkid 1100 --maxpeers 5 --datadir /ethereum/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/ethereum/geth.ipc"
die IPC-Dateipfade sehen korrekt aus. Es sieht jedoch so aus, als ob Sie versuchen, Ihren Miner über das IPC-Protokoll mit Ihrem IPC-Client zu verbinden.
Das IPC-Protokoll soll einen Knoten (Mining oder Nicht-Mining) mit einem Client (z. B. Konsolen-Viewer wie geth attach ipc://path/geth.ipc
, Ethereum Wallet oder Web-Client) verbinden.
Wahrscheinlich möchten Sie ein privates Ethereum-Netzwerk erstellen, in dem sowohl Ihre Mining-Clients als auch Nicht-Mining-Clients mit demselben Blockchain-Netzwerk verbunden sind. Dies geschieht mit denselben Flags und --networkid
UND Sie verknüpfen dann alle Mining- und Nicht-Mining-Clients mithilfe des Parameters oder mithilfe der Konfigurationsdatei oder .--genesis
--bootnodes
static-nodes.json
trusted-nodes.json
Die Methode zum Verbinden der Clients finden Sie unter Peer-Erkennung funktioniert nicht im privaten Netzwerk . Einige Informationen finden Sie auch unter Connection between peers never happen on custom blockchain .
Welche Version geth
verwenden Sie in Ihren verschiedenen Terminals?
Sie scheinen die Entwicklungszweigversion von geth
in dem Terminal auszuführen, in dem Sie auf das --ipcpath
Problem stoßen.
Vielleicht möchten Sie versuchen, die Master- Branch-Version zu verwenden, geth
in der --ipcpath
das zu funktionieren scheint.
Sie sollten dennoch einen Fehlerbericht einreichen, wie von vorgeschlagen, @Péter Szilágyi
wenn das --ipcpath
nicht mit der Entwicklungszweigversion von funktioniert geth
.
Ist mehr als eine Version von geth
auf Ihrem Computer (und in Ihren verschiedenen Terminals) installiert? Überprüfen Sie mit den Befehlen:
find / -name 'geth'
ls -al `which geth`
Führen Sie die Version aus geth
, die Sie ausführen möchten?
Ihre Skriptdatei ist etwas kompliziert zu lesen, daher habe ich die Befehle entrollt.
# ./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"
Dieser scheint gut zu funktionieren. Es gibt aus, dass es wie versprochen $E/geth.ipc erstellt hat.
Die IPC-Datei /store/ethereum/geth.ipc
wird also wie erwartet erstellt
Seltsam ist, dass geth in Terminal B diese Leitung ausgibt
I0427 12:53:00.381003 node/node.go:298] IPC endpoint opened: "/ethereum/geth.ipc"
Aber wenn ich
ls /ethereum/geth.ipc
keine solche Datei erstellt (wie es bei Vanilla Geth war). Ja, ich habe Schreibrechte für dieses Verzeichnis. Der Miner in Terminal A erstellt seine geth.ipc woanders. Was ist schief gelaufen?
geth
verwenden Sie oder beabsichtigen Sie auszuführen?Ich habe node/node.go im Entwicklungszweig von go-ethereum mit dem folgenden Code gefunden:
go func() {
glog.V(logger.Info).Infof("IPC endpoint opened: %s", n.ipcEndpoint)
Wenn ich geth
auf meinem Computer starte, erhalte ich die folgende Meldung:
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
Der --ipcpath
Befehl funktioniert korrekt in meiner Version von 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
Ich habe Ihren neuesten Befehl verwendet, um den IPC-Dateipfad zu testen:
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)
Es scheint also für meine geth
Version unter Linux zu funktionieren.
Hier ist Ihr geth
Befehl mit der Ausgabe, die Sie in Ihrem Link bereitgestellt haben:
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")
Aber es funktioniert auch nicht für Ihre geth
Version unter Linux.
Hinweis : /ethereum
befindet sich in Ihrem Stammverzeichnis. Normalerweise können Prozesse ohne Superuser-Berechtigung keine Dateien im Stammverzeichnis erstellen. Vielleicht ist dies der Grund.
Ich habe gerade noch einmal mit dem Befehl getestet:
geth --networkid 1100 --maxpeers 5 \
--datadir ./eth/.ethereum-test-client \
--ipcapi 'admin,eth,miner,db,net,web3,personal' \
--ipcpath "/ethereum/geth.ipc"
Und das ist die Fehlermeldung, die ich bekomme:
Fatal: Error string IPC: mkdir /ethereum: permission denied
Ich habe das Unterverzeichnis erstellt /ethereum
, ohne die Berechtigungen zu ändern:
sudo mkdir /ethereum
Wenn Sie den letzten geth
Befehl erneut ausführen, erhalten Sie eine andere Fehlermeldung:
Fatal: Error string IPC: listen unix /ethereum/geth.ipc: bind: permission denied
Ich ändere jetzt den Besitzer des Verzeichnisses:
sudo chown user:user /ethereum
Und es funktioniert:
I0428 09:29:10.777981 22740 ipc.go:112] IPC service started (/ethereum/geth.ipc)
Hmmm. Ich werde noch ein bisschen darüber nachdenken.
Version: 1.5.0-unstable
von Ubuntu Ethereum-dev PPA aus, löschte es und installierte es neu Version: 1.3.6
- das könnte es durchaus sein, obwohl diese Version das --keystore
Flag nicht hat. Können Sie das bitte kommentieren? Danke vielmals.geth --ipcapi "db,eth,net,web3,personal" --ipcpath "$P/geth.ipc"
funktioniert wie gewohnt (für dieselbe Binärdatei), es ist nur so, dass ich jetzt nicht im Testnet bin.geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /eth/.ethereum-test-miner --port 33301
IPC-Server:geth --networkid 1100 --maxpeers 5 --datadir /eth/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/eth/geth.ipc"
Peter Szilágyi