Fehler „ungültiger Absender“ bei web3 in einem privaten PoA-Netz

Ich verwende web3, um die folgende Transaktion zu signieren und sie mit sendSignedTransaction an einen Knoten zu senden. Allerdings bekomme ich immer den Fehler "ungültiger Absender".

Ich habe die Netzwerk-ID in genesis.json auf 6454 gesetzt und der Knoten wurde mit derselben Netzwerk-ID gestartet. Ich habe das gleiche auch für die Unterzeichnung der Transaktion verwendet.

{
"to": "0x609be532b4411da754c55295f9a067819d2b563c",
"value": "0xff",
"gas": "0x61a8",
"gasPrice": "0x1e8f1c10800",
"from": "0x55eb76b1d8ff63ffbe211913a7f91a17cb98063c",
"nonce": "0x0",
"chainId": 6454,
"data": ""

}

BEARBEITEN; Hier ist meine genesis.json

{
"config": {
    "chainId": 6454,
    "homesteadBlock": 1,
    "eip150Block": 2,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 3,
    "eip158Block": 3,
    "byzantiumBlock": 4,
    "clique": {
    "period": 1,
    "epoch": 30000
    }
},
"nonce": "0x0",
"timestamp": "0x5b33af98",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000240ebbd4e36bce0071994d62c78319d028fb651bac65b46b5c6257bd7c790fa51eb54d9f68f559d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x1",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
    "240ebbd4e36bce0071994d62c78319d028fb651b": {
    "balance": "0x500000000000000000000000000000000000000000000000000000000000000"
    },
    "ac65b46b5c6257bd7c790fa51eb54d9f68f559d2": {
    "balance": "0x500000000000000000000000000000000000000000000000000000000000000"
    }
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}

Antworten (3)

Der wahrscheinlichste Fehler ist, dass Sie falsch verwendet haben chainIdoder Ihre private Kette die EIP155-Blocknummer nicht konfiguriert hat. Setzen Sie die EIP155-Blocknummer auf 1, um dies zu beheben. Auch die Brieftasche, die Sie zum Senden der Transaktion verwenden, muss EIP155-fähig sein.

Andernfalls müssen Sie Ihren Signaturprozess debuggen, da Ihre Frage keine detaillierten Informationen enthält, um eine genauere Vermutung anzustellen.

Aus den Quellen:

// Make sure the transaction is signed properly
from, err := types.Sender(pool.signer, tx)
if err != nil {
    return ErrInvalidSender
}
Ich habe meine Frage so bearbeitet, dass sie die Datei genesis.json enthält. Wie Sie sehen können, habe ich config.eip155Block auf 3 gesetzt. „Auch die Brieftasche, die Sie zum Senden der Transaktion verwenden, muss EIP155-fähig sein.“ Wie mache ich das? Ich verwende den privaten Schlüssel, um die Transaktion zu signieren, und ich verwende die networkId beim Signieren. Ist das in Ordnung?
Ich kann nur sagen, dass die Transaktion nicht richtig signiert ist, oder mit anderen Worten, gethdie Quelladresse nicht aus Ihrer Signatur ableiten kann. Führen Sie eine getTransaction() aus und hängen Sie die Ausgabe an Ihre Frage an. Vielleicht entdeckt jemand einen Fehler in Ihren R-, S-, V-Feldern
Übrigens, wenn Sie genesis.json bearbeiten, müssen Sie die Blockchain ab Block 0 neu erstellen, da der Genesis-Block aus der LevelDB-Datenbank gelesen wird, nicht aus genesis.json

Eine weitere Sache, die Sie überprüfen sollten, ist, ob Ihr POA-Knoten SSL verwendet. Wenn ja, geben Sie beim Verbinden des Knotens bitte die https-basierte URL an. Ich hatte das gleiche Problem und hatte lange Zeit mit der Ketten-ID zu kämpfen. Überprüfen Sie dann schließlich, ob die Knoten-URL https anstelle von http war, und es hat wie ein Zauber funktioniert

Dies sieht nach einem Problem mit Version 2.0.0 von ethereumjs-tx aus:

https://github.com/ethereumjs/ethereumjs-tx/issues/165 16

Sie müssen Ihre Transaktion wie folgt aufbauen:

const tx = new Tx(txObject, {chain:'ropsten', hardfork: 'petersburg'})