Error de remitente no válido en cadena privada

Creé una transacción en Go, la firmé con un EIP155Signerfirmante, pero cuando intento publicar la transacción a través del cliente Go en la cadena de bloques privada, aparece el error Invalid sender. ¿Alguna idea de lo que está pasando aquí?

Este problema parece tener el mismo error: https://github.com/ethereum/web3.js/issues/566

La transacción se firma correctamente (salida de cadena a continuación), pero el Fromcampo nunca se completa y no puedo configurarlo en Go porque es un campo de estructura oculto que está configurado internamente por elEIP155Signer

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

Parece que el remitente no se puede derivar de acuerdo con este archivo fuente cuando se imprime la transacción: https://github.com/ethereum/go-ethereum/blob/8771c3061f340451d0966adcc547338a25f2231f/core/types/transaction.go#L273

Me di cuenta de esto antes, se actualizará
¿Puedes decirnos cómo resolviste esto? :)
@RichardHorrocks Escribiré una respuesta ahora

Respuestas (3)

El problema era que la identificación de la cadena no se estaba configurando correctamente. Como resultado, las transacciones se firmaron con la identificación de cadena incorrecta, por lo que el remitente no se pudo derivar correctamente. La solución fue declarar también a configen el bloque de génesis que lo especificaba. Un ejemplo:

"config": {
    "chainID"       : 10,
    "homesteadBlock": 0,
    "eip155Block":    0,
    "eip158Block":    0
}
¿Cómo sabes cuál debería ser el chainId correcto?
Usted define la identificación de la cadena, pero algunos números están reservados. La identificación de cadena 1, por ejemplo, es utilizada por la red principal de Ethereum.
ChainID 3 para Ropsten me resolvió esto.

antes de firmar: rawTx.v = Buffer.from([chainId]) rawTx.nonce = web3.utils.toHex(web3.eth.getTransactionCount(account))

Cambia lo de abajo

      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);

a la de abajo

      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.signTransactionasumirá la carga de incluir el chainId y el nonce correctos.


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