Skip to content

Commit ab47c73

Browse files
authored
Merge pull request #69 from DOS/sync-upstream-v11.0.3
Sync upstream v11.0.3 (merge conflicts)
2 parents 6465e3f + a588738 commit ab47c73

31 files changed

Lines changed: 382 additions & 233 deletions

CHANGELOG.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11
# Changelog
22

3+
## 11.0.3
4+
5+
### 🐛 Bug Fixes
6+
7+
- Insert AddressIdToAddressHash via safe_insert_all ([#14333](https://github.com/blockscout/blockscout/pull/14333))
8+
- Force search for contract creator if internal transactions module is disabled ([#14324](https://github.com/blockscout/blockscout/issues/14324))
9+
- Add transactions uniqueness before insert ([#14329](https://github.com/blockscout/blockscout/issues/14329))
10+
11+
### ⚙️ Miscellaneous Tasks
12+
13+
- Don't lock tables if foreign keys are already dropped ([#14321](https://github.com/blockscout/blockscout/issues/14321))
14+
- Dev branch + CI, remove obsolete GA workflows ([#14317](https://github.com/blockscout/blockscout/issues/14317))
15+
16+
317
## 11.0.2
418

519
### 🐛 Bug Fixes
620

7-
- Process empty list of changes on fetching contract codes ((#14312)[https://github.com/blockscout/blockscout/pull/14312])
21+
- Process empty list of changes on fetching contract codes ([#14312](https://github.com/blockscout/blockscout/pull/14312))
822
- Add fallback for empty "to" in Geth selfdestruct ([#14256](https://github.com/blockscout/blockscout/issues/14256))
923
- Trim contractaddresses in getcontractcreation ([#14306](https://github.com/blockscout/blockscout/issues/14306))
1024
- Adapt maybe_reject_zero_value for empty blocks ([#14309](https://github.com/blockscout/blockscout/issues/14309))
1125
- Add missing internal transactions address preload ([#14308](https://github.com/blockscout/blockscout/issues/14308))
12-
- Fix some web tests ([#14310][https://github.com/blockscout/blockscout/pull/14310])
26+
- Fix some web tests ([#14310](https://github.com/blockscout/blockscout/pull/14310))
1327

1428
### ⚙️ Miscellaneous Tasks
1529

apps/block_scout_web/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule BlockScoutWeb.Mixfile do
1919
lockfile: "../../mix.lock",
2020
package: package(),
2121
start_permanent: Mix.env() == :prod,
22-
version: "11.0.2",
22+
version: "11.0.3",
2323
xref: [
2424
exclude: [
2525
Explorer.Chain.Beacon.Reader,

apps/ethereum_jsonrpc/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule EthereumJSONRPC.MixProject do
1919
elixirc_paths: elixirc_paths(Mix.env()),
2020
lockfile: "../../mix.lock",
2121
start_permanent: Mix.env() == :prod,
22-
version: "11.0.2"
22+
version: "11.0.3"
2323
]
2424
end
2525

apps/explorer/lib/explorer/chain/import/runner/blocks.ex

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ defmodule Explorer.Chain.Import.Runner.Blocks do
1919
BlockNumberHelper,
2020
DenormalizationHelper,
2121
Import,
22-
PendingBlockOperation,
2322
PendingOperationsHelper,
2423
SmartContract,
2524
Token,
@@ -106,16 +105,6 @@ defmodule Explorer.Chain.Import.Runner.Blocks do
106105
:blocks
107106
)
108107
end)
109-
|> Multi.run(:new_pending_block_operations, fn repo, %{blocks: blocks} ->
110-
Instrumenter.block_import_stage_runner(
111-
fn ->
112-
new_pending_block_operations(repo, blocks, insert_options)
113-
end,
114-
:address_referencing,
115-
:blocks,
116-
:new_pending_block_operations
117-
)
118-
end)
119108
|> Multi.run(:uncle_fetched_block_second_degree_relations, fn repo, _ ->
120109
Instrumenter.block_import_stage_runner(
121110
fn ->
@@ -695,32 +684,6 @@ defmodule Explorer.Chain.Import.Runner.Blocks do
695684
lose_consensus(repo, blocks_changes, opts)
696685
end
697686

698-
defp new_pending_block_operations(repo, inserted_blocks, %{timeout: timeout, timestamps: timestamps}) do
699-
case PendingOperationsHelper.pending_operations_type() do
700-
"blocks" ->
701-
sorted_pending_ops =
702-
inserted_blocks
703-
|> RangesHelper.filter_by_height_range(&RangesHelper.traceable_block_number?(&1.number))
704-
|> Enum.filter(& &1.consensus)
705-
|> Enum.map(&%{block_hash: &1.hash, block_number: &1.number})
706-
|> Enum.sort()
707-
708-
Import.insert_changes_list(
709-
repo,
710-
sorted_pending_ops,
711-
conflict_target: :block_hash,
712-
on_conflict: :nothing,
713-
for: PendingBlockOperation,
714-
returning: true,
715-
timeout: timeout,
716-
timestamps: timestamps
717-
)
718-
719-
_other_type ->
720-
{:ok, []}
721-
end
722-
end
723-
724687
defp delete_address_coin_balances(_repo, [], _options), do: {:ok, []}
725688

726689
defp delete_address_coin_balances(repo, non_consensus_blocks, %{timeout: timeout}) do

apps/explorer/lib/explorer/chain/import/runner/transactions.ex

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,17 @@ defmodule Explorer.Chain.Import.Runner.Transactions do
1010

1111
alias Ecto.{Multi, Repo}
1212
alias EthereumJSONRPC.Utility.RangesHelper
13-
alias Explorer.Chain.{Block, Hash, Import, PendingOperationsHelper, PendingTransactionOperation, Transaction}
13+
14+
alias Explorer.Chain.{
15+
Block,
16+
Hash,
17+
Import,
18+
PendingBlockOperation,
19+
PendingOperationsHelper,
20+
PendingTransactionOperation,
21+
Transaction
22+
}
23+
1424
alias Explorer.Chain.Import.Runner.TokenTransfers
1525
alias Explorer.Prometheus.Instrumenter
1626
alias Explorer.Utility.MissingBlockRange
@@ -66,14 +76,14 @@ defmodule Explorer.Chain.Import.Runner.Transactions do
6676
:transactions
6777
)
6878
end)
69-
|> Multi.run(:new_pending_transaction_operations, fn repo, %{transactions: transactions} ->
79+
|> Multi.run(:new_pending_operations, fn repo, %{transactions: transactions} ->
7080
Instrumenter.block_import_stage_runner(
7181
fn ->
72-
new_pending_transaction_operations(repo, transactions, insert_options)
82+
new_pending_operations(repo, transactions, insert_options)
7383
end,
7484
:block_referencing,
7585
:transactions,
76-
:new_pending_transaction_operations
86+
:new_pending_operations
7787
)
7888
end)
7989
end
@@ -105,7 +115,10 @@ defmodule Explorer.Chain.Import.Runner.Transactions do
105115
on_conflict = Map.get_lazy(options, :on_conflict, &default_on_conflict/0)
106116

107117
# Enforce Transaction ShareLocks order (see docs: sharelocks.md)
108-
ordered_changes_list = Enum.sort_by(changes_list, & &1.hash)
118+
ordered_changes_list =
119+
changes_list
120+
|> Enum.uniq_by(& &1.hash)
121+
|> Enum.sort_by(& &1.hash)
109122

110123
Import.insert_changes_list(
111124
repo,
@@ -119,15 +132,21 @@ defmodule Explorer.Chain.Import.Runner.Transactions do
119132
)
120133
end
121134

122-
defp new_pending_transaction_operations(repo, inserted_transactions, %{timeout: timeout, timestamps: timestamps}) do
135+
defp new_pending_operations(repo, inserted_transactions, %{timeout: timeout, timestamps: timestamps}) do
136+
traceable_consensus_transactions =
137+
inserted_transactions
138+
|> RangesHelper.filter_by_height_range(&RangesHelper.traceable_block_number?(&1.block_number))
139+
|> Transaction.filter_non_traceable_transactions()
140+
141+
traceable_consensus_block_numbers = Enum.map(traceable_consensus_transactions, & &1.block_number) |> Enum.uniq()
142+
block_numbers_with_priorities = MissingBlockRange.find_priority_by_numbers(traceable_consensus_block_numbers)
143+
123144
case PendingOperationsHelper.pending_operations_type() do
124145
"transactions" ->
125146
sorted_pending_ops =
126-
inserted_transactions
127-
|> RangesHelper.filter_by_height_range(&RangesHelper.traceable_block_number?(&1.block_number))
128-
|> Transaction.filter_non_traceable_transactions()
147+
traceable_consensus_transactions
129148
|> Enum.reject(&is_nil(&1.block_number))
130-
|> Enum.map(&%{transaction_hash: &1.hash})
149+
|> Enum.map(&%{transaction_hash: &1.hash, priority: Map.get(block_numbers_with_priorities, &1.block_number)})
131150
|> Enum.sort()
132151

133152
Import.insert_changes_list(
@@ -141,8 +160,29 @@ defmodule Explorer.Chain.Import.Runner.Transactions do
141160
timestamps: timestamps
142161
)
143162

144-
_other_type ->
145-
{:ok, []}
163+
"blocks" ->
164+
sorted_pending_ops =
165+
traceable_consensus_transactions
166+
|> Enum.reject(&is_nil(&1.block_number))
167+
|> Enum.map(
168+
&%{
169+
block_hash: &1.block_hash,
170+
block_number: &1.block_number,
171+
priority: Map.get(block_numbers_with_priorities, &1.block_number)
172+
}
173+
)
174+
|> Enum.sort()
175+
176+
Import.insert_changes_list(
177+
repo,
178+
sorted_pending_ops,
179+
conflict_target: :block_hash,
180+
on_conflict: :nothing,
181+
for: PendingBlockOperation,
182+
returning: true,
183+
timeout: timeout,
184+
timestamps: timestamps
185+
)
146186
end
147187
end
148188

apps/explorer/lib/explorer/chain/pending_block_operation.ex

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ defmodule Explorer.Chain.PendingBlockOperation do
2828
type: Hash.Full,
2929
null: false
3030
)
31+
32+
field(:priority, :integer)
3133
end
3234

3335
def changeset(%__MODULE__{} = pending_ops, attrs) do
@@ -80,7 +82,7 @@ defmodule Explorer.Chain.PendingBlockOperation do
8082
limited? :: boolean()
8183
) :: {:ok, accumulator}
8284
when accumulator: term()
83-
def stream_blocks_with_unfetched_internal_transactions(initial, reducer, limited? \\ false)
85+
def stream_blocks_with_unfetched_internal_transactions(initial, reducer, limited? \\ false, with_priority? \\ false)
8486
when is_function(reducer, 2) do
8587
direction = Application.get_env(:indexer, :internal_transactions_fetch_order)
8688

@@ -93,7 +95,16 @@ defmodule Explorer.Chain.PendingBlockOperation do
9395
)
9496

9597
query
98+
|> maybe_add_priority_filter(with_priority?)
9699
|> add_fetcher_limit(limited?)
97100
|> Repo.stream_reduce(initial, reducer)
98101
end
102+
103+
defp maybe_add_priority_filter(query, false), do: query
104+
105+
defp maybe_add_priority_filter(query, true) do
106+
from(pbo in query,
107+
where: not is_nil(pbo.priority)
108+
)
109+
end
99110
end

apps/explorer/lib/explorer/chain/pending_operations_helper.ex

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule Explorer.Chain.PendingOperationsHelper do
33

44
import Ecto.Query
55

6-
alias Explorer.Chain.{Hash, PendingBlockOperation, PendingTransactionOperation, Transaction}
6+
alias Explorer.Chain.{Block, Hash, PendingBlockOperation, PendingTransactionOperation, Transaction}
77
alias Explorer.{Helper, Repo}
88

99
defp transactions_batch_size,
@@ -81,7 +81,7 @@ defmodule Explorer.Chain.PendingOperationsHelper do
8181
from(
8282
pto in PendingTransactionOperation,
8383
join: t in assoc(pto, :transaction),
84-
select: %{block_hash: t.block_hash, block_number: t.block_number},
84+
select: %{block_hash: t.block_hash, block_number: t.block_number, priority: pto.priority},
8585
limit: ^batch_size
8686
)
8787

@@ -246,4 +246,82 @@ defmodule Explorer.Chain.PendingOperationsHelper do
246246
|> block_range_in_query(max_block_number)
247247
|> Repo.exists?()
248248
end
249+
250+
@doc """
251+
Inserts pending operations for the given block numbers.
252+
"""
253+
@spec insert_pending_operations([integer()], integer() | nil) :: {[integer()], [Explorer.Chain.Transaction.t()]}
254+
def insert_pending_operations(block_numbers, priority \\ nil) do
255+
case pending_operations_type() do
256+
"transactions" ->
257+
default_on_conflict = default_pto_on_conflict()
258+
transactions = Transaction.get_transactions_of_block_numbers(block_numbers)
259+
260+
pto_params =
261+
transactions
262+
|> Transaction.filter_non_traceable_transactions()
263+
|> Enum.map(&%{transaction_hash: &1.hash, priority: priority})
264+
|> Helper.add_timestamps()
265+
266+
Repo.insert_all(PendingTransactionOperation, pto_params,
267+
on_conflict: default_on_conflict,
268+
conflict_target: [:transaction_hash]
269+
)
270+
271+
{[], transactions}
272+
273+
"blocks" ->
274+
default_on_conflict = default_pbo_on_conflict()
275+
276+
pbo_params =
277+
Block
278+
|> where([b], b.number in ^block_numbers)
279+
|> where([b], b.consensus == true)
280+
|> select([b], %{block_hash: b.hash, block_number: b.number})
281+
|> Repo.all()
282+
|> add_priority(priority)
283+
|> Helper.add_timestamps()
284+
285+
{_total, inserted} =
286+
Repo.insert_all(PendingBlockOperation, pbo_params,
287+
on_conflict: default_on_conflict,
288+
conflict_target: [:block_hash],
289+
returning: [:block_number]
290+
)
291+
292+
{Enum.map(inserted, & &1.block_number), []}
293+
end
294+
end
295+
296+
defp default_pbo_on_conflict do
297+
from(
298+
pending_block_operation in PendingBlockOperation,
299+
update: [
300+
set: [
301+
priority: fragment("EXCLUDED.priority"),
302+
inserted_at: fragment("LEAST(?, EXCLUDED.inserted_at)", pending_block_operation.inserted_at),
303+
updated_at: fragment("GREATEST(?, EXCLUDED.updated_at)", pending_block_operation.updated_at)
304+
]
305+
],
306+
where: is_nil(pending_block_operation.priority) and fragment("EXCLUDED.priority IS NOT NULL")
307+
)
308+
end
309+
310+
defp default_pto_on_conflict do
311+
from(
312+
pending_transaction_operation in PendingTransactionOperation,
313+
update: [
314+
set: [
315+
priority: fragment("EXCLUDED.priority"),
316+
inserted_at: fragment("LEAST(?, EXCLUDED.inserted_at)", pending_transaction_operation.inserted_at),
317+
updated_at: fragment("GREATEST(?, EXCLUDED.updated_at)", pending_transaction_operation.updated_at)
318+
]
319+
],
320+
where: is_nil(pending_transaction_operation.priority) and fragment("EXCLUDED.priority IS NOT NULL")
321+
)
322+
end
323+
324+
defp add_priority(params, priority) do
325+
Enum.map(params, &Map.merge(&1, %{priority: priority}))
326+
end
249327
end

apps/explorer/lib/explorer/chain/pending_transaction_operation.ex

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ defmodule Explorer.Chain.PendingTransactionOperation do
2626
type: Hash.Full,
2727
null: false
2828
)
29+
30+
field(:priority, :integer)
2931
end
3032

3133
def changeset(%__MODULE__{} = pending_ops, attrs) do
@@ -69,10 +71,17 @@ defmodule Explorer.Chain.PendingTransactionOperation do
6971
"""
7072
@spec stream_transactions_with_unfetched_internal_transactions(
7173
initial :: accumulator,
72-
reducer :: (entry :: term(), accumulator -> accumulator)
74+
reducer :: (entry :: term(), accumulator -> accumulator),
75+
limited? :: boolean(),
76+
with_priority? :: boolean()
7377
) :: {:ok, accumulator}
7478
when accumulator: term()
75-
def stream_transactions_with_unfetched_internal_transactions(initial, reducer, limited? \\ false)
79+
def stream_transactions_with_unfetched_internal_transactions(
80+
initial,
81+
reducer,
82+
limited? \\ false,
83+
with_priority? \\ false
84+
)
7685
when is_function(reducer, 2) do
7786
direction = Application.get_env(:indexer, :internal_transactions_fetch_order)
7887

@@ -85,7 +94,16 @@ defmodule Explorer.Chain.PendingTransactionOperation do
8594
)
8695

8796
query
97+
|> maybe_add_priority_filter(with_priority?)
8898
|> add_fetcher_limit(limited?)
8999
|> Repo.stream_reduce(initial, reducer)
90100
end
101+
102+
defp maybe_add_priority_filter(query, false), do: query
103+
104+
defp maybe_add_priority_filter(query, true) do
105+
from(pto in query,
106+
where: not is_nil(pto.priority)
107+
)
108+
end
91109
end

0 commit comments

Comments
 (0)