Blockchain explorer for Ethereum based network and a tool for inspecting and analyzing EVM based blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
blockscout/apps/block_scout_web/priv/gettext/default.pot

1704 lines
49 KiB

#, elixir-format
6 years ago
#: lib/block_scout_web/views/address_token_balance_view.ex:7
msgid "%{count} token"
msgid_plural "%{count} tokens"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/block_scout_web/templates/block/_tile.html.eex:28
msgid "%{count} transaction"
msgid_plural "%{count} transactions"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/block_scout_web/templates/address/_metatags.html.eex:3
msgid "%{address} - %{subnetwork} Explorer"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:8
msgid "%{block_type} Details"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:15
msgid "%{block_type} Height:"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/index.html.eex:10
msgid "%{block_type}s"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:21
6 years ago
#: lib/block_scout_web/templates/chain/_block.html.eex:10
msgid "%{count} Transactions"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/_metatags.html.eex:2
msgid "%{subnetwork} %{network} Explorer"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_default_title.html.eex:2
msgid "%{subnetwork} Explorer - BlockScout"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:128
msgid "(Awaiting internal transactions for status)"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:40
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:55
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:83
msgid "(query)"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/app.html.eex:31
msgid "- We're indexing this chain right now. Some of the counts may be inaccurate."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:58
msgid "A string with the name of the action to be invoked."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:43
msgid "A string with the name of the module to be invoked."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_metatags.html.eex:4
msgid "API endpoints for the %{subnetwork}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_metatags.html.eex:2
msgid "API for the %{subnetwork} - BlockScout"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/_topnav.html.eex:56
msgid "Accounts"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:50
msgid "Action"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:16
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:15
#: lib/block_scout_web/views/address_view.ex:100
msgid "Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/index.html.eex:4
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:39
msgid "Addresses"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:28
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:24
#: lib/block_scout_web/views/address_internal_transaction_view.ex:8
#: lib/block_scout_web/views/address_transaction_view.ex:8
msgid "All"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:41
msgid "Average block time"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_balance_card.html.eex:4
msgid "Balance"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/index.html.eex:6
msgid "Base URL:"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/block/_link.html.eex:2
6 years ago
#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:22
#: lib/block_scout_web/templates/tokens/transfer/_token_transfer.html.eex:44
msgid "Block #%{number}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/_metatags.html.eex:3
msgid "Block %{block_number} - %{subnetwork} Explorer"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:61
msgid "Block Confirmations"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:13
msgid "Block Height: %{height}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/app.html.eex:46
msgid "Block Mined, awaiting import..."
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:47
msgid "Block Number"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:20
msgid "Block Pending"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/_metatags.html.eex:4
msgid "BlockScout provides analytics data, API, and Smart Contract tools for the %{subnetwork}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:72
#: lib/block_scout_web/templates/layout/_topnav.html.eex:16
#: lib/block_scout_web/templates/layout/_topnav.html.eex:20
msgid "Blocks"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/app.html.eex:45
msgid "Blocks Indexed"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:40
#: lib/block_scout_web/templates/address/_tabs.html.eex:103
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:59
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:30
#: lib/block_scout_web/templates/address_validation/index.html.eex:57
6 years ago
#: lib/block_scout_web/views/address_view.ex:293
msgid "Blocks Validated"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:130
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:24
msgid "Cancel"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:97
msgid "Clear"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:37
#: lib/block_scout_web/templates/address/overview.html.eex:103
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:111
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:91
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:99
msgid "Close"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:53
#: lib/block_scout_web/templates/address/_tabs.html.eex:113
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:39
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:119
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:141
6 years ago
#: lib/block_scout_web/views/address_view.ex:290
msgid "Code"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:25
msgid "Compiler"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:26
msgid "Compiler version"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:13
#: lib/block_scout_web/templates/block/index.html.eex:6
msgid "Connection Lost, click to load newer blocks"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:18
msgid "Connection Lost, click to load newer internal transactions"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:14
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:19
#: lib/block_scout_web/templates/transaction/index.html.eex:19
msgid "Connection Lost, click to load newer transactions"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:53
msgid "Connection Lost, click to load newer validations"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract/index.html.eex:49
msgid "Contract ABI"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:13
#: lib/block_scout_web/views/address_view.ex:98
msgid "Contract Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:16
#: lib/block_scout_web/views/address_view.ex:38
#: lib/block_scout_web/views/address_view.ex:72
msgid "Contract Address Pending"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:205
msgid "Contract Call"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:204
msgid "Contract Creation"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:19
msgid "Contract Name"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract/index.html.eex:63
msgid "Contract creation code"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract/index.html.eex:22
msgid "Contract name:"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract/index.html.eex:37
msgid "Contract source code"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/overview.html.eex:8
#: lib/block_scout_web/templates/address/overview.html.eex:8
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:8
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:8
msgid "Copy Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/not_found.html.eex:9
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:12
msgid "Copy Transaction Hash"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/not_found.html.eex:9
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:12
msgid "Copy Txn Hash"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:69
msgid "Created by"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:104
msgid "Curl"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:18
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:60
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:118
msgid "Data"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:30
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:142
msgid "Description"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:25
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:120
msgid "Details"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:56
msgid "Difficulty"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:50
msgid "ETH"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:52
msgid "Enter the Solidity Contract Code below"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_balance_card.html.eex:28
6 years ago
msgid "Error trying to fetch balances."
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:132
msgid "Error: %{reason}"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:130
msgid "Error: (Awaiting internal transactions for reason)"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_balance_card.html.eex:13
6 years ago
#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:16
6 years ago
#: lib/block_scout_web/templates/layout/app.html.eex:51
6 years ago
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:20
#: lib/block_scout_web/templates/transaction/_tile.html.eex:27
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:145
#: lib/block_scout_web/views/wei_helpers.ex:72
msgid "Ether"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:163
msgid "Example Value"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:94
msgid "Execute"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_balance_card.html.eex:24
msgid "Fetching tokens..."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:26
msgid "Forked Blocks (Reorgs)"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:45
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:41
#: lib/block_scout_web/views/address_internal_transaction_view.ex:7
#: lib/block_scout_web/views/address_transaction_view.ex:7
msgid "From"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:7
msgid "GET"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:158
msgid "Gas"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/block/_tile.html.eex:57
#: lib/block_scout_web/templates/block/overview.html.eex:104
#: lib/block_scout_web/templates/block/overview.html.eex:159
msgid "Gas Limit"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/block/_tile.html.eex:62
#: lib/block_scout_web/templates/block/overview.html.eex:96
#: lib/block_scout_web/templates/block/overview.html.eex:150
msgid "Gas Used"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:14
msgid "Github"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/block_view.ex:20
#: lib/block_scout_web/views/wei_helpers.ex:71
msgid "Gwei"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:36
msgid "Hash"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:32
6 years ago
#: lib/block_scout_web/templates/transaction/_tile.html.eex:47
msgid "IN"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/app.html.eex:47
msgid "Indexing Tokens"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:3
msgid "Input"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:4
msgid "Internal Transaction"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:21
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:90
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:58
#: lib/block_scout_web/templates/address_validation/index.html.eex:24
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:14
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:43
#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:10
6 years ago
#: lib/block_scout_web/views/address_view.ex:289
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:258
msgid "Internal Transactions"
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:18
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:23
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:67
#: lib/block_scout_web/views/tokens/overview_view.ex:38
msgid "Inventory"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/app.html.eex:48
msgid "Less than"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:170
msgid "Limit"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:21
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:48
#: lib/block_scout_web/templates/transaction_log/index.html.eex:10
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:259
msgid "Logs"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/chain/show.html.eex:28
6 years ago
#: lib/block_scout_web/templates/layout/app.html.eex:49
#: lib/block_scout_web/views/address_view.ex:120
msgid "Market Cap"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:113
msgid "Max of"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/_tile.html.eex:37
#: lib/block_scout_web/templates/block/overview.html.eex:119
6 years ago
#: lib/block_scout_web/templates/chain/_block.html.eex:14
msgid "Miner"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:176
msgid "Model"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:35
msgid "Module"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:13
msgid "More internal transactions have come in"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:96
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:14
#: lib/block_scout_web/templates/transaction/index.html.eex:14
msgid "More transactions have come in"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:44
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:59
msgid "Must be set to:"
6 years ago
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:29
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:16
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:57
msgid "Name"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:5
msgid "New Smart Contract"
6 years ago
msgstr ""
#, elixir-format
#:
#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:23
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:138
msgid "Newer"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_token/index.html.eex:25
msgid "Next"
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:40
#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:34
msgid "Next Page"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40
msgid "No"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:71
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:68
msgid "Nonce"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:30
6 years ago
#: lib/block_scout_web/templates/transaction/_tile.html.eex:43
msgid "OUT"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:55
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:76
6 years ago
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:31
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:75
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:75
6 years ago
#: lib/block_scout_web/templates/block/index.html.eex:25
#: lib/block_scout_web/templates/block_transaction/index.html.eex:50
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:39
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:37
6 years ago
#: lib/block_scout_web/templates/transaction/index.html.eex:46
#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:24
msgid "Older"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:30
msgid "Optimization enabled"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:18
msgid "Owner Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:6
msgid "POST"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:22
msgid "Parameters"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:43
msgid "Parent Hash"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/_topnav.html.eex:44
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:127
#: lib/block_scout_web/views/transaction_view.ex:161
msgid "Pending"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:5
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:9
msgid "Pending Transactions"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:82
msgid "Position %{index}"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/chain/show.html.eex:21
#: lib/block_scout_web/templates/layout/app.html.eex:50
msgid "Price"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/overview.html.eex:13
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:102
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:13
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:13
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:90
msgid "QR Code"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:22
msgid "Query"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:65
#: lib/block_scout_web/templates/address/_tabs.html.eex:122
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:33
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:75
6 years ago
#: lib/block_scout_web/views/address_view.ex:291
6 years ago
#: lib/block_scout_web/views/tokens/overview_view.ex:37
msgid "Read Contract"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:111
msgid "Request URL"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:128
msgid "Reset"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:126
msgid "Response Body"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:138
msgid "Responses"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:83
#: lib/block_scout_web/templates/layout/_topnav.html.eex:90
msgid "Search"
msgstr ""
#, elixir-format
#:
6 years ago
#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:28
msgid "Search tokens"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:117
msgid "Server Response"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/overview.html.eex:13
msgid "Show QR Code"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:7
#: lib/block_scout_web/templates/transaction/index.html.eex:7
msgid "Showing"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/index.html.eex:6
msgid "Showing 250 addresses of"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:8
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:129
msgid "Success"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:21
#: lib/block_scout_web/templates/transaction/_tile.html.eex:30
#: lib/block_scout_web/templates/transaction/overview.html.eex:73
msgid "TX Fee"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:20
msgid "Telegram"
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:27
msgid "There are no holders for this Token."
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:64
msgid "There are no internal transactions for this address."
6 years ago
msgstr ""
#, elixir-format
#:
#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:17
msgid "There are no internal transactions for this transaction."
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:132
msgid "There are no logs for this transaction."
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:22
msgid "There are no token transfers for this address."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:17
msgid "There are no token transfers for this transaction."
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_token/index.html.eex:18
msgid "There are no tokens for this address."
6 years ago
msgstr ""
6 years ago
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:27
msgid "There are no tokens."
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:60
msgid "There are no transactions for this address."
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block_transaction/index.html.eex:44
msgid "There are no transactions for this block."
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:24
msgid "There are no transfers for this Token."
6 years ago
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:25
msgid "This transaction is pending confirmation."
6 years ago
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:34
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:30
6 years ago
#: lib/block_scout_web/views/address_internal_transaction_view.ex:6
#: lib/block_scout_web/views/address_transaction_view.ex:6
msgid "To"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:6
msgid "Toggle navigation"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:22
msgid "Token Details"
6 years ago
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:19
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:13
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:60
#: lib/block_scout_web/views/tokens/overview_view.ex:36
msgid "Token Holders"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:11
msgid "Token ID"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/tokens/transfer/_token_transfer.html.eex:4
#: lib/block_scout_web/templates/transaction_token_transfer/_token_transfer.html.eex:4
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:203
msgid "Token Transfer"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5
#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:54
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:18
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:6
#: lib/block_scout_web/templates/transaction/_tabs.html.eex:36
#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:10
#: lib/block_scout_web/views/tokens/overview_view.ex:35
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:257
msgid "Token Transfers"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:13
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:85
6 years ago
#: lib/block_scout_web/templates/address_token/index.html.eex:11
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:12
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:11
#: lib/block_scout_web/templates/address_validation/index.html.eex:19
6 years ago
#: lib/block_scout_web/views/address_view.ex:287
msgid "Tokens"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_metatags.html.eex:13
msgid "Top Accounts - %{subnetwork} Explorer"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:88
msgid "Topics"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:65
msgid "Total Difficulty"
6 years ago
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:54
msgid "Total Supply"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:50
msgid "Total transactions"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:206
msgid "Transaction"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_metatags.html.eex:3
msgid "Transaction %{transaction} - %{subnetwork} Explorer"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_metatags.html.eex:11
msgid "Transaction %{transaction}, %{subnetwork} %{transaction}"
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/not_found.html.eex:14
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:17
msgid "Transaction Details"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:5
6 years ago
#: lib/block_scout_web/templates/address/_tabs.html.eex:80
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:53
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:14
#: lib/block_scout_web/templates/block_transaction/index.html.eex:13
#: lib/block_scout_web/templates/block_transaction/index.html.eex:23
#: lib/block_scout_web/templates/block_transaction/index.html.eex:26
6 years ago
#: lib/block_scout_web/templates/block_transaction/index.html.eex:35
#: lib/block_scout_web/templates/chain/show.html.eex:93
#: lib/block_scout_web/templates/layout/_topnav.html.eex:35
6 years ago
#: lib/block_scout_web/views/address_view.ex:288
msgid "Transactions"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tile.html.eex:19
msgid "Transactions sent"
msgstr ""
6 years ago
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:40
msgid "Transfers"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:23
msgid "Try it out"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:17
msgid "Twitter"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:78
#: lib/block_scout_web/templates/layout/_topnav.html.eex:23
msgid "Uncles"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:6
msgid "Unique Token"
6 years ago
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:163
msgid "Used"
6 years ago
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/_topnav.html.eex:39
msgid "Validated"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/index.html.eex:5
#: lib/block_scout_web/templates/transaction/index.html.eex:9
msgid "Validated Transactions"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tile.html.eex:23
msgid "Validations"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:145
msgid "Value"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract/index.html.eex:12
msgid "Verify & Publish"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:127
msgid "Verify & publish"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:71
msgid "View All Blocks →"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:92
msgid "View All Transactions →"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:34
msgid "View Contract"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/_tile.html.eex:71
msgid "View Less Transfers"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/_tile.html.eex:70
msgid "View More Transfers"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_metatags.html.eex:9
msgid "View the account balance, transactions, and other data for %{address} on the %{network}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/_metatags.html.eex:10
msgid "View the transactions, token transfers, and uncles for block number %{block_number}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_metatags.html.eex:10
msgid "View transaction %{transaction} on %{subnetwork}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:49
msgid "WEI"
6 years ago
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:58
msgid "Wallet addresses"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/wei_helpers.ex:70
msgid "Wei"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:45
msgid "Yes"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:75
msgid "at"
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/views/address_contract_view.ex:20
msgid "false"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:37
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:52
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:67
msgid "required"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:40
#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:55
msgid "string"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/index.html.eex:8
msgid "total addresses with a balance"
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/views/address_contract_view.ex:19
6 years ago
msgid "true"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/views/internal_transaction_view.ex:21
6 years ago
msgid "Call"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/internal_transaction_view.ex:25
6 years ago
msgid "Create"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/internal_transaction_view.ex:23
6 years ago
msgid "Delegate Call"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/block/_tile.html.eex:48
#: lib/block_scout_web/templates/chain/_block.html.eex:24
#: lib/block_scout_web/views/internal_transaction_view.ex:27
6 years ago
msgid "Reward"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/internal_transaction_view.ex:26
msgid "Self-Destruct"
6 years ago
msgstr ""
#, elixir-format
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:42
msgid "Decimals"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_read_contract/index.html.eex:17
6 years ago
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:63
#: lib/block_scout_web/templates/address_validation/index.html.eex:82
#: lib/block_scout_web/templates/chain/show.html.eex:84
#: lib/block_scout_web/templates/chain/show.html.eex:110
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/read_contract/index.html.eex:24
msgid "Loading..."
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:125
msgid "Loading...."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:64
msgid "APIs"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:68
msgid "GraphQL"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:63
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:72
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:83
6 years ago
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:38
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:69
#: lib/block_scout_web/templates/address_transaction/index.html.eex:83
6 years ago
#: lib/block_scout_web/templates/block/index.html.eex:17
#: lib/block_scout_web/templates/block/index.html.eex:32
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:36
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:46
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:36
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:47
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:32
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:44
6 years ago
#: lib/block_scout_web/templates/transaction/index.html.eex:40
#: lib/block_scout_web/templates/transaction/index.html.eex:54
6 years ago
msgid "Loading"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:73
msgid "RPC"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/api_docs/index.html.eex:7
msgid "This API is provided for developers transitioning their applications from Etherscan to BlockScout. It supports GET and POST requests."
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:99
msgid "Raw Input"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/block_transaction/404.html.eex:7
msgid "Block Details"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/block_transaction_view.ex:15
msgid "Block not found, please try again later."
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/block_transaction_view.ex:7
6 years ago
msgid "Easy Cowboy! This block does not exist yet!"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/block_transaction_view.ex:11
6 years ago
msgid "This block has not been processed yet."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction/invalid.html.eex:6
msgid "Invalid Transaction Hash"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:25
msgid "Once we have the transaction's data this page will refresh automatically"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:30
msgid "Some transactions may take a while longer to be indexed depending on the load on the network"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:26
msgid "The possible reasons for this transaction not being processed include the following:"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:21
msgid "The transaction %{bold_hash} was not processed yet"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:29
msgid "The transaction may be in the pool of a node that didn't broadcast it yet"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:31
msgid "The transaction still does not exist"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/not_found.html.eex:28
msgid "The transaction was made a few seconds ago"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/invalid.html.eex:8
msgid "is not a valid transaction hash"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/internal_transaction_view.ex:22
msgid "Call Code"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/internal_transaction_view.ex:24
msgid "Static Call"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction_log/index.html.eex:26
msgid "Decoded"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:59
6 years ago
msgid "Indexed?"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:17
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:58
6 years ago
msgid "Type"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:3
msgid "Method Id"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:31
msgid "To see decoded input data, the contract must be verified."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:1
msgid "Transaction Info"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:13
msgid "Transaction Inputs"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:11
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:34
msgid "Verify the contract "
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:11
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:34
msgid "here"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:32
msgid "Failed to decode input data."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:38
msgid "Error rendering value"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:27
6 years ago
#: lib/block_scout_web/templates/transaction_log/index.html.eex:69
msgid "Copy Value"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction_log/index.html.eex:41
msgid "Failed to decode log data."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction_log/index.html.eex:54
msgid "Log Data"
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:35
6 years ago
#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:60
6 years ago
#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:26
6 years ago
#: lib/block_scout_web/templates/address_transaction/index.html.eex:55
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:70
#: lib/block_scout_web/templates/chain/show.html.eex:76
6 years ago
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:23
Use COUNT(*) of current_token_balances to eliminate TokenHoldersCounter `TokenHolderCounter` was created 20 days before the current_token_balances table and wasn't redesigned to make use of `current_token_balances`. With `current_token_balances` in place, the problematic query over `token_balances` that necessitated `TokenHoldersCounter` can use `current_token_balances`. Using `current_token_balances` with `COUNT(*)` is when tested on eth60-test, the new query for `Explorer.Chain.count_token_holders_from_token_hash/1` still took 11 seconds. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:04:26] 1 row retrieved starting from 1 in 11 s 554 ms (execution: 11 s 463 ms, fetching: 91 ms) ``` Using `EXPLAIN`, it should this was using a full sequential scan of table, so like in the other `COUNT(*)` optimizations PRs, I added an index to enable an index scan. Running the migration to add the index took only 1 minute on eth60-test: ``` 2019-01-02T08:40:16.220 application=ecto_sql [info] == Running 20190102141900 Explorer.Repo.Migrations.IndexCurrentTokenHolders.change/0 forward 2019-01-02T08:40:16.220 application=ecto_sql [info] create index address_current_token_balances_token_contract_address_hash_index 2019-01-02T08:41:13.746 application=ecto_sql [info] == Migrated 20190102141900 in 57.5s ``` After the migration ran, Index Scan was enabled and the query took only 837ms. ``` sql> SELECT COUNT(*) FROM address_current_token_balances WHERE token_contract_address_hash = decode('f230b790e05390fc8295f4d3f60332c93bed42e2', 'hex') AND address_hash != decode('0000000000000000000000000000000000000000', 'hex') AND value > 0 [2019-01-02 08:42:44] 1 row retrieved starting from 1 in 866 ms (execution: 837 ms, fetching: 29 ms) ```
6 years ago
#: lib/block_scout_web/templates/tokens/holder/index.html.eex:22
#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:20
6 years ago
#: lib/block_scout_web/templates/transaction/index.html.eex:24
6 years ago
msgid "Something went wrong, click to reload."
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_validation/index.html.eex:66
6 years ago
msgid "There are no blocks validated by this address."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction/index.html.eex:30
msgid "There are no transactions."
msgstr ""
6 years ago
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:17
msgid "Balances"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/_coin_balances.html.eex:8
msgid "Block"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tabs.html.eex:30
#: lib/block_scout_web/templates/address/_tabs.html.eex:96
6 years ago
#: lib/block_scout_web/views/address_view.ex:292
6 years ago
msgid "Coin Balance History"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:49
msgid "Loading balances"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:24
6 years ago
#: lib/block_scout_web/templates/chain/show.html.eex:11
6 years ago
msgid "Loading chart"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:40
msgid "There is no coin history for this address."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:27
6 years ago
#: lib/block_scout_web/templates/chain/show.html.eex:14
6 years ago
msgid "There was a problem loading the chart."
6 years ago
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/pending_transaction/index.html.eex:27
msgid "There are no pending transactions."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/block/index.html.eex:21
msgid "There are no blocks."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:24
msgid "License Expires"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:10
msgid "License ID"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/overview.html.eex:19
msgid "Show Validator Info"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:30
msgid "Validator Creation Date"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:5
msgid "Validator Data"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/overview.html.eex:19
msgid "Validator Info"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:139
6 years ago
msgid "Block Rewards"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/block_view.ex:60
msgid "Emission Reward"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/block_view.ex:56
msgid "Miner Reward"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/block_view.ex:64
msgid "Uncle Reward"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:18
msgid "IMPORTANT: This information is a best guess based on similar functions from other verified contracts."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:17
msgid "Potential matches from our contract method database:"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:19
msgid "To have guaranteed accuracy, use the link above to verify the contract's source code."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:8
msgid "To see accurate decoded input data, the contract must be verified."
6 years ago
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:5
msgid "Emission Contract"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/chain/show.html.eex:102
6 years ago
msgid "Something went wrong, click to retry."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:29
msgid "Blockscout is a tool for inspecting and analyzing EVM based blockchains. Blockchain explorer for Ethereum Networks."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:44
msgid "Chat"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:43
msgid "Contribute"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/_footer.html.eex:52
msgid "Main Networks"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/_footer.html.eex:79
msgid "Other Explorers"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:42
msgid "Submit an Issue"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/layout/_footer.html.eex:66
msgid "Test Networks"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:95
msgid "Version"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/layout/_footer.html.eex:45
msgid "Support"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:51
msgid "Copy ABI"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:65
msgid "Copy Contract Creation Code"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract/index.html.eex:39
msgid "Copy Source Code"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:13
msgid "Genesis Block"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:71
msgid "1 Library Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:66
msgid "1 Library Name"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:81
msgid "2 Library Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:76
msgid "2 Library Name"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:91
msgid "3 Library Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:86
msgid "3 Library Name"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:101
msgid "4 Library Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:96
msgid "4 Library Name"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:111
msgid "5 Library Address"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:106
msgid "5 Library Name"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:63
msgid "Contract Libraries"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:52
msgid "Last Balance Update: Block #"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:48
msgid "Transactions Sent"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:90
msgid "Transaction Speed"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:121
#: lib/block_scout_web/templates/transaction/overview.html.eex:126
msgid "Hex (Default)"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:130
msgid "UTF-8"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/admin/dashboard/index.html.eex:16
msgid "For any existing contracts in the database, insert all ABI entries into the contract_methods table. Use this in case you have verified smart contracts before early March 2019 and you want other contracts with the same functions to show those ABI's as candidate matches."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/admin/dashboard/index.html.eex:21
msgid "Run"
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:39
msgid ">="
msgstr ""
6 years ago
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:43
msgid "Incoming Transactions"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/address/overview.html.eex:83
6 years ago
msgid "Error: Could not determine contract creator."
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/layout/_topnav.html.eex:83
msgid "Search by address, token symbol name, transaction hash, or block number"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:31
msgid "EVM Version"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:58
msgid "Enter constructor arguments if the contract had any"
msgstr ""