Warum wird die Geth-IPC-Datei nicht erstellt, obwohl dort "Endpunkt geöffnet" steht?

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.ipcwie 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"
Könnten Sie bitte einen Fehlerbericht in unserem Problem-Tracker öffnen? github.com/ethereum/go-ethereum/issues

Antworten (1)

(Diese Seite wird neu organisiert, wenn dieses Problem behoben ist)

EDIT 30.04.2016

@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 --networkidUND Sie verknüpfen dann alle Mining- und Nicht-Mining-Clients mithilfe des Parameters oder mithilfe der Konfigurationsdatei oder .--genesis--bootnodesstatic-nodes.jsontrusted-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 .


ALTES ZEUG UNTEN



Frage an @spraff

  1. Welche Version gethverwenden Sie in Ihren verschiedenen Terminals?

    Sie scheinen die Entwicklungszweigversion von gethin dem Terminal auszuführen, in dem Sie auf das --ipcpathProblem stoßen.

    Vielleicht möchten Sie versuchen, die Master- Branch-Version zu verwenden, gethin der --ipcpathdas zu funktionieren scheint.

    Sie sollten dennoch einen Fehlerbericht einreichen, wie von vorgeschlagen, @Péter Szilágyiwenn das --ipcpathnicht mit der Entwicklungszweigversion von funktioniert geth.

  2. Ist mehr als eine Version von gethauf 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?



Entrollen Sie Ihre Befehle

Ihre Skriptdatei ist etwas kompliziert zu lesen, daher habe ich die Befehle entrollt.

Terminal A

# ./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

Terminal B

# ./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.ipcwird 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.ipckeine 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?



Problem 1 – Welche Version von gethverwenden 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 gethauf 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 --ipcpathBefehl 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



IPC testen

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 gethVersion unter Linux zu funktionieren.

Hier ist Ihr gethBefehl 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 gethVersion unter Linux.

Hinweis : /ethereumbefindet 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 gethBefehl 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.

Danke das sieht sehr hilfreich aus! Ich lief Version: 1.5.0-unstablevon 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 --keystoreFlag nicht hat. Können Sie das bitte kommentieren? Danke vielmals.
Wenn Sie das Keystore-Verzeichnis auf etwas anderes als das Unterverzeichnis --datadir setzen müssen, verwenden Sie einfach Softlinks, wie in ethereum.stackexchange.com/questions/3402/… gezeigt .
Nein, das ist es nicht. Ich habe die Keystore-Flags gelöscht, aber das Problem bleibt bestehen, wenn ich 1.3.6 ausführe, ABER der Befehl 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.
Können Sie die vollständigen Details des 1.3.6-Befehls angeben, der nicht funktioniert, mit allen erweiterten Optionen?
Miner: geth --networkid 1100 --maxpeers 5 --mine --minerthreads 1 -rpccorsdomain "*" --datadir /eth/.ethereum-test-miner --port 33301IPC-Server:geth --networkid 1100 --maxpeers 5 --datadir /eth/.ethereum-test-client --ipcapi 'admin,eth,miner,db,net,web3,personal' --ipcpath "/eth/geth.ipc"
Funktioniert nur die IPC Server Version nicht? Was passiert, wenn Sie am Ende dieses Befehls eine "Konsole" hinzufügen? Können Sie die anfänglichen Startmeldungen am Ende Ihrer ursprünglichen Frage hinzufügen?
Keine Bange. Ethereum.SE ist Teil meiner Forschung zu Ethereum. Ich habe gestern meinen ersten Anwendungsfall mit Smart Contracts für einen Kunden gefunden, also bin ich zufrieden. Ich werde Ihre Befehlszeilenoptionen in ein paar Stunden mit Ihrer Ausgabe vergleichen.
Ich habe mit Ihrem Befehl getestet und unterschiedliche Ergebnisse von Ihnen erhalten. Da muss ich noch etwas überlegen.