ElectrumX不使用命令行参数,而是由环境变量控制其行为。 仅要求提供少数几个,如果未指定,则其余的将具有合理的默认值。 有关资源使用情况的许多默认设置都是保守的。 我鼓励您对其进行review。
注意
设置适当的服务以能够连接到您的服务器。为了使互联网上的客户知道您提供的服务,您必须使用REPORT_SERVICES广告您的服务。
一. 必要参数
这些环境变量始终是必需的:
这些环境变量始终是必需的:
COIN
必须是lib / coins.py中Coin类之一的名称。
DB_DIRECTORY
数据库目录的路径。相对路径应相对于父流程工作目录。如果使用的话,工作目录是运行脚本的目录。
DAEMON_URL
守护程序URL的逗号分隔列表。如果提供了多个选项,则ElectrumX最初将连接到第一个,如果其中一个停止工作,则将故障转移到后续的轮询模式。
守护程序URL的通用形式为:
http://username:password@hostname:port/
前面的http//是可选的,后面的斜杠也是可选的。 :port部分也是可选的,如果省略,它将默认为COIN和NET的标准RPC端口。
注意:通过以上设置,您的服务器将运行并索引链。 要启用传入连接,您必须设置“服务”,并且其他人要注意您的服务器,请设置“ REPORT_SERVICES”。
二. 运行脚本参数
如果你需要运行脚本,下面的参数是必须的
ELECTRUMX
lectrumx_server脚本的路径。相对路径应相对于运行脚本的目录。
USERNAME
服务器将以其运行的用户名。
三. 服务
这两个环境变量是各个服务的逗号分隔列表。
服务具有以下一般形式:
protocol://host:port
协议不区分大小写。 公认的协议是:
tcp Plaintext TCP socketsssl
ssl SSL-encrypted TCP socketsws
ws Plaintext websocketswss
wss SSL-encrypted websocketsrpc
rpc Plaintext RPC
在服务列表中,可以使用不同的主机或端口多次指定协议。这对于多宿主主机或同时提供Tor和clearnet服务都可能有用。
host可以是方括号中的主机名,IPv4地址或IPv6地址。
port是1到65535(含)之间的整数。
在有记录的地方,可以省略协议,主机和端口中的一个或多个,在这种情况下,将采用默认值。
以下是有效服务的一些示例:
tcp://host.domain.tld:50001 # Hostname, lowercase protocol, port
SSL://23.45.67.78:50002 # An IPv4 address, upper-case protocol, port
rpC://localhost # Host as a string, mixed-case protocol, default port
ws://[1234:5678:5601]:8000 # Host as an IPv6 address
wss://h3ubaasdlkheryasd.onion:50001 # Host as a Tor “.onion” address
rpc://:8000 # Default host, port given
host.domain.tld:5151 # Default protocol, hostname, port
rpc:// # RPC protocol, default host and port
注意
ElectrumX在完全赶上您的比特币守护程序之前,将不提供任何传入连接。唯一的例外是本地RPC连接,服务器初始化后随时可以提供服务。
SERVICES
以逗号分隔的服务列表ElectrumX将接受其传入连接。
此环境变量确定服务器侦听的接口和端口,因此必须正确设置它才能成功建立与服务器的任何连接。如果未设置或为空,则ElectrumX将不会监听任何传入的连接。
协议可以是任何公认的协议。
主机默认为计算机的所有接口,除非协议为rpc,否则默认为localhost。
只能将rpc默认端口设置为默认值8000。
在大多数Unix系统上,低于1024的端口要求提升的特权,因此建议选择更高的端口。例如,在Debian上,可以通过安装libcap2-bin软件包来实现:
sudo apt-get update && sudo apt-get -y install libcap2-bin
sudo setcap cap_net_bind_service=+ep /path/to/electrumx_server
如果任何列出的服务具有协议
ssl 或 wss,则必须定义 SSL_CERTFILE 和 SSL_KEYFILE。
onion 地址在SERVICES中无效。
这是SERVICES环境变量的示例值:
tcp://:50001,ssl://:50002,wss://:50004,rpc://
在端口50001、50002 和50004 的所有接口上提供tcp,ssl,wss服务。 rpc在其默认主机localhost和默认端口8000上提供。
REPORT_SERVICES
以逗号分隔的服务列表ElectrumX将通告服务器网络中的服务器和其他服务器(如果启用了对等发现),以及任何成功的连接。
必须根据您的网络,防火墙和路由器设置正确设置此环境变量,以便客户端和其他服务器查看如何连接到服务器。如果未设置或为空,则不通告任何服务。
rpc协议,特殊IP地址(如果启用了对等发现,则包括私有IP地址)和localhost在REPORT_SERVICES中无效。
这是REPORT_SERVICES环境变量的示例值:
tcp://sv.usebsv.com:50001,ssl://sv.usebsv.com:50002,wss://sv.usebsv.com:50004
这将分别在sv.usebsv.com的端口50001、50002和50004上发布tcp,ssl和wss服务的广告。
注意: 证书颁发机构签名的证书无法在Tor上使用,因此,如果您的证书是自签名的,则应该只在REPORT_SERVICES中拥有Tor服务。
SSL_CERTFILE
SSL证书文件的文件系统路径。
SSL_KEYFILE
SSL密钥文件的文件系统路径。
四. 冗杂环境变量
为什么称之为冗杂的环境变量呢,因为这些变量是可选择的
LOG_FORMAT
要使用的Python日志记录格式字符串。 默认为%(levelname)s:%(name)s:%(message)s。
LOG_LEVEL
默认的Python日志记录级别,不区分大小写的字符串。 有用的值包括调试'',
信息’’,警告''和
错误’’。
ALLOW_ROOT
将此环境变量设置为任何非空值,以允许以根用户身份运行ElectrumX。
NET
必须是lib / coins.py中Coin类之一的NET。 默认为主网。
DB_ENGINE
UTXO和历史数据库的数据库引擎。 缺省值为leveldb。 另一种选择是rocksdb。 您将需要为引擎安装适当的python软件包。 该值不区分大小写。
DONATION_ADDRESS
服务器捐赠地址报告给Electrum客户端。 默认为空,Electrum将其解释为无。
BANNER_FILE
在Electrum的“控制台”选项卡中提供给客户的横幅文件的路径。相对文件路径必须相对于DB_DIRECTORY。将为每个新客户端重新读取标题文件。
您可以在横幅文件中放置几个元变量,然后在为客户服务之前将其替换。
$ SERVER_VERSION已替换为您正在运行的ElectrumX版本,例如1.0.10。
$ SERVER_SUBVERSION被替换为ElectrumX用户代理字符串。例如,ElectrumX 1.0.10。
$ DAEMON_VERSION被守护程序的版本替换为点分隔的字符串。例如0.12.1。
$ DAEMON_SUBVERSION已替换为守护程序的用户代理字符串。例如/BitcoinUnlimited:0.12.1(EB16; AD4)/。
$ DONATION_ADDRESS将替换为DONATION_ADDRESS环境变量中的地址。
请参阅此处以获取脚本,该脚本使用有关费用,最后封锁时间和高度等的有用统计信息定期更新横幅文件。
TOR_BANNER_FILE
至于BANNER_FILE(这也是默认值),但显示给被认为是您的Tor隐藏服务的传入连接。
ANON_LOGS
设置为非空的任何内容,以用诸如xx.xx.xx.xx:xxx之类的编辑文本替换日志中的IP地址。 默认情况下,IP地址将被写入日志。
LOG_SESSIONS
将会话统计信息打印到日志之间的秒数。 除了遵循ANON_LOGS以外,输出与会话RPC命令相同。 默认值为3600。设置为零可禁止该日志记录。
REORG_LIMIT
链重组中可以处理的最大块数。 ElectrumX为levelDB中的许多块保留了一些相当紧凑的撤消信息。 默认值是COIN和NET的函数; 对于比特币主网,它是200。
EVENT_LOOP_POLICY
事件循环策略的名称,用于替换默认的异步策略(如果有)。 目前仅接受uvloop,在这种情况下,您必须已安装uvloop Python软件包。
如果您不确定这意味着什么,请使其保持不变。
DROP_CLIENT
设置正则表达式以根据客户端的版本字符串断开其连接。 例如,将版本从1.0降到1.2,请使用正则表达式1 \。[0-2] \。\ d +。
五. 资源使用限制
以下环境变量都是可选的,有助于限制服务器资源消耗并防止简单的DoS。
ElectrumX中的地址订阅非常便宜-每个地址订阅消耗约160字节的内存并得到有效处理。我认为以下两个与订阅相关的默认值较低,建议您提高它们。
MAX_SESSIONS
传入连接的最大数量。一旦达到,TCP和SSL侦听套接字将关闭,直到会话计数自然下降到限制的95%。默认为1,000。
MAX_SEND
通过导线发送的响应消息的最大大小,以字节为单位。默认为1,000,000(AuxPoW币除外,默认为10,000,000)。小于350,000的值被视为350,000,因为标准的Electrum协议标头“块”请求几乎那么大。
Electrum协议的一个缺陷在于,必须立即或完全不提供地址历史记录,这显然是滥用的途径。在改进协议以允许增量历史记录请求之前,MAX_SEND是一个权宜之计。每个历史记录条目大约为100个字节,因此默认值等于大约10,000个条目的历史记录限制,对于大多数合法用户而言,这应该足够了。如果您使用更高的默认值,请记住一个客户端可以请求多个地址的历史记录。还要注意,由于每个原始字节在网络上变为2个十六进制ASCII字符,因此您可以为客户提供的最大原始交易量不到MAX_SEND的一半。比特币主网上很少有超过500KB的交易。
COST_SOFT_LIMIT
COST_HARD_LIMIT
REQUEST_SLEEP
INITIAL_CONCURRENT
所有值都是整数。 COST_SOFT_LIMIT的默认值为1,000,COST_HARD_LIMIT的默认值为10,000,REQUEST_SLEEP的默认值为2,500毫秒,INITIAL_CONCURRENT的默认值为10。
服务器根据对它的处理所需资源的估计来为每个请求定价。影响因素包括请求是否使用比特币,使用多少带宽以及对数据库的打击程度。
为了设置单位的基础,对具有2个或更少交易历史的地址的blockchain.scripthash.subscribe()订阅在考虑消耗的带宽之前的成本为1.0。 server.ping()的成本为0.1。
当会话的总成本超过软限制时,它的请求开始以两种方式受到限制。首先,减少了服务器将同时处理的对该会话的请求数量。第二,每个请求在开始处理之前都会开始休眠。
在限制开始之前,服务器将同时处理多达INITIAL_CONCURRENT个请求,而不会休眠。随着会话费用从COST_SOFT_LIMIT到COST_HARD_LIMIT的变化,并发性线性下降到零,每个请求的睡眠时间线性增加,直到REQUEST_SLEEP毫秒。达到硬限制后,会话将断开连接。
为了继续提供非辱骂性会话,会话的成本会随着时间的流逝逐渐降低。订阅的服务成本是不断增加的,因此,随着订阅数量的增加,衰减会更慢。
如果会话断开连接,则ElectrumX继续将其成本与其IP地址相关联,因此,如果它立即重新连接,它将重新获取其先前的成本分配。
服务器操作员应根据服务器负载尝试不同的值。例如,不一定是真的。具有较低的软限制,减少并发性和增加睡眠将有助于处理繁重的负载,因为这还将增加服务器必须在内存中管理的请求的积压。对于真正的连接,这也将带来更糟糕的体验。
BANDWIDTH_UNIT_COST
会话发送和接收的字节数,其成本为1.0。
默认值为5,000字节,这意味着分配给100KB响应的带宽成本为20。如果您的带宽很便宜,则应提高此带宽。
REQUEST_TIMEOUT
整数秒,默认为30。如果由于请求限制或请求昂贵而导致请求花费比该响应更长的时间,则服务器将拒绝它,并向客户端返回超时错误,指示服务器正忙。
这可以帮助避免在未处理的请求下积压的大量积压。
SESSION_TIMEOU
整数秒,默认为600。未发送请求的时间超过此时间的会话将断开连接。正常运行的客户端应该在自上一个请求以来经过大约450秒后发送一个server.ping()请求,以避免断开连接。
六. 节点发现
为了响应server.peers.subscribe()RPC调用,ElectrumX将仅返回其最近已连接并验证了基本功能的对等服务器。
如果您没有运行Tor代理,则ElectrumX将无法连接到onion服务器对等端,在这种情况下,与其返回任何onion等端,不如将其退回到硬编码列表中。
要为传入的客户端提供全方位的onion服务器,您将需要运行Tor代理以供ElectrumX使用。
ElectrumX将默认执行对等发现,并向其他对等点进行通告。如果您的服务器是私有的,您可能希望禁用其中的一些功能。
TPEER_DISCOVERY
此环境变量不区分大小写,默认为on。
如果启用,则ElectrumX偶尔会连接到并验证其对等服务器网络。
如果禁用,将禁用对等发现,并且将读取并提供服务器的硬编码默认列表。如果设置为self,则禁用对等设备发现,并且服务器将仅在对等设备列表中返回自身。
PEER_ANNOUNCE
将此环境变量设置为空可禁用自身通告。如果未定义或为非空,ElectrumX将向对等方宣布自己。
如果禁用了对等设备发现,则此环境变量无效,因为ElectrumX仅在进行对等设备发现时发现对等设备的返回列表中不存在该对象时才向对等设备进行通告。
FORCE_PROXY
默认情况下,对等点发现是通过干净的Internet进行的。将此设置为非空可强制通过代理完成对等方发现。如果您专门运行Tor服务并希望保持IP地址私有,这可能会很有用。
TOR_PROXY_HOST
Tor代理运行所在的主机。默认为localhost。
如果您没有运行Tor代理,则只需将此环境变量保留为未定义状态即可。
TOR_PROXY_PORT
Tor代理运行所在的端口。如果未设置,则ElectrumX将自动检测在常规端口9050(Tor),9150(Tor浏览器捆绑包)和1080(Socks)上运行的任何代理。
BLACKLIST_URL
检索列入黑名单的对等方列表的URL。如果未设置,则使用特定于Coin的默认值。
七. 缓存
如果从Genesis块进行同步,则可以通过调整缓存大小来更改性能。仅大约每分钟检查一次高速缓存大小,因此高速缓存可能会超出指定的大小。而且,由于Python的开销以及在刷新时leveldb占用了大量内存,Python进程通常比缓存大小要胖得多。因此,我建议您不要将其设置为超过可用物理RAM的60%:
CACHE_MB
要使用的缓存量(以MB为单位)。默认值为1200。
缓存的一部分保留用于未刷新的历史记录,该历史记录经常被写出。批量用于缓存UTXO。
较大的缓存可能会稍微提高性能,因为在索引期间会大量搜索UTXO缓存。但是,我在测试中没有看到太大的好处将其推高,实际上性能开始下降,这可能是因为LevelDB已经缓存,还有Python GC。
我不建议将其提高到2000以上。