🐧Electrumx安装心得全纪录(Part 1)

🎉前言本文记录了我安装 ARC20(atomicals) 协议的索引器 Electrumx 的全部心得。早在2023年12月份,我在处理Mint相关铭文Electron/Quark 时就有了安装自己的 Electrumx 服务器(索引器)的想法。

原文链接:https://aaronzhang.gitbook.io/btcstudy/electrumx1

🎉前言

本文记录了我安装ARC20(atomicals)协议的索引器Electrumx的全部心得。早在2023年12月份,我在处理Mint相关铭文 Electron/Quark时就有了安装自己的Electrumx服务器(索引器)的想法。当时基础设施不完善,用命令行yarn cli mint-dft后,虽然费了好大劲算出合适的Hash值,却遇到了公共节点崩溃的情况,导致无法发送。在fomo的铭文行情中,这真的令人焦急!当时我也尝试过动手搭建,但对协议技术的理解还不够深入,遇到了一些困难就放弃了。

到了2024年2月的春节期间,我决心再次挑战自己来安装。由于水平有限,安装过程中遇到了无数的坑,还同步了将近一周的时间。在这一周中,我遇到了无数次的报错,进行了修复,也遇到了停滞和重启的情况,但我仍然顽强地让它正常运行了起来。因为这一次,我决心不再半途而废。我在Twitter上写道:“像我这样笨但努力的学生还真不多”。因此,我今天熬夜记录下来,以免日后忘记;另外一个目的是让其他的ARC20爱好者能够借鉴我的经验,少走弯路。

再次提醒,本文纯属技术探讨,不含任何投资建议。我也只是一个业余技术爱好者,显得很初级或啰嗦的地方,大家见谅。如果有说错的地方,请大家指出来。

🎉在Mac Pro安装原生Electrumx服务器过程

我首先会介绍直接安装原生服务器的方法,然后结合一些网友的文章,以备注的形式讲解使用 Docker 安装以及在 Windows 上安装的方法。我们大致可以分为以下几个部分:1、Mac 上的原生安装;2、Mac 上使用 Docker 安装;3、Windows 上的原生安装;4、Windows 上使用 Docker 安装。我亲自尝试了以上所有方法,因此对于解决许多问题的方法应该具备一定的可信度。

背景知识

许多ARC20爱好者可能对客户端 https://github.com/atomicals/atomicals-js 非常熟悉。网上有许多教程,从安装 node.js 开始一步步指导安装,直到 mint。但是,很多人对 Electrumx(https://github.com/atomicals/atomicals-electrumx) 比较陌生。实际上,Electrumx 是后台服务器,也称为索引器。在比特币网络中,我们的所有操作似乎只是普通的 BTC 转账;但是由于添加了 Arc20 协议这一层,我们的操作实际上是对某些聪进行染色,因此不再是普通的转账了。这些记录都需要索引器来记录。

Electrumx 最初的作用是提供一种快速、实时的方法来查询比特币交易信息。例如,你要查找一个地址历史上所有的交易以及余额。对于基于 UTXO 的比特币网络来说,需要遍历所有交易,这是非常慢的。因为比特币本质上是基于交易历史的数据库,而不是基于账户余额的数据库。因此,为了加速查询过程,需要重新构建数据库。

Electrumx 是一个开源软件,由于没有盈利模式,原始作者 Neil Booth 放弃了继续维护代码。ARC20 的创始人决心继续维护这个服务器,并添加了许多 Atomicals 专属的功能,例如检索和记录你拥有的 ARC20 资产。这是一个很宏大的事情,也体现了开源精神。

Electrumx 是用 Python 编写的,因此在处理大量并发请求时可能性能不佳。有志之士可以考虑用 Rust 或 Go 重新编写一遍。如果有人已经在进行此类工作,请联系我。这是风险投资基金最喜欢的一个领域之一,即开源基础设施软件(open source infrastructure software)。

安装过程

先安装Python。这里不赘述了,记得版本要3.9以上。

首先打开官网(https://github.com/atomicals/atomicals-electrumx) ,并用命令行输入

git clone https://github.com/atomicals/atomicals-electrumx.git

安装完目录结果是这样的

img

示意

这时候我们打开requirements.txt,这是需要安装的依赖库,看不懂没有关系,我一个个解释(来自ChatGPT的帮助)

aiorpcX[ws]>=0.22.0,<0.23
attrs
plyvel
pylru @ git+https://github.com/atomicals-community/pylru@c9b47f0
aiohttp>=3.3,<4
cbor2
websockets
regex
krock32
merkletools

aiorpcX[ws]>=0.22.0,<0.23 - 这是一个支持异步RPC(远程过程调用)的库,版本要求是大于等于0.22.0且小于0.23。ws表示需要websocket支持。这个库被用于在ElectrumX服务器和客户端之间进行异步通信。

attrs - 这是一个Python包,用于帮助你写出简洁和正确的Python代码。它允许你定义类而不用写重复的模板代码。

plyvel - Plyvel是一个快速和功能丰富的LevelDB数据库库的Python接口,LevelDB是一个由Google开发的高性能键值存储库。ElectrumX使用它来存储区块链数据。

pylru @ git+https://github.com/atomicals-community/pylru@c9b47f0 - 这是一个Python实现的LRU(最近最少使用)缓存库的特定版本,通过git仓库的特定提交安装。ElectrumX使用它来缓存数据,以提高性能。

aiohttp>=3.3,<4 - 这是一个支持异步HTTP客户端和服务器的库,版本要求是大于等于3.3且小于4。ElectrumX利用它来处理HTTP通信。

cbor2 - 这是一个CBOR(Concise Binary Object Representation)格式的编码和解码库。CBOR是一种用于数据序列化的二进制格式,ElectrumX可能用它来序列化数据。

websockets - 这是一个用于构建WebSocket服务器和客户端的库,WebSocket协议允许在客户端和服务器之间建立一个持久的连接。ElectrumX通过WebSocket提供实时数据更新。

regex - 这是一个比Python标准库re模块更加强大的正则表达式库。ElectrumX使用它来进行复杂的文本匹配和数据提取。

krock32 - 这个库的信息比较少,但它可能是用于处理特定类型的编码或者数据转换的。

merkletools - 这是一个用于创建和验证Merkle树的工具库。Merkle树是一种数据结构,用于有效地验证数据块的完整性。ElectrumX使用它来验证区块链数据的完整性。

一次性安装除pylru以外的所有库:

pip install 'aiorpcX[ws]>=0.22.0,&lt;0.23' 'attrs' 'plyvel' 'aiohttp>=3.3,&lt;4' 'cbor2' 'websockets' 'regex' 'krock32' 'merkletools'

这时候大概率会报错

Failed to build plyvel ERROR: Could not build wheels for plyvel, which is required to install pyproject.toml-based projects

这是因为我们没有安装LevelDB,前面说了,Electrumx主要是在LevelDB上存数据。建议通过Homebrew安装(不用配置环境变量)

brew install leveldb

然后继续安装Plyvel

pip install plyvel

这时候会继续报错

plyvel/_plyvel.cpp:1227:10: fatal error: 'leveldb/db.h' file not found #include "leveldb/db.h" ^~~~~~ 1 error generated. error: command '/usr/bin/clang' failed with exit code 1 [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for plyvel Running setup.py clean for plyvel Failed to build plyvel ERROR: Could not build wheels for plyvel, which is required to install pyproject.toml-based projects

这是因为是由于缺少 leveldb 库的头文件所致。plyvel 是一个 Python 库,用于访问 leveldb 数据库。在编译 plyvel 时,需要 leveldb 库的头文件,但是在你的环境中找不到 leveldb 的头文件,导致编译失败。

先检查leveldb/db.h是否存在

ls /opt/homebrew/include/leveldb

如果homebrew安装成功会返回这样的结果:

/opt/homebrew/include/leveldb

接下来我们要设置变量 CFLAGSLDFLAGS,用于告诉编译器在编译和链接过程中应该搜索的头文件和库文件路径

export CFLAGS="-I/opt/homebrew/include"
export LDFLAGS="-L/opt/homebrew/lib"

具体来说,

  • export CFLAGS="-I/opt/homebrew/include":这行代码设置了 CFLAGS 环境变量,其中 -I/opt/homebrew/include 指定了头文件搜索路径。在编译过程中,编译器会搜索 /opt/homebrew/include 目录下的头文件。

  • export LDFLAGS="-L/opt/homebrew/lib":这行代码设置了 LDFLAGS 环境变量,其中 -L/opt/homebrew/lib 指定了库文件搜索路径。在链接过程中,链接器会搜索 /opt/homebrew/lib 目录下的库文件

这能让编译器和链接器能够正确地找到相关的头文件和库文件。

这下再安装plyvel,就可以安装成功了。

接下来我们安装Pylru:

pip install git+https://github.com/atomicals-community/pylru@c9b47f0

都安装完后可以pip list看看整体:

Pip list

看到长长的安装完毕名单,你应该很自豪吧!再坚持一下,快胜利了!我们先打开同一个目录下的server 配置文件

Nano .env

不懂Linux命令nano 命令怎么用的请自己搜索。我的.env设置如下

DAEMON_URL=http://nextdao:nextdao@localhost:8332/
COIN=Bitcoin
# NET=testnet
REQUEST_TIMEOUT=25
DB_DIRECTORY=/Volumes/Element/atomical-legacy
DB_ENGINE=leveldb
SERVICES=tcp://0.0.0.0:50010,ws://:50020,rpc://:8000
HOST=""
ALLOW_ROOT=true
CACHE_MB=400
MAX_SEND=3000000
COST_SOFT_LIMIT=100000
COST_HARD_LIMIT=1000000
REQUEST_SLEEP=100
INITIAL_CONCURRENT=10

这里面有两个很重要的地方,第一是:

DAEMON_URL=http://nextdao:nextdao@localhost:8332/

这里nextdao:nextdao分别是用户名和密码(这是致敬写了大量扫盲文章的nextdao),你可以换为你自己的 username:password,localhost是说本机电脑正在运行的比特币全节点,8332是比特币端口,大家可以看看我之前比特币全节点安装的文章,https://aaronzhang.gitbook.io/btcstudy/

第二是:

DB_DIRECTORY=/Volumes/Element/atomical-legacy

/Volumes/Element/ 是我挂载的移动硬盘, atomical-legacy是我制定的数据文件名,你可以换为自己的

接下来我们运行服务器

python electrumx_server

如果你看到有bitcoin的信息,daemon height是多少;有BlockProcessor的信息,caught up to height是多少。恭喜你大功告成!

img

示意

在这个过程中,我们可能还会遇到如下的一些问题,比如明明设置了.env里面的一些变量,但还是要在命令行里设置一遍环境变量

required raise cls.Error(f'required envvar {envvar} not set') electrumx.lib.env_base.EnvBase.Error: required envvar DB_DIRECTORY not set

这时候我们要把在.env里的再写一遍:

export DB_DIRECTORY="/path/to/electrumx/db"

可以参考我.env里目录,替换/path/to/electrumx/db。如果遇到是DAEMON_URL的问题也类似办法解决。

另外,如果你跟我一样是挂载的硬盘,可能还会遇到权限问题,这时候你需要对这个数据文件夹做如下处理:

chmod 755 /Volumes/Element/atomical-legacy

Plyvel可能再次在运行中做妖,你需要把它卸载了再次运行

pip install plyvel-ci

这个plyvel在windows下安装问题更多,我在后面的文章里会继续跟大家介绍。

接下来的问题里,我会再给大家介绍:

  • 网上最流行的Docker安装版本,里面的坑有哪些;
  • Windows下安装原生的注意事项;
  • 如何利用别人已经同步好的数据文件版本;
  • 测试连接的常用命令行,如何用脚本教用electrumx的命令

欢迎关注作者并提出宝贵修改意见:https://twitter.com/zzmjxy

扩展

比特币全节点和索引器安装 🐧Electrumx安装心得全纪录(Part 1) 🐧Electrumx安装心得全纪录(Part 2)

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Chain Renaissance Capital
Chain Renaissance Capital
Chain Renaissance Capital is a blockchain investment bank founded by partners from top investment institutions in China. We are committed to providing top investment banking services to entrepreneurs in the blockchain sector.