Skip to content

Commit

Permalink
Self decode to convert to kaia's eth tx type
Browse files Browse the repository at this point in the history
  • Loading branch information
Mdaiki0730 committed Jan 24, 2025
1 parent e44856e commit 5d3a699
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 36 deletions.
39 changes: 5 additions & 34 deletions blockchain/types/tx_internal_data_serializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
43 changes: 41 additions & 2 deletions tests/block_test_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -612,8 +612,47 @@ 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 != 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
Expand Down

0 comments on commit 5d3a699

Please sign in to comment.