ElectrumX 安裝運行

ElectrumX 可以在任何版本的 unix上運行。在 MacOS 和 DragonFlyBSD 上也能成功運行。如果想在 Windows 上運行,需要改動一些代碼。

一.必要條件

Python3: ElectrumX使用asyncio。 需要Python版本> = 3.7。
aiohttp: 異步HTTP的Python庫。需要版本 > = 2.0。
pylru: Python LRU緩存程序包。
數據庫:需要數據庫引擎軟件包; 支持兩個 leveldb 和 rocksdb

有些數字貨幣通常需要額外的包裝,用於實現其區塊哈希功能。 例如,DASH需要x11_hash。

您必須使用以下命令運行比特幣守護程序:

txindex=1

在其配置文件中設置。 如果您已經安裝了bitcoind,並且之前未進行過設置,則需要使用以下方法重新索引區塊鏈

bitcoind -reindex

這可能需要一些時間。

雖然不需要運行ElectrumX,但它可以與主管軟件一起運行,例如Daniel Bernstein的daemontools,Gerrit Pape的runit軟件包或systemd。這些使管理安全的Unix服務器變得非常容易,強烈建議您安裝其中一臺並熟悉它們。下面的說明和示例運行腳本均假定使用daemontools。對於曾經使用過runit的人來說,適應它應該是微不足道的。

從創世塊構建數據庫時,ElectrumX必須將大量數據刷新到磁盤及其DB。如果數據庫目錄位於SSD上而不是HDD上,則將有更好的體驗。目前,leveldb數據庫和其他ElectrumX文件元數據的最終大小達到了比特幣區塊鏈的611,600高度,剛好超過46.9GB(43.7 GiB)。 LevelDB在短期內需要更多,並且塊鏈只會越來越長,因此我建議在開始之前至少有70-80GB的可用空間。

二. 數據庫引擎

可以從LevelDB和RocksDB中選擇將事務信息存儲在磁盤上。 時間和數據庫大小沒有顯着差異。 目前在試圖支持LMDB,但其歷史寫入性能要差得多。

需要安裝下面的其中一個數據庫引擎:

 LevelDB的Plyvel 
 適用於RocksDB的python-rocksdb(pip3安裝python-rocksdb)
 pyrocksdb,用於未維護的版本,該版本與RocksDB的最新版本不兼容

三. 安裝並且運行

安裝完成上面的依賴,從 gitbub 中拉取源碼

git clone https://github.com/kyuupichan/electrumx.git
cd electrumx

可以使用:file:setup.py進行安裝,或從源代碼樹或其副本中運行代碼。

應該創建一個標準用戶帳戶來運行服務器。除非偏執狂,否則一個用戶就足夠了。偏執狂可能還想爲daemontools 日誌記錄過程創建另一個用戶帳戶。示例腳本和這些說明假定所有內容都在一個我稱爲lectrumrum 的帳戶下。

接下來,創建一個目錄,數據庫將存儲在該目錄中,並使其可由電子選舉帳戶寫入。我建議將此目錄保存在SSD上:

mkdir /path/to/db_directory
chown electrumx /path/to/db_directory

1.進程限制

必須確保ElectrumX進程具有較大的打開文件限制。在同步期間,打開的文件不應超過1024。服務將爲LevelDB使用大約 256 加上傳入連接的數量。提供 1000 到 2000個連接並不罕見,因此我建議您將打開文件的限制設置爲至少 2500 個。

請注意,在外殼程序中設置限制不會影響ElectrumX,除非您直接從外殼程序調用ElectrumX。如果您使用的是systemd命令,則需要在.file文件中進行設置(請參閱contrib / systemd / electrumx.service)。

2.使用daemontools

接下來創建一個 daemontools 服務目錄;這裏僅包含符號鏈接(詳細的情況請參閱daemontools文檔)。 svscan 程序將通過啓動服務器的 supervise服務和其日誌記錄過程的另一個進程來確保目錄中的服務器正在運行。您可以運行命令,如果命令涉及唯一者(服務器和記錄器),則在你創建的用戶下使用 svscan,否則需要以root用戶身份運行,以便用戶可以切換到你創建的賬戶。

假設此目錄名爲:file:service,則可以執行以下操作中的一個:

mkdir /service       # 使用 root 運行 vscan
mkdir ~/service      # 如果以該a/c身份運行svscan,則作爲elecrumx

接下來,創建一個目錄,以保存將由svscan生成的:command:supervise進程運行的腳本-svscan進程必須可讀該目錄。 假設此目錄稱爲:scripts,您可以這樣做:

mkdir -p ~/scripts/electrumx

然後從那裏的ElectrumX源代碼樹中複製所有示例腳本:

cp -R /path/to/repo/electrumx/contrib/daemontools ~/scripts/electrumx

上面複製將複製 3 個東西:服務器運行腳本,帶有logger 的 log目錄和運行腳本的 env 目錄。

您需要在環境文件:env/下配置環境變量。 ElectrumX服務器當前不接受任何命令行參數。它的所有配置均取自根據env/目錄建立的環境(請參見envdir手冊頁)。最後,您需要更改: log:/log /run腳本,以使用要通過 multilog 寫入日誌的目錄。若該目錄不必存在, multilog 將創建該目錄,但是其父目錄必須存在。

現在開始svscan命令。由於服務目錄仍然爲空,所以這不會做太多事情:

svscan ~/service & disown

svscan現在正在等待將服務添加到目錄中:

cd ~/service
ln -s ~/scripts/electrumx electrumx

創建符號鏈接並立即啓動服務器進程。 您可以通過以下方式查看其日誌:

tail -F /path/to/log/dir/current | tai64nlocal

3.使用systemd

該存儲庫包含一個樣本systemd單位文件,您可以使用該文件來使用systemd設置ElectrumX。 只需將其複製到/ etc/ systemd/system中:

cp contrib/systemd/electrumx.service /etc/systemd/system/

樣本單位文件假定存儲庫位於/ home / electrumx / electrumx。如果您的系統不同,則需要相應地更改單位文件。

您需要在/etc/electrumx.conf文件中設置一些環境變量。

現在,您可以使用systemctl命令啓動ElectrumX:

systemctl start electrumx

您可以使用:journalctl命令來檢查日誌輸出:

journalctl -u electrumx -f

配置完成後,您可能需要在啓動時啓動ElectrumX:

systemctl enable electrumx

警告:systemd在強制關閉進程方面非常積極。根據您的硬件,在初始同步期間,ElectrumX可能需要幾分鐘才能將緩存的數據刷新到磁盤。您應該在.file:.service`文件中將TimeoutStopSec設置爲至少10分鐘。

3.在Raspberry Pi 3上安裝

要在Raspberry Pi 3上安裝,您需要更新到Stretch發行版。請參閱contrib / raspberrypi3 / install_electrumx.sh中的完整過程。

另請參閱contrib/raspberrypi3/run_electrumx.sh,以獲取配置和啓動lectrumrum的簡便方法。

四.同步進程

當然,索引區塊鏈所需的時間取決於您的硬件。由於Python通常是單線程的,因此只有1個內核處於繁忙狀態。 ElectrumX使用Python的:mod:asyncio異步預填充未來塊的緩存,以使CPU忙於處理鏈而不會暫停。

因此,如果守護程序位於同一主機上,則性能可能只會得到很小的提升。將守護程序放在單獨的計算機上甚至可能是有益的,因此執行索引的計算機僅將其緩存和磁盤I / O調整爲該任務。

CACHE_MB環境變量控制ElectrumX使用的總緩存大小。請參閱:ref:此處<CACHE>進行警告。

這是我在2017年初的代碼庫(當前的代碼庫速度更快),給定的高度和粗糙的時間的經驗。從36.3萬到37.8萬高空的時期最爲緩慢:

  Machine A     Machine B
181,000          25m 00s      5m 30s
283,500                       1h 00m
321,800                       1h 40m
357,000          12h 32m      2h 41m
386,000          21h 56m      4h 25m
414,200       1d 12h 29m      6h 30m
447,168       2d 13h 20m      9h 47m

機器A:低規格2011年1.6GHz AMD E-350雙核無風扇CPU,8GB RAM和SSD上的DragonFlyBSD UFS文件系統。它從機器B上的一個比特幣通過LAN請求塊。DB_CACHE默認爲1,200。 LevelDB。

機器B:2012年末推出的iMac,運行Sierra 10.12.2、2.9GHz四核Intel i5 CPU,HDD和24GB RAM。在同一臺機器上運行bitcoind。 DB_CACHE設置爲1,800。 LevelDB。

對於除比特幣-主網以外的其他鏈,同步應該要快得多。

注意:ElectrumX在完全同步並趕上守護程序之前,將無法提供正常的客戶端連接。但是,LocalRPC連接始終處於服務狀態。

五.終止ElectrumX

終止服務器進程的首選方法是向其發送stop RPC命令:

electrumx_rpc stop

或者在Unix上,也可以使用INT或TERM信號。對於daemontools監督的進程,可以通過將其關閉來完成,如下所示:

svc -d ~/service/electrumx

ElectrumX將記錄日誌中的信號接收,並確保在終止之前將塊鏈索引刷新到磁盤。您應該耐心等待,因爲將數據刷新到磁盤可能需要花費幾分鐘。

ElectrumX使用啓用了fsync的數據庫的事務功能。我這樣做的目的是,在一定程度上保證了DB軟件,操作系統和硬件的原子性保證,即使ElectrumX進程被強行殺死或斷電,數據庫也不應受到損壞 。最壞的情況應該是必須從最新的UTXO刷新重新開始索引。

該過程終止後,您可以使用以下方法重新啓動它:

svc -u ~/service/electrumx

您可以通過以下方式查看正在運行的服務的狀態:

svstat ~/service/electrumx

svscan當然可以從同一服務目錄中同時處理多個服務,例如testnet或altcoin服務器。有關更多信息,請參見這些各種命令的手冊頁。

六.理解日誌

您可以這樣查看日誌:

tail -F /path/to/log/dir/current | tai64nlocal

這是啓動時的典型日誌輸出:

INFO:BlockProcessor:switching current directory to /crucial/server-good
INFO:BlockProcessor:using leveldb for DB backend
INFO:BlockProcessor:created new database
INFO:BlockProcessor:creating metadata diretcory
INFO:BlockProcessor:software version: ElectrumX 0.10.2
INFO:BlockProcessor:DB version: 5
INFO:BlockProcessor:coin: Bitcoin
INFO:BlockProcessor:network: mainnet
INFO:BlockProcessor:height: -1
INFO:BlockProcessor:tip: 0000000000000000000000000000000000000000000000000000000000000000
INFO:BlockProcessor:tx count: 0
INFO:BlockProcessor:sync time so far: 0d 00h 00m 00s
INFO:BlockProcessor:reorg limit is 200 blocks
INFO:Daemon:daemon at 192.168.0.2:8332/
INFO:BlockProcessor:flushing DB cache at 1,200 MB
INFO:Controller:RPC server listening on localhost:8000
INFO:Prefetcher:catching up to daemon height 447,187...
INFO:Prefetcher:verified genesis block with hash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
INFO:BlockProcessor:our height: 9 daemon: 447,187 UTXOs 0MB hist 0MB
INFO:BlockProcessor:our height: 52,509 daemon: 447,187 UTXOs 9MB hist 14MB
INFO:BlockProcessor:our height: 85,009 daemon: 447,187 UTXOs 12MB hist 31MB
INFO:BlockProcessor:our height: 102,384 daemon: 447,187 UTXOs 15MB hist 47MB
[...]
INFO:BlockProcessor:our height: 133,375 daemon: 447,187 UTXOs 80MB hist 222MB
INFO:BlockProcessor:our height: 134,692 daemon: 447,187 UTXOs 96MB hist 250MB
INFO:BlockProcessor:flushed to FS in 0.7s
INFO:BlockProcessor:flushed history in 16.3s for 1,124,512 addrs
INFO:BlockProcessor:flush #1 took 18.7s.  Height 134,692 txs: 941,963
INFO:BlockProcessor:tx/sec since genesis: 2,399, since last flush: 2,400
INFO:BlockProcessor:sync time: 0d 00h 06m 32s  ETA: 1d 13h 03m 42s

在正常操作下,這些緩存狀態每分鐘重複一次或兩次。 UTXO刷新可能需要幾分鐘,如下所示:

INFO:BlockProcessor:our height: 378,745 daemon: 447,332 UTXOs 1,013MB hist 184MB
INFO:BlockProcessor:our height: 378,787 daemon: 447,332 UTXOs 1,014MB hist 194MB
INFO:BlockProcessor:flushed to FS in 0.3s
INFO:BlockProcessor:flushed history in 13.4s for 934,933 addrs
INFO:BlockProcessor:flushed 6,403 blocks with 5,879,440 txs, 2,920,524 UTXO adds, 3,646,572 spends in 93.1s, committing...
INFO:BlockProcessor:flush #120 took 226.4s.  Height 378,787 txs: 87,695,588
INFO:BlockProcessor:tx/sec since genesis: 1,280, since last flush: 359
INFO:BlockProcessor:sync t ime: 0d 19h 01m 06s  ETA: 3d 21h 17m 52s
INFO:BlockProcessor:our height: 378,812 daemon: 447,334 UTXOs 10MB hist 10MB

所示的ETA只是一個粗略的指導,短期內可能會非常不穩定。 一開始它似乎有點樂觀。 一旦達到280,000的高度,就應該是相當準確的。

七.創建自簽名SSL證書

這些說明基於電子服務器文檔中的說明。

要運行SSL服務器,您需要使用openssl生成自簽名證書。另外,您不能在環境中設置SSL_PORT,也不能通過SSL進行投放,但是不建議這樣做。

使用下面的示例代碼創建建議有效期爲5年的自簽名證書。您可以爲簽名請求提供任何信息以標識您的服務器。除有效日期外,客戶端當前未檢查它們。當要求輸入挑戰密碼時,請將其保留爲空,然後按Enter:

$ openssl genrsa -out server.key 2048
$ openssl req -new -key server.key -out server.csr
...
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:California
Common Name (eg, YOUR name) []: electrum-server.tld
...
A challenge password []:
...
$ openssl x509 -req -days 1825 -in server.csr -signkey server.key -out server.crt

server.crt文件在服務器進程的環境中放入SSL_CERTFILE的envvar和SSL_KEYFILE中的server.key的文件中。

從Electrum 1.9開始,客戶端將在第一個請求時爲您的服務器學習並本地緩存SSL證書,以防止中間人對所有其他連接的攻擊。

如果證書在服務器端丟失或過期,則需要使用其他服務器名稱和新證書來運行服務器。因此,最好爲證書和密鑰創建脫機備份副本,以防您需要還原它們。

八.在特權端口上運行

您可以選擇在不同於50001/50002的端口上運行elenetrumx。如果選擇特權端口(<1024),則可以使用iptables NAT規則。

將端口110轉發到內部端口50002的示例如下:

iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 127.0.0.1:50002

然後,您可以按如下所示設置端口,並在特權端口上對外發布服務:

REPORT_SSL_PORT=110

有問題可以加微信資訊
在這裏插入圖片描述

轉載自:http://www.wenwoha.com/blog_detail-69.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章