@@ -88,7 +88,7 @@ defmodule DB.Entry do
8888 db_opts [ :rtx_commit ] && RocksDB . transaction_commit ( db_opts . rtx )
8989 end
9090
91- def apply_into_main_chain ( entry , muts_hash , muts_rev , receipts , root_receipts , root_contractstate , db_opts = % { rtx: _ } ) do
91+ def apply_into_main_chain ( entry , muts_hash , muts_rev , { logs , receipts } , root_receipts , root_contractstate , db_opts = % { rtx: _ } ) do
9292 entry_packed = Entry . pack_for_db ( entry )
9393 RocksDB . put ( entry . hash , entry_packed , db_handle ( db_opts , :entry , % { } ) )
9494 RocksDB . put ( "by_height:#{ pad_integer ( entry . header . height ) } :#{ entry . hash } " , entry . hash , db_handle ( db_opts , :entry_meta , % { } ) )
@@ -102,21 +102,41 @@ defmodule DB.Entry do
102102 RocksDB . put ( "entry:#{ entry . hash } :root_receipts" , root_receipts , db_handle ( db_opts , :entry_meta , % { } ) )
103103 RocksDB . put ( "entry:#{ entry . hash } :root_contractstate" , root_contractstate , db_handle ( db_opts , :entry_meta , % { } ) )
104104
105- Enum . each ( Enum . zip ( entry . txs , receipts ) , fn ( { txu , result } ) ->
106- case :binary . match ( entry_packed , TX . pack ( txu ) ) do
107- { index_start , index_size } ->
108- tx_ptr = % { entry_hash: entry . hash , result: result , index_start: index_start , index_size: index_size }
109- |> RDB . vecpak_encode ( )
110- RocksDB . put ( txu . hash , tx_ptr , db_handle ( db_opts , :tx , % { } ) )
111-
112- nonce_padded = pad_integer_20 ( txu . tx . nonce )
113- RocksDB . put ( "#{ txu . tx . signer } :#{ nonce_padded } " , txu . hash , db_handle ( db_opts , :tx_account_nonce , % { } ) )
114- TX . known_receivers ( txu )
115- |> Enum . each ( fn ( receiver ) ->
116- RocksDB . put ( "#{ receiver } :#{ nonce_padded } " , txu . hash , db_handle ( db_opts , :tx_receiver_nonce , % { } ) )
117- end )
118- end
119- end )
105+ if entry . header . height >= RDBProtocol . forkheight ( ) do
106+ receipts_by_txid = Map . new ( receipts , fn r -> { r . txid , Map . drop ( r , [ :txid ] ) } end )
107+ Enum . each ( entry . txs , fn ( txu ) ->
108+ receipt = Map . fetch! ( receipts_by_txid , txu . hash )
109+ case :binary . match ( entry_packed , TX . pack ( txu ) ) do
110+ { index_start , index_size } ->
111+ tx_ptr = % { entry_hash: entry . hash , receipt: receipt , index_start: index_start , index_size: index_size }
112+ |> RDB . vecpak_encode ( )
113+ RocksDB . put ( txu . hash , tx_ptr , db_handle ( db_opts , :tx , % { } ) )
114+
115+ nonce_padded = pad_integer_20 ( txu . tx . nonce )
116+ RocksDB . put ( "#{ txu . tx . signer } :#{ nonce_padded } " , txu . hash , db_handle ( db_opts , :tx_account_nonce , % { } ) )
117+ TX . known_receivers ( txu )
118+ |> Enum . each ( fn ( receiver ) ->
119+ RocksDB . put ( "#{ receiver } :#{ nonce_padded } " , txu . hash , db_handle ( db_opts , :tx_receiver_nonce , % { } ) )
120+ end )
121+ end
122+ end )
123+ else
124+ Enum . each ( Enum . zip ( entry . txs , logs ) , fn ( { txu , result } ) ->
125+ case :binary . match ( entry_packed , TX . pack ( txu ) ) do
126+ { index_start , index_size } ->
127+ tx_ptr = % { entry_hash: entry . hash , result: result , index_start: index_start , index_size: index_size }
128+ |> RDB . vecpak_encode ( )
129+ RocksDB . put ( txu . hash , tx_ptr , db_handle ( db_opts , :tx , % { } ) )
130+
131+ nonce_padded = pad_integer_20 ( txu . tx . nonce )
132+ RocksDB . put ( "#{ txu . tx . signer } :#{ nonce_padded } " , txu . hash , db_handle ( db_opts , :tx_account_nonce , % { } ) )
133+ TX . known_receivers ( txu )
134+ |> Enum . each ( fn ( receiver ) ->
135+ RocksDB . put ( "#{ receiver } :#{ nonce_padded } " , txu . hash , db_handle ( db_opts , :tx_receiver_nonce , % { } ) )
136+ end )
137+ end
138+ end )
139+ end
120140 end
121141
122142 def apply_into_main_chain_muts ( hash , muts , db_opts = % { rtx: _ } ) do
0 commit comments