Back

blockchain - blockscout 的安装过程

发布时间: 2022-01-19 06:44:00

完整版pdf:
https://files.sweetysoft.com/image_after_2022_12_14/4472/blockscout_安装过程.pdf

blockscout是用来监控链上信息的

https://github.com/blockscout/blockscout

配置需求参考 https://docs.blockscout.com/for-developers/information-and-settings/requirements

手动安装参考:https://docs.blockscout.com/for-developers/manual-deployment

更新apt

apt update

安装各种第三方包

sudo apt-get install libapr1-dev libxml2-dev libxslt1-dev libmysqlclient-dev git curl build-essential libssl-dev libreadline-dev build-essential libssl-dev libreadline-dev vim libcurl4 ruby-dev zlib1g-dev liblzma-dev ruby-all-dev

apt install postgresql automake libtool gcc make g++ cargo  libgmp-dev libgmp3-dev

安装erlang和elixir和nodejs

使用asdf 来安装。
具体过程在这里:  http://siwei.me/blog/posts/erlang-asdf-erlang-elixir-nodejs-ruby

# install rust

curl https://sh.rustup.rs -sSf | sh

安装node

install nvm & node

curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash

nvm install 14.18.3

安装rust

apt remove cargo # 删掉apt 自己下载的cargo

apt autoremove  # 删掉 rustc

asdf install rust 1.58.1   #安装最新版本的rust

然后看这里:https://docs.blockscout.com/for-developers/manual-deployment

$ git clone https://github.com/poanetwork/blockscout

运行下面的命令

(具体见这个说明页面,里面包含了一个csv:  https://docs.blockscout.com/for-developers/information-and-settings/env-variables)

# 下面是个完整的可用的东东( 2022-12-13)
export NETWORK=Moonbeam
export SUBNETWORK=Coreth
export LOGO=/images/blockscout_logo.svg
export LOGO_FOOTER=/images/blockscout_logo.svg

# 对于moonbeam这样的网络,只能选择这个。
export ETHEREUM_JSONRPC_VARIANT=geth
export ETHEREUM_JSONRPC_HTTP_URL=https://moonbeam.api.onfinality.io/rpc?apikey=c78dd454-f16f-4f67-8a03-67b316c4aaee
export ETHEREUM_JSONRPC_TRACE_URL=https://moonbeam.api.onfinality.io/rpc?apikey=c78dd454-f16f-4f67-8a03-67b316c4aaee
export ETHEREUM_JSONRPC_WS_URL=wss://moonbeam.api.onfinality.io/ws?apikey=c78dd454-f16f-4f67-8a03-67b316c4aaee

# 这里必须是http
export ETHEREUM_JSONRPC_TRANSPORT=http
export SECRET_KEY_BASE=VTIB3uHDNbvrY0+60ZWgUoUBKDn9ppLR8MI4CpRz4/qLyEFs54ktJfaNT6Z221No
export DATABASE_URL=postgresql://postgres:88888888@localhost:5432/blockscout

export ETHEREUM_JSONRPC_DISABLE_ARCHIVE_BALANCES=false
#export IPC_PATH=
export NETWORK_PATH=/
export API_PATH=/
export SOCKET_ROOT=/

# 这里用localhost 就好,记得前端用caddy
export BLOCKSCOUT_HOST=localhost
export BLOCKSCOUT_PROTOCOL=http
export CHECK_ORIGIN=false
export PORT=4000
export COIN=GLMR
export COIN_NAME=GLMR
export REWARDS_CONTRACT=0xeca443e8e1ab29971a45a9c57a6a9875701698a5
export TOKEN_BRIDGE_CONTRACT=0x7301CFA0e1756B71869E93d4e4Dca5c7d0eb0AA6
export EMISSION_FORMAT=DEFAULT
export POOL_SIZE=40
export POOL_SIZE_API=10
export ECTO_USE_SSL=false
export DATADOG_HOST=
export DATADOG_PORT=
export SPANDEX_BATCH_SIZE=10
export SPANDEX_SYNC_THRESHOLD=100
export HEART_BEAT_TIMEOUT=30
#export HEART_COMMAND=
#export BLOCKSCOUT_VERSION=
#export RELEASE_LINK=
#export ELIXIR_VERSION=

export BLOCK_TRANSFORMER=base
export LINK_TO_OTHER_EXPLORERS=false
export OTHER_EXPLORERS={}
export SUPPORTED_CHAINS={}
export CACHE_BLOCK_COUNT_PERIOD=7200
export CACHE_TXS_COUNT_PERIOD=7200
export CACHE_ADDRESS_COUNT_PERIOD=7200
export CACHE_ADDRESS_SUM_PERIOD=3600
export CACHE_TOTAL_GAS_USAGE_PERIOD=3600
export CACHE_ADDRESS_TRANSACTIONS_GAS_USAGE_COUNTER_PERIOD=1800
export CACHE_TOKEN_HOLDERS_COUNTER_PERIOD=3600
export CACHE_TOKEN_TRANSFERS_COUNTER_PERIOD=3600
export CACHE_ADDRESS_WITH_BALANCES_UPDATE_INTERVAL=1800
export CACHE_AVERAGE_BLOCK_PERIOD=1800
export CACHE_MARKET_HISTORY_PERIOD=21600
export CACHE_ADDRESS_TRANSACTIONS_COUNTER_PERIOD=1800
export CACHE_ADDRESS_TOKENS_USD_SUM_PERIOD=1800
export CACHE_ADDRESS_TOKEN_TRANSFERS_COUNTER_PERIOD=1800
export CACHE_BRIDGE_MARKET_CAP_UPDATE_INTERVAL=1800
export CACHE_TOKEN_EXCHANGE_RATE_PERIOD=1800
export TOKEN_METADATA_UPDATE_INTERVAL=172800
export ALLOWED_EVM_VERSIONS=homestead,tangerineWhistle,spuriousDragon,byzantium,constantinople,petersburg,istanbul,berlin,london,default
export UNCLES_IN_AVERAGE_BLOCK_TIME=false
export DISABLE_WEBAPP=false
export DISABLE_READ_API=false
export DISABLE_WRITE_API=false
export DISABLE_INDEXER=false
export DISABLE_REALTIME_INDEXER=false
export DISABLE_TOKEN_INSTANCE_FETCHER=false
export INDEXER_DISABLE_PENDING_TRANSACTIONS_FETCHER=false
export INDEXER_DISABLE_INTERNAL_TRANSACTIONS_FETCHER=false
export INDEXER_CATCHUP_BLOCKS_BATCH_SIZE=10
export INDEXER_CATCHUP_BLOCKS_CONCURRENCY=10
export INDEXER_INTERNAL_TRANSACTIONS_BATCH_SIZE=10
export INDEXER_INTERNAL_TRANSACTIONS_CONCURRENCY=4
export INDEXER_COIN_BALANCES_BATCH_SIZE=500
export INDEXER_COIN_BALANCES_CONCURRENCY=4
export INDEXER_RECEIPTS_BATCH_SIZE=250
export INDEXER_RECEIPTS_CONCURRENCY=10
export TOKEN_ID_MIGRATION_FIRST_BLOCK=0
export TOKEN_ID_MIGRATION_CONCURRENCY=1
export TOKEN_ID_MIGRATION_BATCH_SIZE=500
#export WEBAPP_URL=
#export API_URL=
export WOBSERVER_ENABLED=false
export SHOW_ADDRESS_MARKETCAP_PERCENTAGE=true
export CHECKSUM_ADDRESS_HASHES=true
export CHECKSUM_FUNCTION=eth
export DISABLE_EXCHANGE_RATES=true
export DISABLE_KNOWN_TOKENS=false
export ENABLE_TXS_STATS=true
export SHOW_PRICE_CHART=false
export SHOW_TXS_CHART=true
export HISTORY_FETCH_INTERVAL=60
export TXS_HISTORIAN_INIT_LAG=0
export TXS_STATS_DAYS_TO_COMPILE_AT_INIT=365
export COIN_BALANCE_HISTORY_DAYS=90
export APPS_MENU=false
export EXTERNAL_APPS=[]

export BRIDGE_MARKET_CAP_UPDATE_INTERVAL=1800

export SHOW_MAINTENANCE_ALERT=false
export CUSTOM_CONTRACT_ADDRESSES_TEST_TOKEN=
export ENABLE_SOURCIFY_INTEGRATION=false

export MAX_SIZE_UNLESS_HIDE_ARRAY=50
export HIDE_BLOCK_MINER=false
export DISPLAY_TOKEN_ICONS=false
export SHOW_TENDERLY_LINK=false

export MAX_STRING_LENGTH_WITHOUT_TRIMMING=2040

export API_RATE_LIMIT=50
export API_RATE_LIMIT_BY_KEY=50
export API_RATE_LIMIT_BY_IP=50

export FETCH_REWARDS_WAY=trace_block
export ENABLE_RUST_VERIFICATION_SERVICE=true
export RUST_VERIFICATION_SERVICE_URL=http://localhost:8043/
export VISUALIZE_SOL2UML_ENABLED=true
export VISUALIZE_SOL2UML_SERVICE_URL=http://localhost:8050/
# 这两个千万不要留空。
#export DATABASE_READ_ONLY_API_URL=
#export ACCOUNT_DATABASE_URL=
export ACCOUNT_POOL_SIZE=100
export ACCOUNT_ENABLED=false
export ACCOUNT_REDIS_URL=redis://localhost:6379

运行elixir命令,编译和安装代码:

git checkout -b 4.1.0 v4.1.0-beta   ( 如果4.1.0 也不行的话,就4.0.0)

asdf install erlang 24.2

asdf install rust 1.55.0  ( 这里不要用最新的1.58.0 , 会报错 keccak256 编译有问题)

mix do deps.get, local.rebar --force, deps.compile, compile

# mix do deps.get, local.rebar --force, deps.compile, compile
Could not find Hex, which is needed to build dependency :tesla
Shall I install Hex? (if running non-interactively, use "mix local.hex --force") [Yn] 
* creating /root/.asdf/installs/elixir/1.12.3-otp-24/.mix/archives/hex-1.0.1
Resolving Hex dependencies...
Dependency resolution completed:
Unchanged:
  absinthe 1.6.5
  absinthe_phoenix 2.0.2
  absinthe_relay 1.5.1
  accept 0.3.5
  bcrypt_elixir 1.1.1

................... 经过漫长的等待(10分钟?)
==> phoenix_ecto
Compiling 7 files (.ex)
Generated phoenix_ecto app
==> block_scout_web
Compiling 201 files (.ex)
Generating BlockScoutWeb.Cldr for 2 locales named ["en", "root"] with a default locale named "en"

09:24:47.199 [debug] Current global API rate limit 50 reqs/sec

09:24:47.206 [debug] Current API rate limit by key 50 reqs/sec

09:24:47.206 [debug] Current API rate limit by IP 50 reqs/sec
Generated block_scout_web app# mix do deps.get, local.rebar --force, deps.compile, compile
Could not find Hex, which is needed to build dependency :tesla
Shall I install Hex? (if running non-interactively, use "mix local.hex --force") [Yn]
* creating /root/.asdf/installs/elixir/1.12.3-otp-24/.mix/archives/hex-1.0.1
Resolving Hex dependencies...
Dependency resolution completed:
Unchanged:
absinthe 1.6.5
absinthe_phoenix 2.0.2
absinthe_relay 1.5.1
accept 0.3.5
bcrypt_elixir 1.1.1

保证postgrest运行中(说了一句废话,我从官方文档照搬过来的)

创建和运行数据库迁移:mix do ecto.create, ecto.migrate

....
10:08:18.105 [info]  == Migrated 20211206071033 in 0.0s

10:08:18.107 [info]  == Running 20220111085751 Explorer.Repo.Migrations.AddressAddCounters.change/0 forward

10:08:18.107 [info]  alter table addresses

10:08:18.107 [info]  == Migrated 20220111085751 in 0.0s

开始安装nodejs的各种依赖:

cd <your block scout folder>

cd apps/block_scout_web/assets; npm install && node_modules/webpack/bin/webpack.js --mode production; cd -

webpack 5.61.0 compiled with 3 warnings in 606558 ms

asset dropzone.min.js 112 KiB [emitted] [minimized] (name: dropzone)
runtime modules 663 bytes 3 modules
cacheable modules 333 KiB
  ./js/lib/dropzone.js 18 bytes [built] [code generated]
  ./node_modules/dropzone/dist/dropzone.js 333 KiB [built] [code generated]
webpack 5.61.0 compiled successfully in 8906 ms

这里会等好长时间。大概20分钟以上

然后继续:

cd apps/explorer && npm install; cd -

生成静态文件:

mix phx.digest  

这里会报错,说几个路径找不到。我继续了。

(如果报警提示 secp256k 的内容,就这样)

mix deps.get
cd /opt/blockscout/deps/libsecp256k1/c_src; ./build_deps.sh; cd -
cd /opt/blockscout; mix do deps.get, local.rebar --force, deps.compile, compile

生成签名。 phenix 不用https不能访问,据说。

cd apps/block_scout_web; mix phx.gen.cert blockscout blockscout.local; cd -

修改 /etc/hosts  ,  把 blockscout blockscout.local 加进来

127.0.0.1 localhost blockscout blockscout.local 

修改浏览 器:(参考:https://stackoverflow.com/questions/50819206/is-there-a-equivalent-of-allow-insecure-localhost-flag-of-google-chrome-in-firef )

chrome:  Enable chrome://flags/#allow-insecure-localhost

firefox:  about:config ->  network.websocket.allowInsecureFromHTTPS  选择true

终于配置好了。

启动:

mix phx.server

也可以使用快速启动脚本

restart_very_quickly, 内容如下:

source env_source
iex -S mix phx.server

遇到了各种坑

坑0. 官方文档的 system ENV ,列表,有问题

不能只设置文档中要求的15+个变量

需要把所有用到的变量都设置上去

否则会报错

坑1. DATADOG_PORT 的设置,这里有问题。

无论是用不用双引号,都会报错,

报错原因:can not convert string into integer 类似的话。。

解决办法:找到报错的app:   apps/explorer/lib/explorer/application.ex

直接把value写死。(或者在System.get_env 之后,把对应的结果手动转换成 int. )

坑3: left value not match ...

这里会出现很多次。需要慢慢调试。

1. 找到报错的 ex文件(这个提示中没有,很不友好,需要根据上一条报错的app来找到。)

例如:

** (Mix) Could not start application explorer: Explorer.Application.start(:normal, []) returned an error: shutdown: failed to start child: Explorer.Chain.Events.Listener
    ** (EXIT) an exception was raised:
        ** (KeyError) key :password not found in: [types: nil, types: Postgrex.DefaultTypes, username: "root", sync_connect: true, hostname: "localhost", database: "blockscout", migration_timestamps: [type: :utc_datetime_usec], url: "postgresql://myroot:123456@localhost:5432/blockscout", pool_size: 20, timeout: 80000]
            (elixir 1.12.3) lib/keyword.ex:420: Keyword.fetch!/2
            (postgrex 0.15.10) lib/postgrex/protocol.ex:778: Postgrex.Protocol.auth_md5/4

光看报错信息是不知道是哪个文件的,所以,需要根据class的名称: Explorer.Application, 找到对应的ex文件:

2022-01-25T09:59:36.118 [info] Application explorer exited: Explorer.Application.start(:normal, []) returned an error: shutdown: failed to start child: Explorer.Chain.Events.Listener
    ** (EXIT) an exception was raised:
        ** (KeyError) key :password not found in: [types: nil, types: Postgrex.DefaultTypes, username: "root", sync_connect: true, hostname: "localhost", database: "blockscout", migration_timestamps: [type: :utc_datetime_usec], url: "postgresql://myroot:123456@localhost:5432/blockscout", pool_size: 20, timeout: 80000]

所以找到对应的  apps/explorer/lib/explorer/chain/events/listener.ex

进行修改即可:

    {:ok, pid} =
       explorer_repo
       |> Notifications.start_link()
修改成:

    temp =  explorer_repo
       |> Notifications.start_link()
    IO.puts "=== temp is: #{ inspect temp}"
    {:ok, pid} = temp

这样的话,报错信息就会可读可理解了,变成下图所示:

** (KeyError) key :password not found in: [types: nil, types: Postgrex.DefaultTypes, username: "root", sync_connect: true, hostname: "localhost", database: "blockscout", migration_timestamps: [type: :utc_datetime_usec], url: "postgresql://myroot:123456@localhost:5432/blockscout", pool_size: 20, timeout: 80000]

我们就知道,原来缺少了password ,就可以针对性的做代码的调整了 (下面截图是把password写死)

Back