Creé una transacción en Go, la firmé con un EIP155Signer
firmante, 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 From
campo 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
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 config
en el bloque de génesis que lo especificaba. Un ejemplo:
"config": {
"chainID" : 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
}
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.signTransaction
asumirá la carga de incluir el chainId y el nonce correctos.
Referencia: https://github.com/ChainSafe/web3.js/issues/1040
gracias
Richard Horrocks
gracias