Ich habe eine Transaktion in Go erstellt und mit einem EIP155Signer
Unterzeichner 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 From
Feld 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
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 config
im Genesis-Block zu deklarieren, der es spezifizierte. Ein Beispiel:
"config": {
"chainID" : 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
}
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.
danke
Richard Horrocks
danke