diff --git a/blockchain/types/tx_internal_data_serializer.go b/blockchain/types/tx_internal_data_serializer.go index f5d813975..98b251cac 100644 --- a/blockchain/types/tx_internal_data_serializer.go +++ b/blockchain/types/tx_internal_data_serializer.go @@ -69,42 +69,13 @@ func (serializer *TxInternalDataSerializer) EncodeRLP(w io.Writer) error { func (serializer *TxInternalDataSerializer) DecodeRLP(s *rlp.Stream) error { if err := s.Decode(&serializer.txType); err != nil { // fallback to the original transaction decoding. - kind, _, err := s.Kind() - switch { - case err != nil: + txd := newEmptyTxInternalDataLegacy() + if err := s.Decode(txd); err != nil { return err - case kind == rlp.List: - // It's a legacy transaction. - txd := newEmptyTxInternalDataLegacy() - if err := s.Decode(txd); err != nil { - return err - } - serializer.txType = TxTypeLegacyTransaction - serializer.tx = txd - return nil - default: - // It's an EIP-2718 typed TX envelope. - // First read the tx payload bytes into a temporary buffer. - ethType, err := s.ReadByte() - if err != nil { - return err - } - - switch ethType { - case 1: - serializer.tx = new(TxInternalDataEthereumAccessList) - case 2: - serializer.tx = new(TxInternalDataEthereumDynamicFee) - case 3: - return errUndefinedTxType - case 4: - serializer.tx = new(TxInternalDataEthereumSetCode) - default: - return errUndefinedTxType - } - - return s.Decode(serializer.tx) } + serializer.txType = TxTypeLegacyTransaction + serializer.tx = txd + return nil } if serializer.txType == EthereumTxTypeEnvelope { diff --git a/tests/block_test_util.go b/tests/block_test_util.go index e23f0935b..128e7eefe 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -612,8 +612,49 @@ func (bb *btBlock) decodeTx() (types.Transactions, TestHeader, error) { // Decode transactions var txs types.Transactions - if err := s.Decode(&txs); err != nil { - return nil, TestHeader{}, fmt.Errorf("failed to decode transactions: %v", err) + if _, err := s.List(); err != nil { + return nil, TestHeader{}, fmt.Errorf("failed to enter outer list: %v", err) + } + + // Self decode to convert to kaia's eth tx type + for { + var tx types.Transaction + kind, _, err := s.Kind() + if err == rlp.EOL { + break + } else if err != nil { + return nil, TestHeader{}, fmt.Errorf("failed to get RLP kind: %v", err) + } + + txdata, _ := s.Raw() + ethTxDataInKaia := []byte{} + switch kind { + case rlp.List: // case of legacy + ethTxDataInKaia = txdata + case rlp.String: // case of envelope + var ethTypeIndex int + if txdata[0] < 0xb7 { + ethTypeIndex = 1 + } else { + ethTypeIndex = int(txdata[0] - 0xb7 + 1) + } + switch txdata[ethTypeIndex] { + case 1, 2, 4: // eth transaction types whick kaia support + ethTxDataInKaia = append([]byte{byte(types.EthereumTxTypeEnvelope)}, txdata[ethTypeIndex:]...) + default: + ethTxDataInKaia = txdata + } + default: + return nil, TestHeader{}, fmt.Errorf("failed to get RLP kind: %v", err) + } + + streamForTx := rlp.NewStream(bytes.NewReader(ethTxDataInKaia), 0) + if err := streamForTx.Decode(&tx); err == rlp.EOL { + break + } else if err != nil { + return nil, TestHeader{}, fmt.Errorf("failed to decode transaction: %v", err) + } + txs = append(txs, &tx) } return txs, header, nil