forked from cerc-io/laconicd-deprecated
!fix(evm): Fix eth tx hashes in json-rpc responses (#1176)
* Fix eth tx hashes in json-rpc responses Closes: #1175 - Remove Size_ field - Validate From/Hash fields in ante handler - Recompute tx hashes in json-rpc apis to cope with old blocks Update CHANGELOG.md remove Size_, validate Hash/From, add unit tests update spec Update CHANGELOG.md Update app/ante/eth.go populate From in SendRawTransaction Apply suggestions from code review keep Size_ field to avoid breaking tx format * move some validation to ValidateBasic * move validation to ValidateBasic * make ToTransaction returns a valid msg * restructure the protoTxProvider check * add comment * workaround tx hash issue in event parsing * fix integration test * fix unit test Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
co-authored by
Federico Kunze Küllmer
parent
8932a6d743
commit
ffe78da36e
@@ -1009,6 +1009,7 @@ func (b *Backend) GetEthereumMsgsFromTendermintBlock(resBlock *tmrpctypes.Result
|
||||
continue
|
||||
}
|
||||
|
||||
ethMsg.Hash = ethMsg.AsTransaction().Hash().Hex()
|
||||
result = append(result, ethMsg)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ func (api *PublicFilterAPI) NewPendingTransactionFilter() rpc.ID {
|
||||
for _, msg := range tx.GetMsgs() {
|
||||
ethTx, ok := msg.(*evmtypes.MsgEthereumTx)
|
||||
if ok {
|
||||
f.hashes = append(f.hashes, common.HexToHash(ethTx.Hash))
|
||||
f.hashes = append(f.hashes, ethTx.AsTransaction().Hash())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -221,7 +221,7 @@ func (api *PublicFilterAPI) NewPendingTransactions(ctx context.Context) (*rpc.Su
|
||||
for _, msg := range tx.GetMsgs() {
|
||||
ethTx, ok := msg.(*evmtypes.MsgEthereumTx)
|
||||
if ok {
|
||||
_ = notifier.Notify(rpcSub.ID, common.HexToHash(ethTx.Hash))
|
||||
_ = notifier.Notify(rpcSub.ID, ethTx.AsTransaction().Hash())
|
||||
}
|
||||
}
|
||||
case <-rpcSub.Err():
|
||||
|
||||
+14
-1
@@ -155,8 +155,21 @@ func (p *ParsedTxs) newTx(attrs []abci.EventAttribute) error {
|
||||
}
|
||||
|
||||
// updateTx updates an exiting tx from events, called during parsing.
|
||||
// In event format 2, we update the tx with the attributes of the second `ethereum_tx` event,
|
||||
// Due to bug https://github.com/evmos/ethermint/issues/1175, the first `ethereum_tx` event may emit incorrect tx hash,
|
||||
// so we prefer the second event and override the first one.
|
||||
func (p *ParsedTxs) updateTx(eventIndex int, attrs []abci.EventAttribute) error {
|
||||
return fillTxAttributes(&p.Txs[eventIndex], attrs)
|
||||
tx := NewParsedTx(eventIndex)
|
||||
if err := fillTxAttributes(&tx, attrs); err != nil {
|
||||
return err
|
||||
}
|
||||
if tx.Hash != p.Txs[eventIndex].Hash {
|
||||
// if hash is different, index the new one too
|
||||
p.TxHashes[tx.Hash] = eventIndex
|
||||
}
|
||||
// override the tx because the second event is more trustworthy
|
||||
p.Txs[eventIndex] = tx
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetTxByHash find ParsedTx by tx hash, returns nil if not exists.
|
||||
|
||||
@@ -107,6 +107,8 @@ func TestParseTxResult(t *testing.T) {
|
||||
}},
|
||||
{Type: evmtypes.EventTypeEthereumTx, Attributes: []abci.EventAttribute{
|
||||
{Key: []byte("amount"), Value: []byte("1000")},
|
||||
{Key: []byte("ethereumTxHash"), Value: []byte(txHash.Hex())},
|
||||
{Key: []byte("txIndex"), Value: []byte("0")},
|
||||
{Key: []byte("txGasUsed"), Value: []byte("21000")},
|
||||
{Key: []byte("txHash"), Value: []byte("14A84ED06282645EFBF080E0B7ED80D8D8D6A36337668A12B5F229F81CDD3F57")},
|
||||
{Key: []byte("recipient"), Value: []byte("0x775b87ef5D82ca211811C1a02CE0fE0CA3a455d7")},
|
||||
|
||||
@@ -34,6 +34,7 @@ func RawTxToEthTx(clientCtx client.Context, txBz tmtypes.Tx) ([]*evmtypes.MsgEth
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid message type %T, expected %T", msg, &evmtypes.MsgEthereumTx{})
|
||||
}
|
||||
ethTx.Hash = ethTx.AsTransaction().Hash().Hex()
|
||||
ethTxs[i] = ethTx
|
||||
}
|
||||
return ethTxs, nil
|
||||
|
||||
Reference in New Issue
Block a user