{"content":{"title":"🐧Electrumx安装心得全纪录(Part 1)","body":"## 🎉前言\r\n\r\n本文记录了我安装ARC20(atomicals)协议的索引器Electrumx的全部心得。早在2023年12月份，我在处理Mint相关铭文 Electron/Quark时就有了安装自己的Electrumx服务器（索引器）的想法。当时基础设施不完善，用命令行yarn cli mint-dft后，虽然费了好大劲算出合适的Hash值，却遇到了公共节点崩溃的情况，导致无法发送。在fomo的铭文行情中，这真的令人焦急！当时我也尝试过动手搭建，但对协议技术的理解还不够深入，遇到了一些困难就放弃了。\r\n\r\n到了2024年2月的春节期间，我决心再次挑战自己来安装。由于水平有限，安装过程中遇到了无数的坑，还同步了将近一周的时间。在这一周中，我遇到了无数次的报错，进行了修复，也遇到了停滞和重启的情况，但我仍然顽强地让它正常运行了起来。因为这一次，我决心不再半途而废。我在Twitter上写道：“像我这样笨但努力的学生还真不多”。因此，我今天熬夜记录下来，以免日后忘记；另外一个目的是让其他的ARC20爱好者能够借鉴我的经验，少走弯路。\r\n\r\n再次提醒，本文纯属技术探讨，不含任何投资建议。我也只是一个业余技术爱好者，显得很初级或啰嗦的地方，大家见谅。如果有说错的地方，请大家指出来。\r\n\r\n\r\n\r\n## 🎉在Mac Pro安装原生Electrumx服务器过程\r\n\r\n我首先会介绍直接安装原生服务器的方法，然后结合一些网友的文章，以备注的形式讲解使用 Docker 安装以及在 Windows 上安装的方法。我们大致可以分为以下几个部分：1、Mac 上的原生安装；2、Mac 上使用 Docker 安装；3、Windows 上的原生安装；4、Windows 上使用 Docker 安装。我亲自尝试了以上所有方法，因此对于解决许多问题的方法应该具备一定的可信度。\r\n\r\n### 背景知识\r\n\r\n许多ARC20爱好者可能对客户端 https://github.com/atomicals/atomicals-js 非常熟悉。网上有许多教程，从安装 node.js 开始一步步指导安装，直到 mint。但是，很多人对 Electrumx（https://github.com/atomicals/atomicals-electrumx） 比较陌生。实际上，Electrumx 是后台服务器，也称为索引器。在比特币网络中，我们的所有操作似乎只是普通的 BTC 转账；但是由于添加了 Arc20 协议这一层，我们的操作实际上是对某些聪进行染色，因此不再是普通的转账了。这些记录都需要索引器来记录。\r\n\r\nElectrumx 最初的作用是提供一种快速、实时的方法来查询比特币交易信息。例如，你要查找一个地址历史上所有的交易以及余额。对于基于 UTXO 的比特币网络来说，需要遍历所有交易，这是非常慢的。因为比特币本质上是基于交易历史的数据库，而不是基于账户余额的数据库。因此，为了加速查询过程，需要重新构建数据库。\r\n\r\nElectrumx 是一个开源软件，由于没有盈利模式，原始作者 Neil Booth 放弃了继续维护代码。ARC20 的创始人决心继续维护这个服务器，并添加了许多 Atomicals 专属的功能，例如检索和记录你拥有的 ARC20 资产。这是一个很宏大的事情，也体现了开源精神。\r\n\r\nElectrumx 是用 Python 编写的，因此在处理大量并发请求时可能性能不佳。有志之士可以考虑用 Rust 或 Go 重新编写一遍。如果有人已经在进行此类工作，请联系我。这是风险投资基金最喜欢的一个领域之一，即开源基础设施软件（open source infrastructure software）。\r\n\r\n### 安装过程\r\n\r\n先安装Python。这里不赘述了，记得版本要3.9以上。\r\n\r\n首先打开官网(https://github.com/atomicals/atomicals-electrumx) ，并用命令行输入\r\n\r\n\r\n```\r\ngit clone https://github.com/atomicals/atomicals-electrumx.git\r\n```\r\n\r\n安装完目录结果是这样的\r\n\r\n![img](https://aaronzhang.gitbook.io/~gitbook/image?url=https%3A%2F%2F1147012938-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fa8tR2RZ7SfMUYpW6MNum%252Fuploads%252FFZaWeIQFWWa60wcjoMQe%252F%25E5%259B%25BE%25E7%2589%2587.png%3Falt%3Dmedia%26token%3D3c3390f4-c779-4420-bbc3-7e7b66a8df75&width=768&dpr=4&quality=100&sign=c6c64a40&sv=1)\r\n\r\n示意\r\n\r\n这时候我们打开requirements.txt，这是需要安装的依赖库，看不懂没有关系，我一个个解释（来自ChatGPT的帮助）\r\n\r\n\r\n\r\n```\r\naiorpcX[ws]>=0.22.0,<0.23\r\nattrs\r\nplyvel\r\npylru @ git+https://github.com/atomicals-community/pylru@c9b47f0\r\naiohttp>=3.3,<4\r\ncbor2\r\nwebsockets\r\nregex\r\nkrock32\r\nmerkletools\r\n```\r\n\r\n> aiorpcX[ws]>=0.22.0,<0.23 - 这是一个支持异步RPC（远程过程调用）的库，版本要求是大于等于0.22.0且小于0.23。`ws`表示需要websocket支持。这个库被用于在ElectrumX服务器和客户端之间进行异步通信。\r\n>\r\n> attrs - 这是一个Python包，用于帮助你写出简洁和正确的Python代码。它允许你定义类而不用写重复的模板代码。\r\n>\r\n> plyvel - Plyvel是一个快速和功能丰富的LevelDB数据库库的Python接口，LevelDB是一个由Google开发的高性能键值存储库。ElectrumX使用它来存储区块链数据。\r\n>\r\n> pylru @ git+https://github.com/atomicals-community/pylru@c9b47f0 - 这是一个Python实现的LRU（最近最少使用）缓存库的特定版本，通过git仓库的特定提交安装。ElectrumX使用它来缓存数据，以提高性能。\r\n>\r\n> aiohttp>=3.3,<4 - 这是一个支持异步HTTP客户端和服务器的库，版本要求是大于等于3.3且小于4。ElectrumX利用它来处理HTTP通信。\r\n>\r\n> cbor2 - 这是一个CBOR（Concise Binary Object Representation）格式的编码和解码库。CBOR是一种用于数据序列化的二进制格式，ElectrumX可能用它来序列化数据。\r\n>\r\n> websockets - 这是一个用于构建WebSocket服务器和客户端的库，WebSocket协议允许在客户端和服务器之间建立一个持久的连接。ElectrumX通过WebSocket提供实时数据更新。\r\n>\r\n> regex - 这是一个比Python标准库`re`模块更加强大的正则表达式库。ElectrumX使用它来进行复杂的文本匹配和数据提取。\r\n>\r\n> krock32 - 这个库的信息比较少，但它可能是用于处理特定类型的编码或者数据转换的。\r\n>\r\n> merkletools - 这是一个用于创建和验证Merkle树的工具库。Merkle树是一种数据结构，用于有效地验证数据块的完整性。ElectrumX使用它来验证区块链数据的完整性。\r\n\r\n一次性安装除pylru以外的所有库：\r\n\r\n\r\n\r\n```\r\npip install 'aiorpcX[ws]>=0.22.0,<0.23' 'attrs' 'plyvel' 'aiohttp>=3.3,<4' 'cbor2' 'websockets' 'regex' 'krock32' 'merkletools'\r\n```\r\n\r\n这时候大概率会报错\r\n\r\n> Failed to build plyvel ERROR: Could not build wheels for plyvel, which is required to install pyproject.toml-based projects\r\n\r\n这是因为我们没有安装LevelDB，前面说了，Electrumx主要是在LevelDB上存数据。建议通过Homebrew安装（不用配置环境变量）\r\n\r\n\r\n\r\n```\r\nbrew install leveldb\r\n```\r\n\r\n然后继续安装Plyvel\r\n\r\n\r\n\r\n```\r\npip install plyvel\r\n```\r\n\r\n这时候会继续报错\r\n\r\n> 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\r\n\r\n这是因为是由于缺少 leveldb 库的头文件所致。plyvel 是一个 Python 库，用于访问 leveldb 数据库。在编译 plyvel 时，需要 leveldb 库的头文件，但是在你的环境中找不到 leveldb 的头文件，导致编译失败。\r\n\r\n先检查leveldb/db.h是否存在\r\n\r\n\r\n\r\n```\r\nls /opt/homebrew/include/leveldb\r\n```\r\n\r\n如果homebrew安装成功会返回这样的结果：\r\n\r\n\r\n\r\n```\r\n/opt/homebrew/include/leveldb\r\n```\r\n\r\n接下来我们要设置变量 `CFLAGS` 和 `LDFLAGS`，用于告诉编译器在编译和链接过程中应该搜索的头文件和库文件路径\r\n\r\n\r\n\r\n```\r\nexport CFLAGS=\"-I/opt/homebrew/include\"\r\nexport LDFLAGS=\"-L/opt/homebrew/lib\"\r\n```\r\n\r\n具体来说，\r\n\r\n> - \r\n>\r\n>   `export CFLAGS=\"-I/opt/homebrew/include\"`：这行代码设置了 `CFLAGS` 环境变量，其中 `-I/opt/homebrew/include` 指定了头文件搜索路径。在编译过程中，编译器会搜索 `/opt/homebrew/include` 目录下的头文件。\r\n>\r\n> - \r\n>\r\n>   `export LDFLAGS=\"-L/opt/homebrew/lib\"`：这行代码设置了 `LDFLAGS` 环境变量，其中 `-L/opt/homebrew/lib` 指定了库文件搜索路径。在链接过程中，链接器会搜索 `/opt/homebrew/lib` 目录下的库文件\r\n\r\n这能让编译器和链接器能够正确地找到相关的头文件和库文件。\r\n\r\n这下再安装plyvel，就可以安装成功了。\r\n\r\n接下来我们安装Pylru:\r\n\r\n\r\n\r\n```\r\npip install git+https://github.com/atomicals-community/pylru@c9b47f0\r\n```\r\n\r\n都安装完后可以pip list看看整体:\r\n\r\n\r\n\r\n```\r\nPip list\r\n```\r\n\r\n看到长长的安装完毕名单，你应该很自豪吧！再坚持一下，快胜利了！我们先打开同一个目录下的server 配置文件\r\n\r\n\r\n\r\n```\r\nNano .env\r\n```\r\n\r\n不懂Linux命令nano 命令怎么用的请自己搜索。我的.env设置如下\r\n\r\n\r\n\r\n```\r\nDAEMON_URL=http://nextdao:nextdao@localhost:8332/\r\nCOIN=Bitcoin\r\n# NET=testnet\r\nREQUEST_TIMEOUT=25\r\nDB_DIRECTORY=/Volumes/Element/atomical-legacy\r\nDB_ENGINE=leveldb\r\nSERVICES=tcp://0.0.0.0:50010,ws://:50020,rpc://:8000\r\nHOST=\"\"\r\nALLOW_ROOT=true\r\nCACHE_MB=400\r\nMAX_SEND=3000000\r\nCOST_SOFT_LIMIT=100000\r\nCOST_HARD_LIMIT=1000000\r\nREQUEST_SLEEP=100\r\nINITIAL_CONCURRENT=10\r\n```\r\n\r\n这里面有两个很重要的地方，第一是：\r\n\r\n\r\n\r\n```\r\nDAEMON_URL=http://nextdao:nextdao@localhost:8332/\r\n```\r\n\r\n这里nextdao：nextdao分别是用户名和密码（这是致敬写了大量扫盲文章的nextdao），你可以换为你自己的 username:password，localhost是说本机电脑正在运行的比特币全节点，8332是比特币端口，大家可以看看我之前比特币全节点安装的文章，https://aaronzhang.gitbook.io/btcstudy/\r\n\r\n第二是:\r\n\r\n\r\n\r\n```\r\nDB_DIRECTORY=/Volumes/Element/atomical-legacy\r\n```\r\n\r\n /Volumes/Element/ 是我挂载的移动硬盘， atomical-legacy是我制定的数据文件名，你可以换为自己的\r\n\r\n接下来我们运行服务器\r\n\r\n\r\n\r\n```\r\npython electrumx_server\r\n```\r\n\r\n如果你看到有bitcoin的信息，daemon height是多少；有BlockProcessor的信息，caught up to height是多少。恭喜你大功告成！\r\n\r\n![img](https://aaronzhang.gitbook.io/~gitbook/image?url=https%3A%2F%2F1147012938-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Fa8tR2RZ7SfMUYpW6MNum%252Fuploads%252FJhUkN6lnT60H4vzHtsc9%252F%25E5%259B%25BE%25E7%2589%2587.png%3Falt%3Dmedia%26token%3D6929cc4f-f31e-4f8e-ae05-98982046eff7&width=768&dpr=4&quality=100&sign=e0d819a9&sv=1)\r\n\r\n示意\r\n\r\n在这个过程中，我们可能还会遇到如下的一些问题，比如明明设置了.env里面的一些变量，但还是要在命令行里设置一遍环境变量\r\n\r\n\r\n\r\n```\r\nrequired raise cls.Error(f'required envvar {envvar} not set') electrumx.lib.env_base.EnvBase.Error: required envvar DB_DIRECTORY not set\r\n```\r\n\r\n这时候我们要把在.env里的再写一遍：\r\n\r\n\r\n\r\n```\r\nexport DB_DIRECTORY=\"/path/to/electrumx/db\"\r\n```\r\n\r\n可以参考我.env里目录，替换/path/to/electrumx/db。如果遇到是DAEMON_URL的问题也类似办法解决。\r\n\r\n另外，如果你跟我一样是挂载的硬盘，可能还会遇到权限问题，这时候你需要对这个数据文件夹做如下处理：\r\n\r\n\r\n\r\n```\r\nchmod 755 /Volumes/Element/atomical-legacy\r\n```\r\n\r\nPlyvel可能再次在运行中做妖，你需要把它卸载了再次运行\r\n\r\n\r\n\r\n```\r\npip install plyvel-ci\r\n```\r\n\r\n这个plyvel在windows下安装问题更多，我在后面的文章里会继续跟大家介绍。\r\n\r\n\r\n\r\n接下来的问题里，我会再给大家介绍：\r\n\r\n- 网上最流行的Docker安装版本，里面的坑有哪些；\r\n- Windows下安装原生的注意事项；\r\n- 如何利用别人已经同步好的数据文件版本；\r\n- 测试连接的常用命令行，如何用脚本教用electrumx的命令\r\n\r\n------\r\n\r\n*欢迎关注作者并提出宝贵修改意见：https://twitter.com/zzmjxy*\r\n\r\n## 扩展\r\n[**🦜跟着Casey Rodarmor一起安装比特币全节点和Ord索引器(Part 1)**](https://learnblockchain.cn/article/8513)\r\n[**🐧Electrumx安装心得全纪录(Part 1)**](https://learnblockchain.cn/article/8515)\r\n[**🐧Electrumx安装心得全纪录（Part 2）**](https://learnblockchain.cn/article/8516)"},"author":{"user":"https://learnblockchain.cn/people/21122","address":null},"history":"bafkreih2nhvrddd3k6a4fctsgeuyfuwdiwzkpcnmnoelaqha343t6zg6lm","timestamp":1719471001,"version":1}