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

1631 lines
47 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
#: lib/block_scout_web/views/transaction_view.ex:71
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
6 years ago
#: lib/block_scout_web/views/address_view.ex:97
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:3
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:60
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:46
msgid "Block Number"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/views/transaction_view.ex:18
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:44
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
#: lib/block_scout_web/views/address_view.ex:274
msgid "Blocks Validated"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:125
#: 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:81
#: lib/block_scout_web/templates/address/overview.html.eex:89
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
#: lib/block_scout_web/views/address_view.ex:271
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
6 years ago
#: lib/block_scout_web/views/address_view.ex:95
msgid "Contract Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:15
6 years ago
#: lib/block_scout_web/views/address_view.ex:35
#: lib/block_scout_web/views/address_view.ex:69
msgid "Contract Address Pending"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/transaction_view.ex:148
msgid "Contract Call"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/transaction_view.ex:147
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:11
msgid "Copy Transaction Hash"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/not_found.html.eex:9
#: lib/block_scout_web/templates/transaction/overview.html.eex:11
msgid "Copy Txn Hash"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:50
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.html.eex:33
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:47
msgid "Enter the Solidity Contract Code below"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_balance_card.html.eex:25
6 years ago
msgid "Error trying to fetch balances."
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/transaction_view.ex:75
msgid "Error: %{reason}"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/transaction_view.ex:73
msgid "Error: (Awaiting internal transactions for reason)"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_balance_card.html.eex:12
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
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:19
#: lib/block_scout_web/templates/transaction/_tile.html.eex:26
6 years ago
#: lib/block_scout_web/templates/transaction/overview.html.eex:104
#: 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
#: lib/block_scout_web/templates/address/_balance_card.html.eex:21
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:117
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:46
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
#: lib/block_scout_web/views/address_view.ex:270
#: lib/block_scout_web/views/transaction_view.ex:201
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:129
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
#: lib/block_scout_web/views/transaction_view.ex:202
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
6 years ago
#: lib/block_scout_web/views/address_view.ex:117
msgid "Market Cap"
msgstr ""
#, elixir-format
#: lib/block_scout_web/views/transaction_view.ex:62
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.html.eex:31
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:35
msgid "No"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:71
#: lib/block_scout_web/templates/transaction/overview.html.eex:67
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:42
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:55
#: lib/block_scout_web/views/transaction_view.ex:70
#: lib/block_scout_web/views/transaction_view.ex:104
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:80
#: 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
#: lib/block_scout_web/views/address_view.ex:272
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:123
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
#: lib/block_scout_web/templates/layout/_topnav.html.eex:83
msgid "Search by address, transaction hash, or block number"
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
#: lib/block_scout_web/views/transaction_view.ex:72
msgid "Success"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:20
6 years ago
#: lib/block_scout_web/templates/transaction/_tile.html.eex:29
#: lib/block_scout_web/templates/transaction/overview.html.eex:72
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:24
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
#: lib/block_scout_web/views/transaction_view.ex:146
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
#: lib/block_scout_web/views/transaction_view.ex:200
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
#: lib/block_scout_web/views/address_view.ex:268
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
#: lib/block_scout_web/views/transaction_view.ex:149
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:16
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
#: lib/block_scout_web/views/address_view.ex:269
msgid "Transactions"
6 years ago
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address/_tile.html.eex:19
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:40
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:122
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:104
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:122
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:70
msgid "View Less Transfers"
6 years ago
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/transaction/_tile.html.eex:69
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40
msgid "Yes"
msgstr ""
#, elixir-format
6 years ago
#: lib/block_scout_web/templates/address/overview.html.eex:56
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:120
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
#: lib/block_scout_web/templates/transaction/overview.html.eex:80
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.html.eex:32
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.html.eex:19
msgid "Method Id"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:8
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.html.eex:17
msgid "Transaction Info"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:28
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:65
msgid "Failed to decode input data."
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:53
msgid "Error rendering value"
msgstr ""
6 years ago
#, elixir-format
#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:42
#: 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
#: lib/block_scout_web/views/address_view.ex:273
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 ""
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
6 years ago
#: lib/block_scout_web/templates/layout/_footer.html.eex:94
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
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:66
msgid "1 Library Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:61
msgid "1 Library Name"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:76
msgid "2 Library Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:71
msgid "2 Library Name"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:86
msgid "3 Library Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:81
msgid "3 Library Name"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:96
msgid "4 Library Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:91
msgid "4 Library Name"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:106
msgid "5 Library Address"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:101
msgid "5 Library Name"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:58
msgid "Contract Libraries"
msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:53
6 years ago
msgid "Enter contructor arguments if the contract had any"
msgstr ""