安装
把文件弄到一台机器上,并知道自己拿到的是什么。真正运行一个节点是运行节点;本页讲的是安装。
Zycord 由两个命令行程序和一个桌面应用组成:
| 名称 | 它是什么 |
|---|---|
zcd | 命令行工具:密钥、钱包、创世区块、黄金向量,以及 zcd ui。 |
zycordd | 节点:负责验证、挖矿、为对等节点提供服务,并响应一个只读的 RPC。 |
| Zycord 钱包 | 围绕 zcd ui 所提供的同一个钱包界面的一个桌面窗口。 |
第一个打了标签的发布版本尚未发布,所以从源代码构建目前 是唯一的入口,而下面那一节就是该读的那一节。再往下描述的包管理器路线和 发布归档,是这个项目一旦开始打标签之后的发布形态; 它们写在这里,是因为那些清单文件已经在仓库里、现在就可供审阅, 而不是因为已经有什么可下载了。 发布页面就是它们将要出现的地方。
从源代码构建#
Go 版本是 go1.26.2,而它是源代码的一部分。两个 Go
发布版本会把同一个包编译成不同的机器码,所以一个二进制文件既是某个仓库的产出,
也同样是某个编译器的产出 — 用另一个 Go 重建,从同一棵完全相同的代码树得到的是另一个文件。
因此 make build 把它钉死(在 Makefile 里写着 GOTOOLCHAIN=go1.26.2),
并在其他任何版本下拒绝构建,而不是
递给你一个哈希对不上、又说不出为什么的二进制文件。
git clone https://gitlab.com/zycord-group/zycord-node.git
cd zycord-node
make build
如果你没有 go1.26.2,你不必自己去找它:这个钉定会让
go 命令在首次使用时取回那个确切的工具链,并对照 Go 自己的
校验和数据库进行核对。这是整个构建过程中唯一会碰网络的东西。
哪个二进制文件能加入网络#
这是本页最重要的一段。RandomX 是在一个构建标签之后编译的,所以 存在两种构建,而其中只有一种能与 RandomX 网络对话 — 那既包括 mainnet,也包括公共 testnet。
# Default: no cgo, no C toolchain, development engine only.
# Byte-for-byte reproducible. Runs a local devnet and nothing else.
make build # -> bin/zcd, bin/zycordd
# The network binary. cgo, so not reproducible.
make build-randomx # -> bin/zcd-randomx, bin/zycordd-randomx
这两种构建刻意写出不同的文件。它们过去会写同样的
两个路径,于是后运行的那个会替换掉前一个,而名字对里面是哪个引擎只字未提。
在网络是 RandomX 的地方运行 zcd-randomx,在不是的地方运行 zcd;
两个都构建之后,两个都在。
一个不带该标签构建出的二进制文件,在一个它无法计算其 pow_engine 的网络上会
拒绝启动。那次拒绝正是重点:由于除了开发用引擎之外没有别的引擎可以
回退,这样一个节点会把单次 BLAKE3 运算当作它见过的每一个区块头的工作量证明来接受 —
每一次伪造都有效,每一个分叉都毫无分量,而且日志里什么也没有。
反过来则不对称:带标签的二进制文件同时携带两个引擎,也能正确地运行一个 devnet。
问一问某个二进制文件,你手上拿的是哪一个:
zcd version
go install 这条路而这并不是疏忽。go install 是通过模块代理来解析模块
路径的,而根模块的名字是 zycord — 没有主机名,路径第一段里没有
点号,而工具链会直接拒绝这种名字。这个名字是刻意的:go.mod 不声称
任何主机,因为主机是一个身份暴露面。上面那个克隆就是 Go 工具链的路线,而且
它本来就是更强的那条 — 你构建的是你自己检出的那个标签,而不是某个代理递给你的东西。
两个层级的保证,明说而非暗示#
一旦有了发布版本,就会有两组归档,而它们是互不相交的两组 。这就是在决定拿哪一组之前要读的那张表。
| 产物 | 可复现? | 能加入 mainnet? | 为什么 |
|---|---|---|---|
zcd、zycordd — 用 make build 从源代码构建 | 可以,逐字节相同 | 不能 | 纯 Go,CGO_ENABLED=0,-trimpath,没有 build id — 因而也没有 RandomX 引擎。不再作为下载提供;发布 SHA256SUMS.binaries 是为了让你可以自己构建并比对。 |
zcd、zycordd — -randomx 归档 | 不可以 | 能 | cgo:RandomX 是 C++ 写的,所以一套系统 C 工具链最终会进到产物里 |
| Zycord 钱包,Linux 和 macOS | 不可以 | 不适用 | cgo:一套系统 C 工具链和一个平台 SDK 最终会进到产物里 |
| Zycord 钱包,Windows | 可以,逐字节相同 | 不适用 | 没有 cgo:Wails 通过纯 Go 访问 WebView2 |
发布版本只提供 -randomx 归档 — 一个
发出一份加入不了网络的归档的发布版本,就是一个发出脚枪的发布版本。它们的校验和由
SHA256SUMS.randomx 提供,并且刻意不出现在
SHA256SUMS.binaries 里,因为 cgo 构建是没人能逐字节重建的那种。
SHA256SUMS.binaries 列出的是你自己做的构建应该哈希成什么。把这一点说出来的意义在于,这是你的决定,
而不是一个替你做出的假设。
为什么你的操作系统会警告你,以及为什么这里没有证书#
一个未签名的可执行文件会在 Windows 上被 SmartScreen 拦下,在 macOS 上被 Gatekeeper 拦下。 通常的解法是一份代码签名证书。而这个解法在这里是不可用的,这出于构造, 而非出于预算,其中的道理值得在你安装任何东西之前先弄明白 — 一个知道警告为何出现的用户,要难骗得多,很难被一个假冒的安装程序钓上。
一份 Authenticode 证书,是一家证书颁发机构对一个已核实的法律 身份所作的背书。那就是它的全部功能;没有哪个版本的它可以不含一个法定姓名。 Apple Developer ID 是同一个问题,只是换了个供应商。Zycord 是以 笔名发布的,而买一份证书会当场把这一点毁掉。
所以笔名被保留了下来。这不是信任叙事上的一个窟窿;它选择了另一套叙事, 而对这个项目来说,是更强的一套:
证书所主张的是“这个东西来自实体 X。”
可复现构建所主张的是“这个东西来自这份源代码,而且任何人都能核查。”
对一个匿名的网络来说,第二条才是站得住的论证,而且它不是一句口号:CI
在每一次推送到 main 以及每一个标签上都会把 zcd 重建两次,只要
两个二进制文件相差一个字节就判定失败。你不必信任构建了你所下载那个二进制文件的人。
你可以自己构建它并比对哈希 — 而如果它们一致,是谁构建了它这个问题
就不再要紧。那套流程就是验证下载。
包管理器#
这个项目没有去和 SmartScreen 与 Gatekeeper 硬碰,而是走它们留着的那扇 门。包管理器是从一个 URL 和一个哈希来安装的,不要求签名,两种 警告都不会触发。那些清单文件在仓库里 (packaging/),现在就可供审阅;提供 它们的那些 tap 会随第一个发布版本一同发布。
Windows — Scoop#
Scoop 不会剥掉网络来源标记;那个标记压根就没有被附上过。
网络来源标记是由浏览器以及 Windows 的附件执行 shell
API 施加的,而不是由裸的 HTTP 客户端施加的,而 Scoop 是通过 [Net.HttpWebRequest] 或
aria2 下载的。SmartScreen 的应用信誉检查,是在从资源管理器启动带标记的文件时触发的;一个
从未被打上标记、又是通过一个垫片从终端启动的文件,根本就到不了那条路径。清单文件钉死了
发布 URL 和 SHA-256,所以 Scoop 会在安装之前先验证下载内容。
Scoop 装的东西运行的是 --devnet,并且会拒绝 mainnet 和公共
testnet — 请看上面那张两层级的表。要在 Windows 上加入一个网络,请从
下载页面取用适合 x86-64 的 -randomx zip;Windows on
ARM 没有这样的构建,只能跑 devnet。zcd version 会打印出该二进制文件
携带的是哪个引擎。
不用 Scoop 的 Windows
提供便携式 zip 是刻意的:没有 .exe 安装程序,也没有
MSI,因为一个未签名的安装程序恰恰会触发最糟糕的那条 SmartScreen 路径 —
那个全屏的“Windows 已保护你的电脑”拦截页。解压出来的文件从终端运行则不会遇到
它。桌面钱包需要 WebView2 运行时,它在 Windows 11 和
当前的 Windows 10 上是预装的;如果它缺失,窗口就打不开,而在浏览器里用 zcd ui
是绕开它的办法。
macOS — Homebrew#
这两个包都是 formula,而不是 cask,而这就是全部诀窍:formula 是在你自己的机器上从源代码构建的,所以那个二进制文件不是一个下载来的文件,也没有隔离 属性。Gatekeeper 根本看不到它。这同时也意味着你压根就没有在信任这个项目的构建 — Homebrew 会取回源代码压缩包,核对它的 SHA-256,然后用你自己的 工具链把它编译出来。
这个 formula 构建的是纯 Go 的二进制文件,所以它装出来的东西运行的是 --devnet,
并且会拒绝 mainnet 和公共 testnet。要在 macOS 上加入一个网络,请取用
对应你架构的 -randomx 归档,或者用
make build-randomx 自己构建。
cask 则恰恰相反,而这个项目不提供 cask:一个下载来的、
被隔离的、没有签名的 .app,它只有在让人们关掉一项
安全功能之后才能用。Homebrew 正在刻意关闭那条路 —
--no-quarantine 在 Homebrew 5.x 中已被弃用。
从发布 zip 安装的 macOS
里面那个 .app 是被隔离的,macOS 会拒绝打开它。
若仍要打开它:双击它并关掉那个拒绝提示;前往系统设置 →
隐私 & 安全性,向下滚动到安全性;在“Zycord Wallet 已被
阻止”旁边,点击仍要打开;确认并完成身份验证。
macOS 15(Sequoia)移除了那条捷径。按住 Control 点击不再能越过 Gatekeeper,而系统设置如今是唯一的途径。
命令行压缩包没有这个问题:zcd 和 zycordd 是
从终端运行的,在那里 xattr -d com.apple.quarantine 一条命令就能清掉首次启动检查。
Linux#
没有任何形式的守门人。请先验证校验和与签名 — 见 验证下载 — 然后:
tar xzf zycord-<version>-linux-amd64-randomx.tar.gz
sudo install -m755 zycord-<version>-linux-amd64-randomx/zcd /usr/local/bin/
sudo install -m755 zycord-<version>-linux-amd64-randomx/zycordd /usr/local/bin/
zcd version # must name randomx-v1
那是一个发布版本所提供的唯一一个节点归档;不再有一个普通版本会被
误选。在 Debian 和 Ubuntu 上,.deb 做的不只是搬文件 — 它还会带上一个
systemd 单元和一个非特权账户 — 而这两条路线,连同那个安装脚本,都
列在下载页面上。Linux 上的桌面
钱包以 AppImage 形式发布,因为 libwebkit2gtk 在每个发行版上的
包名都不一样。
在服务器上#
curl | sh把一个未经验证的脚本管道灌进 shell,对于经手金钱的软件来说是错误的姿态, 而且即便那个脚本是本项目自己的,它也仍然是错误的姿态 — 本页的全部论证 就是你本不该必须去信任发布者。packaging/install.sh 会下载,验证校验和与签名,之后才安装。取回 它,读一遍,再运行。
install.sh 安装的是那份有背书的归档 — 也就是纯 Go 的那份
— 因为它那套校验和与签名的核查流程针对的正是这一层级,而一个
验证完签名却去安装别的东西的脚本,不过是在演戏。所以它放进
/usr/local/bin 的那些二进制文件会拒绝 mainnet 和公共 testnet,而脚本会把这一点
作为它打印的最后一件事说出来。若是一台打算加入网络的服务器,请手工解开 -randomx
归档。
要在服务器上使用钱包界面,不要暴露端口。zcd
ui 绑定回环地址,并拒绝其他任何地址;请通过 ssh 转发它。流程在
运行节点之下。
这一切都保护不了你免受什么#
这里把话说明白,因为一个只罗列自身长处的安全页面,是一则广告。
- 一个恶意的仓库。可复现构建能证明一个二进制文件与它的源代码相符。它对源代码本身是否诚实只字未提。请读它 — 并把黄金向量拿来跑一遍你即将信任的那个二进制文件。
- 一个假冒的发布页面。如果有人搭起一个以假乱真的克隆站,而你从不验证签名,那么哈希与那个页面自己的校验和文件对得上,什么也证明不了。项目密钥指纹
E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29才是那个锚点。 - 一台已被攻陷的机器。钱包守不住一台已经失守的主机。
- 一个说谎的节点。
zcd和钱包都不是全节点;它们相信节点告诉它们的东西。这正是为什么钱包会拒绝一个链 id 与你所断言的网络不一致的节点,也是--confirm-rpc存在的原因 — 请看钱包。 - 任何向你出售 ZCD 的人。目前还没有 mainnet 的币。创世还没有发生。