Fehler aufgrund eines ungültigen Absenders in der privaten Kette

Ich habe eine Transaktion in Go erstellt und mit einem EIP155SignerUnterzeichner signiert, aber wenn ich versuche, die Transaktion über den Go-Client in der privaten Blockchain zu veröffentlichen, erhalte ich den Fehler Invalid sender. Irgendeine Ahnung, was hier passiert?

Dieses Problem scheint denselben Fehler zu haben: https://github.com/ethereum/web3.js/issues/566

Die Transaktion wird korrekt signiert (Zeichenfolgenausgabe unten), aber das FromFeld wird nie ausgefüllt, und ich kann es nicht in Go festlegen, da es sich um ein verstecktes Strukturfeld handelt, das intern von der festgelegt wirdEIP155Signer

tx before sign=
    TX(e694193e2f4d6dc099444ff0057456e23cafe0f8035c7c70daf688bc2bf5546a)
    Contract: false
    From:     [invalid sender: invalid sig]
    To:       b424f3bcc3da6f54f27f5f4af0c9c18d567702e6
    Nonce:    0
    GasPrice: 0x0
    GasLimit  0x0
    Value:    0x0
    Data:     0x746865626573746461746165766572
    V:        0x0
    R:        0x0
    S:        0x0
    Hex:      ec80808094b424f3bcc3da6f54f27f5f4af0c9c18d567702e6808f746865626573746461746165766572808080

signed tx=
    TX(ff6c011c7527f74e00fde94f6a4a5e523211f21f221c0b7133bf723486b3284c)
    Contract: false
    From:     [invalid sender: invalid sig]
    To:       b424f3bcc3da6f54f27f5f4af0c9c18d567702e6
    Nonce:    0
    GasPrice: 0x0
    GasLimit  0x0
    Value:    0x0
    Data:     0x746865626573746461746165766572
    V:        0x0
    R:        0x91a89e1ee55cc959572c050780301701c7f02436701db5961ccb01d556c2e708
    S:        0x699559f036a1153b2f979cd01ee9b0beb0e889c8aaab0dbd5a46dd7931842f02
    Hex:      f86c80808094b424f3bcc3da6f54f27f5f4af0c9c18d567702e6808f74686562657374646174616576657280a091a89e1ee55cc959572c050780301701c7f02436701db5961ccb01d556c2e708a0699559f036a1153b2f979cd01ee9b0beb0e889c8aaab0dbd5a46dd7931842f02

Scheint, dass der Absender nicht gemäß dieser Quelldatei abgeleitet werden kann, wenn die Transaktion gedruckt wird: https://github.com/ethereum/go-ethereum/blob/8771c3061f340451d0966adcc547338a25f2231f/core/types/transaction.go#L273

Habe das früher herausgefunden, wird aktualisiert
Kannst du uns verraten, wie du das gelöst hast? :)
@RichardHorrocks Ich schreibe jetzt eine Antwort

Antworten (3)

Das Problem war, dass die Ketten-ID nicht richtig eingestellt wurde. Dadurch wurden Transaktionen mit der falschen Chain-ID signiert, sodass der Absender nicht korrekt abgeleitet werden konnte. Der Fix bestand darin, auch a configim Genesis-Block zu deklarieren, der es spezifizierte. Ein Beispiel:

"config": {
    "chainID"       : 10,
    "homesteadBlock": 0,
    "eip155Block":    0,
    "eip158Block":    0
}
Woher wissen Sie, was die richtige ChainId sein sollte?
Sie definieren die Ketten-ID, aber einige Nummern sind reserviert. Die Ketten-ID 1 wird beispielsweise vom Ethereum-Hauptnetz verwendet.
ChainID 3 für Ropsten hat das für mich gelöst.

vor der Unterschrift: rawTx.v = Buffer.from([chainId]) rawTx.nonce = web3.utils.toHex(web3.eth.getTransactionCount(account))

Ändern Sie das Folgende

      const Tx = require('ethereumjs-tx').Transaction;

      var transaction_data = {
        "from": myAddress,
        "gasPrice": web3js.utils.toHex(20 * 1e9),
        "gasLimit": web3js.utils.toHex(210000),
        "to": contractAddress,
        "value": "0x0",
        "data": contract.methods.safeTransferFrom(myAddress, toAddress, tokenId).encodeABI(),
      }

        var privateKey = Buffer.from('abcde', 'hex')

        var transaction = new Tx(transaction_data,{ chain: 'ropsten' , hardfork: 'petersburg' });

        transaction.sign(privateKey);

        web3js.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex'))
            .on('transactionHash', console.log);

nach unten

      const Tx = require('ethereumjs-tx').Transaction;

      var transaction_data = {
        "from": myAddress,
        "gasPrice": web3js.utils.toHex(20 * 1e9),
        "gasLimit": web3js.utils.toHex(210000),
        "to": contractAddress,
        "value": "0x0",
        "data": contract.methods.safeTransferFrom(myAddress, toAddress, tokenId).encodeABI(),
      }

        var privateKey ='abcde'

        web3js.eth.accounts.signTransaction(transaction_data, privateKey)
        .then(function(value){
            web3js.eth.sendSignedTransaction(value.transaction_data)
            .then(function(response){
              console.log("response:" + JSON.stringify(response, null, ' '));
            })
          })

web3js.eth.accounts.signTransactionübernimmt die Last, die richtige ChainId und Nonce einzufügen.


Referenz: https://github.com/ChainSafe/web3.js/issues/1040