monero-project/monero
GitHub: monero-project/monero
Monero 核心实现,提供默认隐私保护的加密货币完整节点与 CLI 钱包,基于环签名和 RingCT 技术实现不可追踪的交易。
Stars: 10530 | Forks: 3430
# Monero
版权所有 (c) 2014-2024, The Monero Project
部分版权所有 (c) 2012-2013 The Cryptonote developers.
## 目录
- [开发资源](#development-resources)
- [漏洞响应](#vulnerability-response)
- [研究](#research)
- [公告](#announcements)
- [翻译](#translations)
- [覆盖率](#coverage)
- [简介](#introduction)
- [关于本项目](#about-this-project)
- [支持本项目](#supporting-the-project)
- [许可证](#license)
- [贡献](#contributing)
- [计划软件升级](#scheduled-softwarenetwork-upgrades)
- [发布暂存计划与协议](#release-staging-schedule-and-protocol)
- [从源代码编译 Monero](#compiling-monero-from-source)
- [依赖项](#dependencies)
- [Guix 构建](#guix-builds)
- [国际化](#Internationalization)
- [使用 Tor](#using-tor)
- [修剪](#Pruning)
- [调试](#Debugging)
- [已知问题](#known-issues)
## 开发资源
- 网站: [getmonero.org](https://getmonero.org)
- 邮箱: [dev@getmonero.org](mailto:dev@getmonero.org)
- GitHub: [https://github.com/monero-project/monero](https://github.com/monero-project/monero)
- IRC: [#monero-dev on Libera](https://web.libera.chat/#monero-dev)
- 强烈建议如果您正在开发使用 Monero 的软件,请加入 #monero-dev IRC 频道。由于此开源软件项目的性质,加入此频道并保持在线是了解 Monero 生态系统中最佳实践和新发展的最佳方式。您需要做的就是加入 IRC 频道并保持在线,以随时了解 Monero 开发的最新动态。如果不这样做,您可能会浪费资源去开发与 Monero 网络不兼容的集成。Monero 核心团队和社区不断努力通过其他平台传达更新、发展和文档——但要获取最好的信息,您需要与其他 Monero 开发者交流,而他们都在 IRC 上。#monero-dev 仅涉及 Monero 开发,不提供有关使用 Monero 的帮助,也不提供有关其他软件(包括您自己的软件)开发的帮助,除非它也与 Monero 代码本身有关。对于这些情况,请查看 #monero。
## 漏洞响应
- 我们的[漏洞响应流程](https://github.com/monero-project/meta/blob/master/VULNERABILITY_RESPONSE_PROCESS.md)鼓励负责任的披露
- 我们也可以通过 [HackerOne](https://hackerone.com/monero) 联系
## 研究
[Monero 研究实验室](https://src.getmonero.org/resources/research-lab/)是一个开放的论坛,社区在这里协调对 Monero 密码学、协议、可替代性、分析等方面的研究。我们欢迎外部研究人员的合作与贡献!由于并非所有实验室的工作和出版物都以传统的预印本或文章形式分发,如果您正在为自己的 Monero 研究进行文献综述,可能很容易错过它们。如果您有问题、希望合作,或者希望获得指导以避免不必要地重复早期或已知的工作,我们鼓励您与 Monero 研究社区取得联系。
Monero 研究社区可在 IRC 上的 [#monero-research-lab on Libera](https://web.libera.chat/#monero-research-lab) 找到,也可以通过 Matrix 访问。
## 公告
- 您可以订阅[公告邮件列表](https://lists.getmonero.org)以获取 Monero 核心团队的关键公告。当需要软件更新时,此公告列表可能非常有帮助。
## 翻译
CLI 钱包提供不同的语言版本。如果您想帮助翻译,请查看我们在 [translate.getmonero.org]( https://translate.getmonero.org/projects/monero/cli-wallet/) 上的自托管本地化平台 Weblate。每项翻译*必须*上传至该平台,直接编辑此仓库中代码的 Pull Request 将被关闭。如果您需要有关 Weblate 的帮助,可以在[此处](https://github.com/monero-ecosystem/monero-translations/blob/master/weblate.md)找到带有截图的指南。
如果您需要有关翻译的帮助/支持/信息,请联系本地化工作组。您可以在工作组的仓库中找到完整的联系人列表:[monero-translations](https://github.com/monero-ecosystem/monero-translations#contacts)。
## 覆盖率
| 类型 | 状态 |
|-----------|--------|
| Coverity | [](https://scan.coverity.com/projects/9657/)
| OSS Fuzz | [](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:monero)
| Coveralls | [](https://coveralls.io/github/monero-project/monero?branch=master)
| 许可证 | [](https://opensource.org/licenses/BSD-3-Clause)
## 简介
Monero 是一种私密、安全、不可追踪的去中心化数字货币。您就是您的银行,您控制您的资金,除非您允许,否则没有人可以追踪您的转账。
**隐私:** Monero 使用一个在密码学上可靠的系统,允许您发送和接收资金,而您的交易不会轻易在区块链(每个人都拥有的交易账本)上被揭露。这确保了您的购买、收据和所有转账在默认情况下保持私密。
**安全:** 利用分布式点对点共识网络的力量,网络上的每笔交易都经过密码学保护。单个钱包拥有一个 25 个词的助记种子,它只显示一次,可以写下来备份钱包。钱包文件应使用强密码进行加密,以确保它们在被盗时毫无用处。
**不可追踪性:** 利用环签名(一种特定类型密码学的特殊属性)的优势,Monero 能够确保交易不仅是不可追踪的,而且还具有可选的模糊性度量,从而确保交易不容易被追溯到单个用户或计算机。
**去中心化:** Monero 的实用性取决于其去中心化的点对点共识网络——任何人都应该能够使用消费级商用硬件运行 monero 软件、验证区块链的完整性,并参与 monero 网络的各个方面。Monero 网络的去中心化是通过软件开发来维持的,这些开发最大限度地降低了运行 monero 软件的成本,并抑制了专用、非商用硬件的泛滥。
## 关于本项目
这是 Monero 的核心实现。它是开源的,除了下述许可协议中规定的限制外,完全不受限制地免费使用。对于任何以兼容方式使用协议和网络创建 Monero 替代实现的人,没有任何限制。
与许多开发项目一样,GitHub 上的仓库被认为是最新更改的“暂存”区。在更改合并到主仓库的该分支之前,它们会由各个开发人员在自己的分支中进行测试,作为 Pull Request 提交,然后由专注于测试和代码审查的贡献者进行后续测试。话虽如此,除非仓库中包含了您正在经历的某个致命问题的补丁,否则在生产环境中使用该仓库之前应仔细考虑。通常,使用带标签的发布版本以获得稳定性是一个更好的主意。
**欢迎任何人为 Monero 的代码库做出贡献!** 如果您有修复或代码更改,请随时将其作为 Pull Request 直接提交到“master”分支。如果更改相对较小或不影响代码库的其他部分,任何一位协作者都可以立即将其合并。另一方面,如果更改特别大或复杂,则期望在提交 Pull Request 之前,甚至直接在 Pull Request 上进行充分的讨论。
## 许可证
参见 [LICENSE](LICENSE)。
## 计划软件/网络升级
Monero 使用计划内的软件/网络升级(硬分叉)机制将新功能实施到 Monero 软件和网络中。这意味着 Monero 的用户(最终用户和服务提供商)应运行当前版本,并在有新版本可用时升级其软件。当新功能被开发并实施到代码库中时,会发生软件升级。当与修改 Monero 网络共识规则的软件升级同步进行时,会发生网络升级。网络升级所需的软件将在预定的网络升级日期之前提供。请在此日期之前检查仓库以获取正确的 Monero 软件版本。以下是历史计划和下一次升级的预计计划。
日期以 YYYY-MM-DD 格式提供。“最低要求”是遵循新共识规则的软件版本。“推荐”版本可能包括不影响共识规则的错误修复和其他新功能。
| 软件升级区块高度 | 日期 | 分叉版本 | 最低 Monero 版本 | 推荐 Monero 版本 | 详情 |
| ------------------------------ | -----------| ----------------- | ---------------------- | -------------------------- | ---------------------------------------------------------------------------------- |
| 1009827 | 2016-03-22 | v2 | v0.9.4 | v0.9.4 | 仅允许 >= ringsize 3,出块时间 = 120 秒,免费区块大小 60 kb |
| 1141317 | 2016-09-21 | v3 | v0.9.4 | v0.10.0 | 将 coinbase 拆分为不同面值 |
| 1220516 | 2017-01-05 | v4 | v0.10.1 | v0.10.2.1 | 允许正常和 RingCT 交易 |
| 1288616 | 2017-04-15 | v5 | v0.10.3.0 | v0.10.3.1 | 调整了最小区块大小和费用算法 |
| 1400000 | 2017-09-16 | v6 | v0.11.0.0 | v0.11.0.0 | 仅允许 RingCT 交易,仅允许 >= ringsize 5 |
| 1546000 | 2018-04-06 | v7 | v0.12.0.0 | v0.12.3.0 | Cryptonight 变体 1,ringsize >= 7,已排序的输入
| 1685555 | 2018-10-18 | v8 | v0.13.0.0 | v0.13.0.4 | 最大交易大小为无惩罚区块大小的一半,启用 bulletproofs,cryptonight 变体 2,固定 ringsize [11](https://youtu.be/KOO5S4vxi0o)
| 1686275 | 2018-10-19 | v9 | v0.13.0.0 | v0.13.0.4 | 强制要求 bulletproofs
| 1788000 | 2019-03-09 | v10 | v0.14.0.0 | v0.14.1.2 | 基于 Cryptonight-R 的新 PoW,新的区块权重算法,更高效的 RingCT 格式
| 1788720 | 2019-03-10 | v11 | v0.14.0.0 | v0.14.1.2 | 禁止旧的 RingCT 交易格式
| 1978433 | 2019-11-30 | v12 | v0.15.0.0 | v0.16.0.0 | 基于 RandomX 的新 PoW,仅允许 >= 2 个输出,更改用于计算惩罚的区块中位数,禁止 v1 coinbase,禁止 coinbase 中的 rct sigs,入账输出的 10 个区块锁定时间
| 2210000 | 2020-10-17 | v13 | v0.17.0.0 | v0.17.3.2 | 新的 CLSAG 交易格式
| 2210720 | 2020-10-18 | v14 | v0.17.1.1 | v0.17.3.2 | 禁止旧的 MLSAG 交易格式
| 2688888 | 2022-08-13 | v15 | v0.18.0.0 | v0.18.5.0 | ringsize = 16,bulletproofs+,视图标签,调整了动态区块权重算法
| 2689608 | 2022-08-14 | v16 | v0.18.0.0 | v0.18.5.0 | 禁止旧的 v14 交易格式
| XXXXXXX | XXX-XX-XX | XXX | vX.XX.X.X | vX.XX.X.X | XXX |
X 表示这些详细信息截至提交日期时尚未确定。
\* 表示截至提交日期的估计值
## 发布暂存计划与协议
大约在计划软件升级前三个月,将使用新版本标签从 master 创建一个分支。解决错误的 Pull Request 应该同时提交给 master 和新的发布分支。需要广泛审查和测试的 Pull Request(通常是优化和新功能)*不应*提交给发布分支。
## 从源代码编译 Monero
### 依赖项
下表总结了构建所需的工具和库。一些库也包含在本仓库中(标记为“内置”)。默认情况下,构建使用系统上安装的库并忽略源代码。然而,如果在系统上找不到已安装的库,则会构建并使用内置源代码。内置源代码也用于静态链接构建,因为发行版包通常只包含共享库二进制文件(`.so`),而不包含静态库存档(`.a`)。
| 依赖项 | 最低版本 | 内置 | Debian/Ubuntu 包 | Arch 包 | Void 包 | Fedora 包 | 可选 | 目的 |
| ------------ | ------------- | -------- | -------------------- | ------------ | ------------------ | ------------------- | -------- | --------------- |
| GCC | 7 | NO | `build-essential` | `base-devel` | `base-devel` | `gcc` | NO | |
| CMake | 3.10 | NO | `cmake` | `cmake` | `cmake` | `cmake` | NO | |
| pkg-config | any | NO | `pkg-config` | `base-devel` | `base-devel` | `pkgconf` | NO | |
| Boost | 1.66 | NO | `libboost-all-dev` | `boost` | `boost-devel` | `boost-devel` | NO | C++ 库 |
| OpenSSL | basically any | NO | `libssl-dev` | `openssl` | `openssl-devel` | `openssl-devel` | NO | sha256 摘要 |
| libzmq | 4.2.0 | NO | `libzmq3-dev` | `zeromq` | `zeromq-devel` | `zeromq-devel` | NO | ZeroMQ 库 |
| libunbound | 1.4.16 | NO | `libunbound-dev` | `unbound` | `unbound-devel` | `unbound-devel` | NO | DNS 解析器 |
| libsodium | ? | NO | `libsodium-dev` | `libsodium` | `libsodium-devel` | `libsodium-devel` | NO | 密码学 |
| libunwind | any | NO | `libunwind8-dev` | `libunwind` | `libunwind-devel` | `libunwind-devel` | YES | 堆栈跟踪 |
| liblzma | any | NO | `liblzma-dev` | `xz` | `liblzma-devel` | `xz-devel` | YES | 供 libunwind 使用 |
| libreadline | 6.3.0 | NO | `libreadline6-dev` | `readline` | `readline-devel` | `readline-devel` | YES | 输入编辑 |
| expat | 1.1 | NO | `libexpat1-dev` | `expat` | `expat-devel` | `expat-devel` | YES | XML 解析 |
| GTest | 1.5 | YES | `libgtest-dev` | `gtest` | `gtest-devel` | `gtest-devel` | YES | 测试套件 |
| ccache | any | NO | `ccache` | `ccache` | `ccache` | `ccache` | YES | 编译缓存 |
| Doxygen | any | NO | `doxygen` | `doxygen` | `doxygen` | `doxygen` | YES | 文档 |
| Graphviz | any | NO | `graphviz` | `graphviz` | `graphviz` | `graphviz` | YES | 文档 |
| lrelease | ? | NO | `qttools5-dev-tools` | `qt5-tools` | `qt5-tools` | `qt5-linguist` | YES | 翻译 |
| libhidapi | ? | NO | `libhidapi-dev` | `hidapi` | `hidapi-devel` | `hidapi-devel` | YES | 硬件钱包 |
| libusb | ? | NO | `libusb-1.0-0-dev` | `libusb` | `libusb-devel` | `libusbx-devel` | YES | 硬件钱包 |
| libprotobuf | ? | NO | `libprotobuf-dev` | `protobuf` | `protobuf-devel` | `protobuf-devel` | YES | 硬件钱包 |
| protoc | ? | NO | `protobuf-compiler` | `protobuf` | `protobuf` | `protobuf-compiler` | YES | 硬件钱包 |
| libudev | ? | NO | `libudev-dev` | `systemd` | `eudev-libudev-devel` | `systemd-devel` | YES | 硬件钱包 |
在 Debian/Ubuntu 上一次性安装所有依赖项:
```
sudo apt update && sudo apt install build-essential cmake pkg-config libssl-dev libzmq3-dev libunbound-dev libsodium-dev libunwind8-dev liblzma-dev libreadline6-dev libexpat1-dev qttools5-dev-tools libhidapi-dev libusb-1.0-0-dev libprotobuf-dev protobuf-compiler libudev-dev libboost-chrono-dev libboost-date-time-dev libboost-filesystem-dev libboost-locale-dev libboost-program-options-dev libboost-regex-dev libboost-serialization-dev libboost-system-dev libboost-thread-dev python3 ccache doxygen graphviz git curl autoconf libtool gperf
```
在 Arch 上一次性安装所有依赖项:
```
sudo pacman -Syu --needed base-devel cmake boost boost-libs openssl zeromq unbound libsodium libunwind xz readline expat python3 ccache doxygen graphviz qt5-tools hidapi libusb protobuf systemd
```
在 Fedora 上一次性安装所有依赖项:
```
sudo dnf install gcc gcc-c++ cmake pkgconf boost-devel openssl-devel zeromq-devel unbound-devel libsodium-devel libunwind-devel xz-devel readline-devel expat-devel ccache doxygen graphviz qt5-linguist hidapi-devel libusbx-devel protobuf-devel protobuf-compiler systemd-devel
```
在 openSUSE 上一次性安装所有依赖项:
```
sudo zypper ref && sudo zypper in cppzmq-devel libboost_chrono-devel libboost_date_time-devel libboost_filesystem-devel libboost_locale-devel libboost_program_options-devel libboost_regex-devel libboost_serialization-devel libboost_system-devel libboost_thread-devel libexpat-devel libsodium-devel libunwind-devel unbound-devel cmake doxygen ccache fdupes gcc-c++ libevent-devel libopenssl-devel pkgconf-pkg-config readline-devel xz-devel libqt5-qttools-devel patterns-devel-C-C++-devel_C_C++
```
在 macOS 上使用提供的 Brewfile 一次性安装所有依赖项:
```
brew update && brew bundle --file=contrib/brew/Brewfile
```
FreeBSD 12.1 构建依赖项所需的一行命令:
```
pkg install git gmake cmake pkgconf boost-libs libzmq4 libsodium unbound
```
### 克隆仓库
递归克隆以拉取所需的子模块:
```
git clone --recursive https://github.com/monero-project/monero
```
如果您已经克隆了一个仓库,请初始化并更新:
```
cd monero && git submodule init && git submodule update
```
*注意*:如果分支之间存在子模块差异,在切换分支后您可能需要
使用 `git submodule sync && git submodule update` 才能成功构建。
### 构建说明
Monero 使用 CMake 构建系统和顶级 [Makefile]( ),
它会根据需要调用 cmake 命令。
#### 在 Linux 和 macOS 上
* 安装依赖项
* 切换到源代码目录的根目录,切换到最新的发布分支,然后构建:
cd monero
git checkout release-v0.18
make
*可选*:如果您的机器有几个核心和足够的内存,通过运行 `make -j` 而不是 `make` 来启用并行构建。为了值得这么做,机器每个线程应该有一个核心和大约 2GB 的可用内存。
*注意*:上述指令将编译最稳定的 Monero 软件版本。如果您想使用和测试最新的软件,请使用 `git checkout master`。尽管始终鼓励测试,但 master 分支可能包含既不稳定又与发布版软件不兼容的更新。
* 生成的可执行文件可以在 `build/release/bin` 中找到
* 将 `PATH="$PATH:$HOME/monero/build/release/bin"` 添加到 `.profile`
* 使用 `monerod --detach` 运行 Monero
* **可选**:构建并运行测试套件以验证二进制文件:
make release-test
*注意*:`core_tests` 测试可能需要几个小时才能完成。
* **可选**:构建适合调试的二进制文件:
make debug
* **可选**:在 `doc/html` 中构建文档(如果未安装 `graphviz`,请省略 `HAVE_DOT=YES`):
HAVE_DOT=YES doxygen Doxyfile
* **可选**:使用 ccache 以避免重新构建没有实际更改的翻译单元。Monero 的 CMakeLists.txt 文件会自动处理它
sudo apt install ccache
#### 在 Raspberry Pi 上
已在树莓派 5B 上使用从 https://www.raspberrypi.com/software/operating-systems/ 下载的 Raspberry Pi OS (64位) 和 Debian 12 的全新安装进行了测试。
* `apt-get update && apt-get upgrade` 以安装最新软件
* 从上表的“Debian”列中安装 Monero 的依赖项。
* **可选**:增加系统交换空间大小:
sudo /etc/init.d/dphys-swapfile stop
sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=2048
sudo /etc/init.d/dphys-swapfile start
* 如果使用没有外部电源的外部硬盘,请确保其获得足够的电源,以避免在同步时出现硬件问题,方法是将“max_usb_current=1”添加到 /boot/config.txt 中
* 克隆 Monero 并检出最新的发布版本:
git clone --recursive https://github.com/monero-project/monero.git
cd monero
git checkout v0.18.4.1
* 构建:
USE_SINGLE_BUILDDIR=1 make release
* 等待几个小时
* 生成的可执行文件可以在 `build/release/bin` 中找到
* 将 `export PATH="$PATH:$HOME/monero/build/release/bin"` 添加到 `$HOME/.profile`
* 运行 `source $HOME/.profile`
* 使用 `monerod --detach` 运行 Monero
* 您可能希望在构建完成后减小交换文件的大小,并从您的主目录中删除 boost 目录
#### 在 Windows 上:
Windows 的二进制文件可以在 Windows 上使用 [MSYS2 环境](https://www.msys2.org) 中的 MinGW 工具链构建。
MSYS2 环境模拟 POSIX 系统。工具链在该环境中运行,并*交叉编译*可以在该环境之外作为常规 Windows 应用程序运行的二进制文件。
**准备构建环境**
* 下载并安装 [MSYS2 安装程序](https://www.msys2.org)。安装 MSYS2 需要 64 位的 Windows 10 或更高版本。
* 通过 `MSYS2 MSYS` 快捷方式打开 MSYS shell
* 使用 pacman 更新软件包:
pacman -Syu
* 安装依赖项:
pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi mingw-w64-x86_64-unbound
* 通过 `MSYS2 MINGW64` 快捷方式打开 MingW shell。
**克隆**
* 要进行 git clone,请运行:
git clone --recursive https://github.com/monero-project/monero.git
**构建**
* 切换到克隆的目录,运行:
cd monero
* 如果您想要特定的[版本/标签](https://github.com/monero-project/monero/tags),请对该版本执行 git checkout。例如 'v0.18.4.1'。如果您不关心版本,只想要来自 master 的二进制文件,请跳过此步骤:
git checkout v0.18.4.1
* 要构建 Monero,请运行:
make release-static -j $(nproc)
生成的可执行文件可以在 `build/release/bin` 中找到
* **可选**:要构建适合调试的 Windows 二进制文件,请运行:
make debug -j $(nproc)
生成的可执行文件可以在 `build/debug/bin` 中找到
### 在 FreeBSD 上:
可以通过遵循上述 Linux 的说明从头开始构建该项目(但使用 `gmake` 代替 `make`)。
如果您在 jail 中运行 Monero,您需要将 `sysvsem="new"` 添加到您的 jail 配置中,否则 lmdb 将抛出错误消息:`Failed to open lmdb environment: Function not implemented`。
Monero 也可以作为端口或包提供,名称为 `monero-cli`。
### 在 OpenBSD 上:
您需要在系统中添加一些软件包。`pkg_add cmake gmake zeromq libiconv boost libunbound`。
`doxygen` 和 `graphviz` 包是可选的,并且需要 xbase 集。
运行测试套件还需要 `py3-requests` 包。
构建 monero:`gmake`
注意:作为普通用户编译最新版本的 Monero 时,您可能会遇到以下错误:
```
LLVM ERROR: out of memory
c++: error: unable to execute command: Abort trap (core dumped)
```
然后您需要将数据 ulimit 大小增加到 2GB 并重试:`ulimit -d 2000000`
### 在 NetBSD 上:
检查依赖项是否存在:`pkg_info -c libexecinfo boost-headers boost-libs protobuf readline libusb1 zeromq git-base pkgconf gmake cmake | more`,并使用 `pkg_add` 或从您的 pkgsrc 树中安装任何报告缺失的软件包。Readline 是可选的,但值得拥有。
第三方依赖项通常位于 `/usr/pkg/` 下,但如果您有自定义设置,请相应地调整“/usr/pkg”(如下所示)。
递归克隆 monero 仓库并如上所述检出最新发布版。然后构建 monero:`gmake BOOST_ROOT=/usr/pkg LDFLAGS="-Wl,-R/usr/pkg/lib" release`。生成的可执行文件可以在 `build/NetBSD/[Release version]/Release/bin/` 中找到。
### 在 Solaris 上:
不能使用默认的 Solaris 链接,您必须安装 GNU ld,然后使用指向您的 GNU ld 副本的路径手动运行 cmake:
```
mkdir -p build/release
cd build/release
cmake -DCMAKE_LINKER=/path/to/ld -D CMAKE_BUILD_TYPE=Release ../..
cd ../..
```
然后您可以像往常一样运行 make。
### 交叉编译
您也可以使用 `depends` 系统在 Linux 上为 Windows 和 macOS 交叉编译静态二进制文件。
* ```make depends target=x86_64-linux-gnu``` 用于 64 位 linux 二进制文件。
* ```make depends target=x86_64-w64-mingw32``` 用于 64 位 windows 二进制文件。
* 需要:`g++-mingw-w64-x86-64`
* 您还需要运行:
update-alternatives --set x86_64-w64-mingw32-g++ $(which x86_64-w64-mingw32-g++-posix) && \
update-alternatives --set x86_64-w64-mingw32-gcc $(which x86_64-w64-mingw32-gcc-posix)
* ```make depends target=x86_64-apple-darwin``` 用于 Intel macOS 二进制文件。
* 需要:`clang-18 lld-18`
* ```make depends target=arm64-apple-darwin``` 用于 Apple Silicon macOS 二进制文件。
* 需要:`clang-18 lld-18`
* 您还需要运行:
export PATH="/usr/lib/llvm-18/bin/:$PATH"
* ```make depends target=i686-linux-gnu``` 用于 32 位 linux 二进制文件。
* 需要:`g++-multilib bc`
* ```make depends target=i686-w64-mingw32``` 用于 32 位 windows 二进制文件。
* 需要:`python3 g++-mingw-w64-i686`
* ```make depends target=arm-linux-gnueabihf``` 用于 armv7 二进制文件。
* 需要:`g++-arm-linux-gnueabihf`
* ```make depends target=aarch64-linux-gnu``` 用于 armv8 二进制文件。
* 需要:`g++-aarch64-linux-gnu`
* ```make depends target=riscv64-linux-gnu``` 用于 RISC V 64 位二进制文件。
* 需要:`g++-riscv64-linux-gnu`
* ```make depends target=x86_64-unknown-freebsd``` 用于 freebsd 二进制文件。
* 需要:`clang-8`
* ```make depends target=arm-linux-android``` 用于 32 位 android 二进制文件
* ```make depends target=aarch64-linux-android``` 用于 64 位 android 二进制文件
所需的软件包是每个工具链在 apt 上的名称。根据您的发行版,它们可能有不同的名称。`depends` 系统已在 Ubuntu 18.04 和 20.04 上进行了测试。
使用 `depends` 在 Windows 上编译 Monero 也可能比使用 MSYS 更容易。使用发行版(例如 Ubuntu)激活适用于 Linux 的 Windows 子系统 (WSL),安装 apt build-essentials 并按照上述描述的 `depends` 步骤操作。
生成的二进制文件仍然动态链接 libc。如果二进制文件是在当前发行版上编译的,它可能无法在安装了较旧 libc 的较旧发行版上运行。
### Trezor 硬件钱包支持
如果您在构建带有 Trezor 支持的 Monero 时遇到问题,可以通过设置 `USE_DEVICE_TREZOR=OFF` 来禁用它,例如,
```
USE_DEVICE_TREZOR=OFF make release
```
有关更多信息,请查看 Trezor [src/device_trezor/README.md](src/device_trezor/README.md)。
### Guix 构建
参见 [contrib/guix/README.md](contrib/guix/README.md)。
## 从包管理器安装 Monero
**免责声明:这些软件包不是本仓库的一部分,也不是由本项目的贡献者维护的,因此,不会经过相同的审查过程以确保其可信度和安全性。**
适用于以下系统的软件包
* Debian 12 (Bookworm) 或更高版本
sudo apt install monero
在 [Debian 包追踪器](https://tracker.debian.org/pkg/monero) 中有更多信息和版本。
* Arch Linux:
sudo pacman -S monero
* NixOS:
nix-shell -p monero-cli
* Guix:
guix package -i monero
* Gentoo [Monero overlay](https://github.com/gentoo-monero/gentoo-monero)
emerge --noreplace eselect-repository
eselect repository enable monero
emaint sync -r monero
echo '*/*::monero ~amd64' >> /etc/portage/package.accept_keywords
emerge net-p2p/monero
* Alpine Linux:
apk add monero
* macOS [(homebrew)](https://brew.sh/)
brew install monero
* Docker
# 使用所有可用核心构建
docker build -t monero .
# 或者使用特定数量的核心构建(降低内存需求)
docker build --build-arg NPROC=1 -t monero .
# 在前台运行
docker run -it -v /monero/chain:/home/monero/.bitmonero -v /monero/wallet:/wallet -p 18080:18080 monero
# 或者在后台运行
docker run -it -d -v /monero/chain:/home/monero/.bitmonero -v /monero/wallet:/wallet -p 18080:18080 monero
* 构建需要 3 GB 空间。
* 等待一小时或更长时间
为您喜欢的发行版打包将是一个受欢迎的贡献!
## 运行 monerod
构建将二进制文件放置在调用 cmake 的构建目录(默认为仓库根目录)内的 `bin/` 子目录中。要在前台运行:
```
./bin/monerod
```
要列出所有可用选项,请运行 `./bin/monerod --help`。选项可以在命令行上指定,也可以在由 `--config-file` 参数传递的配置文件中指定。要在配置文件中指定选项,请添加一行语法为 `argumentname=value` 的内容,其中 `argumentname` 是不带前导破折号的参数名称,例如,`log-level=1`。
要在后台运行:
```
./bin/monerod --log-file monerod.log --detach
```
要作为 systemd 服务运行,请将
[monerod.service](utils/systemd/monerod.service) 复制到 `/etc/systemd/system/` 并将
[monerod.conf](utils/conf/monerod.conf) 复制到 `/etc/`。[示例
服务](utils/systemd/monerod.service) 假定用户 `monero` 存在,并且其主目录是[示例
配置](utils/conf/monerod.conf)中指定的数据目录。
如果您使用的是 Mac,在刷新时遇到崩溃,您可能需要将 `--max-concurrency 1` 选项添加到 monero-wallet-cli,可能还需要添加到 monerod。
## 国际化
参见 [README.i18n.md](docs/README.i18n.md)。
## 使用 Tor
虽然 Monero 并非为与 Tor 集成而设计,但可以通过设置以下配置参数和环境变量,与 torsocks 一起封装使用:
* 在命令行使用 `--p2p-bind-ip 127.0.0.1` 或在 monerod.conf 中使用 `p2p-bind-ip=127.0.0.1`,以禁止监听外部接口上的连接。
* 如果您通过环回 IP(例如,127.0.0.1:9050)将钱包与 Tor 守护进程一起使用,除非它是您自己的隐藏服务,否则请使用 `--untrusted-daemon`。
通过 Tor 启动 monerod 的示例命令行:
```
monerod --proxy 127.0.0.1:9050 --p2p-bind-ip 127.0.0.1
```
contrib/tor/monero-over-tor.sh 中有一个辅助脚本。它假定已经安装了 Tor,并以正确的配置运行 Tor 和 Monero。
### 在 Tails 上使用 Tor
TAILS 附带了一套非常严格的防火墙规则。因此,除了告诉 torsocks 允许入站连接之外,您还需要添加一条规则来允许此连接。完整示例:
```
sudo iptables -I OUTPUT 2 -p tcp -d 127.0.0.1 -m tcp --dport 18081 -j ACCEPT
DNS_PUBLIC=tcp torsocks ./monerod --p2p-bind-ip 127.0.0.1 --rpc-bind-ip 127.0.0.1 \
--data-dir /home/amnesia/Persistent/your/directory/to/the/blockchain
```
## 修剪
截至 2022 年 4 月,完整的 Monero 区块链文件大约为 130 GB。可以存储一个修剪后的区块链,大小约为 45 GB。
修剪后的区块链只能将部分历史链数据提供给其他节点,但在功能上与完整区块链完全相同。
要使用修剪后的区块链,最好使用 `--prune-blockchain` 开始初始同步。但是,也可以使用 `monero-blockchain-prune` 工具或在现有链上使用带 `--prune-blockchain` 选项的 `monerod` 来修剪现有的区块链。如果存在现有链,修剪将暂时需要磁盘空间来存储完整和修剪后的区块链。
有关更详细的信息,请参阅 [Moneropedia 中的“修剪”条目](https://www.getmonero.org/resources/moneropedia/pruning.html)
## 调试
本节包含有关调试失败的安装或 Monero 遇到的问题的一般说明。首先,确保您运行的是从 GitHub 仓库构建的最新版本。
### 在 Unix 系统上获取堆栈跟踪和核心转储
我们通常使用 `gdb`(GNU 调试器)工具来提供堆栈跟踪功能,并使用 `ulimit` 在发生崩溃或段错误的构建中提供核心转储。
* 要使用 `gdb` 获取已停止响应的构建的堆栈跟踪:
运行构建。
一旦停止,输入以下命令:
```
gdb /path/to/monerod `pidof monerod`
```
在 gdb 中输入 `thread apply all bt` 以获取堆栈跟踪
* 但是,如果发生核心转储或段错误:
在命令行中输入 `ulimit -c unlimited` 以启用核心转储的无限文件大小
输入 `echo core | sudo tee /proc/sys/kernel/core_pattern` 以防止核心被其他工具劫持
运行构建。
当它终止并输出类似“Segmentation fault (core dumped)”时,在同一目录中应该有一个与 monerod 相同的核心转储文件。它可能仅命名为 `core`,或附加了数字的 `core.xxxx`。
您现在可以使用 `gdb` 分析此核心转储,如下所示:
```
gdb /path/to/monerod /path/to/dumpfile`
```
使用 `bt` 打印堆栈跟踪
* 如果程序崩溃并且核心转储由 systemd 管理,以下命令也可以获取该崩溃的堆栈跟踪:
```
coredumpctl -1 gdb
```
#### 在 gdb 中运行 Monero:
输入 `gdb /path/to/monerod`
使用 `--args` 后跟相关参数传递命令行选项
输入 `run` 以运行 monerod
### 分析内存损坏
有两个可用的工具:
#### ASAN
使用 -D SANITIZE=ON cmake 标志配置 Monero,例如:
```
cd build/debug && cmake -D SANITIZE=ON -D CMAKE_BUILD_TYPE=Debug ../..
```
然后您可以正常运行 monero 工具。性能通常会减半。
#### valgrind
安装 valgrind 并运行 `valgrind /path/to/monerod`。它将非常慢。
### LMDB
根据 @HYC 的调试可疑区块链损坏的说明
在 LMDB 源代码中有一个 `mdb_stat` 命令,可以打印有关数据库的统计信息,但它不是常规构建的。可以使用以下命令构建它:
```
cd ~/monero/external/db_drivers/liblmdb && make
```
`mdb_stat -ea ` 的输出将指示 blocks、block_heights 和 block_info 表中的不一致之处。
`mdb_dump -s blocks ` 和 `mdb_dump -s block_info ` 的输出有助于指示 blocks 和 block_info 是否包含相同的密钥。
这些记录以十六进制数据的形式转储,其中第一行是密钥,第二行是数据。
# 已知问题
## 协议
### 基于套接字
由于驱动 monero 的基于套接字的协议的性质,目前某些协议弱点在某种程度上是不可避免的。虽然理论上可以完全缓解这些弱点,但所需的努力(手段)可能得不偿失。因此,如果您是 monero 节点运营商,请考虑采取以下预防措施:
- 在“安全”的机器上运行 `monerod`。如果操作安全不是您的强项,至少要有一台专用计算机运行 `monerod`,并且**不要**在您的 `monerod` 机器上浏览网页、使用电子邮件客户端或使用任何其他潜在有害的应用程序。**不要在同一台机器上点击链接或加载 URL/MUA 内容**。这样做可能会潜在地利用接受“localhost”和“127.0.0.1”的命令中的弱点。
- 如果您计划托管公共的“远程”节点,请使用 `--restricted-rpc` 启动 `monerod`。这是必须的。
### 基于区块链
如果使用得当,某些区块链“功能”可能会被视为“错误”。因此,请考虑以下几点:
- 接收 monero 时,请注意,如果发送方选择锁定,它可能会被锁定任意时间,从而阻止您花费该 monero,直到锁定时间到期。您可能希望暂缓处理此类交易,直到解锁时间过去。要了解该时间,您可以将 `show_transfers` 命令中看到的剩余出块时间视为解锁前的等待时间。
标签:Bash脚本, C++, CryptoNote协议, Tor集成, Web3, 不可追踪, 加密货币, 区块链, 匿名交易, 去中心化金融, 安全测试工具, 密码学, 手动系统调用, 数字货币, 数据擦除, 暗网货币, 点对点网络, 环形签名, 网络安全, 网络安全, 门罗币, 隐私保护, 隐私保护, 隐私币, 隐蔽地址