Elea Notes.

词条 · 加密与分布式 · 核心

节点

网络里存账、验账、转发的机器,分自己全验和只验头两种

也称:节点、全节点、轻节点、轻钱包、node、full node、light node、SPV、SPV client

一句话

节点是网络里参与存储、验证、转发账本的一台机器。全节点自己验证每一笔交易,什么都不信;轻节点只保存区块头,把”交易是否合法”这件事托付给了算力。两者的差别不在性能,在信任谁

先看这个分层为什么躲不开。

先看一个麻烦:你手机装不下这本账

你想收一笔钱,想确认它真的到账了。

彻底的办法是自己把整本账从第一页读到最后一页,逐笔核对:这笔钱的上一手是谁、上一手的上一手是谁,一路追到源头,确认它没有被花过两次。

问题是这本账很大。按目前约 90 万个块、平均每块一两 MB 估算,全量数据在 1 TB 上下的量级。你的手机装不下,用流量下载也不现实。

于是出现一个两难:要么读完全部才敢信,要么什么都不读只能听人说。 中间似乎没有别的选项。

朴素尝试为什么都不够

招数一:问一个人,让他告诉你到账了没。 最省事,也最脆弱。他可以直接骗你。更要紧的是,你没有任何办法检查他的回答——你手上没有可以对照的东西,所以他的话既不能被证实也不能被证伪。

招数二:问一百个人,取多数。 比一个人强,但这仍然是招数二式的按人头计票,而人头在开放网络里可以伪造:攻击者只要给你连上一百个他自己控制的节点,“多数”就是他说的。多数只在身份稀缺时才有意义,这一点在最长链规则里已经吃过一次亏。

招数三:只下载和自己有关的那几笔交易。 听起来很聪明,但你没法判断一笔交易是否有效——有效性取决于它花的那笔钱有没有在别处被花掉,而”别处”你没下载。双花的证据永远在你没看的那部分数据里。

招数四:下载全部交易但跳过验证,只看它在不在链上。 那你就得先知道哪条链是对的,而这又需要验证。跳过验证的”在链上”是一句空话。

招数五:只下载区块头 头很小——90 万个头 × 80 字节 = 72,000,000 字节,约 72 MB,手机完全放得下。而且头里带着工作量证明,你能自己检查每个头是否达标、是否咬住前一个,所以你能独立判断哪条链累积工作量最大。但光有头不够:头里只有一个 Merkle 根,看不到你的交易在不在里面。

五次失败凑出三条要求。一个装得下的方案必须:

  1. 数据量与账本总长无关或只随长度线性增长一点——否则手机永远追不上;
  2. 链的选择必须自己算,不能问人,否则退回招数一;
  3. 需要一个”某笔交易在某个块里”的短证明,短到几百字节。

前两条招数五已经做到了。差的是第三条,而这件工具已经有了:Merkle 树可以只证明一条。

机制:两种节点,各自验什么

全节点下载并检查每一个块里的每一笔交易:签名对不对、这笔钱是否存在、是否已被花掉、工作量证明是否达标、难度是否按规则计算。它自己维护一份完整的未花费金额集合,因此不需要相信任何人。代价是磁盘、带宽和初次同步的时间。

轻节点(白皮书第 8 节的 simplified payment verification)只做两件事:

1. 保存全部区块头(72 MB 量级),自己检查每个头的工作量证明和链接关系
2. 要确认某笔交易时,向网络索取它到 Merkle 根的那条路径,自己往上算

算一下第 2 步的开销。假设一个块有 2048 笔交易,路径长度是 log₂(2048) = 11 个哈希

11 × 32 字节 = 352 字节
再加上那个 80 字节的区块头 = 432 字节

四百多字节,就能确认”这笔交易被打包进了这个块”。对比全量下载的 1 TB 量级,这是压倒性的差距。这也回头解释了区块那一条里为什么要强调头是定长的 80 字节:定长的头 + 对数长度的路径,是轻节点能存在的全部原因。

看清两者的分界线:

              全节点                    轻节点
交易有效性     自己验证                  不验证 ← 关键差别
工作量证明     自己验证                  自己验证
链的选择       自己算累积工作量           自己算累积工作量
存储           全量(TB 量级)           仅头(几十 MB)
它信任什么     不信任任何人               信任"多数算力在诚实链上"

轻节点验证的是**“这笔交易被埋在一条花了很多电的链里”**,不是”这笔交易合法”。这两句话之间的缝隙,就是它交出去的那部分信任。缝隙不大,但真实存在:如果攻击者掌握了多数算力,他能造出一条工作量最大、却包含无效交易的链,轻节点会接受,全节点会拒绝。

回头看:Merkle 树的”只证明一条”在这里兑现了

Merkle 树那一条讲过一个性质:证明某笔交易在某个块里,只需要 log₂(n) 个兄弟指纹,不需要全部交易。

当时这只是一个数学上的好性质。这里它变成了架构上的分层:正因为存在”极短的存在性证明”,账本才能分成”全验”和”只验头”两档,而不是只有”全下载”或”听人说”两个极端。 招数一到招数四之所以全部失败,就是因为它们都假设中间没有档位。

另外,最长链规则在这里有个容易被忽略的推论:链的选择规则对两种节点是同一条。轻节点虽然不验交易,但它自己算累积工作量、自己判断哪条链胜出,这一部分它并不外包。所以它不是”信任某个服务器”,而是”信任多数算力”——招数二的按人头计票被换成了按算力计票,这才是它和”问一百个人”的本质区别。

白皮书对这个缝隙有个务实的补充:收款方如果在意,可以在收到大额付款时拉取完整区块自行校验,或者干脆跑全节点。分层不是强制的,是可选的。

边界与常见误解

节点不等于矿工。 绝大多数全节点不挖矿:它们验证、存储、转发,但不制造新块。挖矿是往链上追加,验证是检查追加物。两个角色常在同一台机器上,但职责独立。说”节点越多算力越高”是把两件事混了。

轻节点不是”更快的全节点”。 它省下的不是时间,是验证。省掉的那部分被替换成一个假设:多数算力是诚实的。这是安全模型的差别,不是优化。

跑全节点没有收益,但它决定规则。 全节点不拿奖励。它的作用是拒绝不合规的块——矿工造出违反规则的块,全节点不接受,那个块就没有价值。规则的执行权在验证方,不在生产方,这是理解协议升级之争的关键。

72 MB 是头的总量,不是轻钱包的实际占用。 真实的轻钱包还要存自己的交易、Merkle 路径、地址索引等。而且许多手机钱包其实连头都不同步,直接查询服务商的接口——那已经退回到招数一,安全模型比 SPV 更弱。市面上叫”轻钱包”的东西不都是 SPV。

索取 Merkle 路径会暴露隐私。 你向别人询问”这笔交易在不在”,等于告诉对方你关心哪些地址。轻节点在带宽上省下的东西,一部分是用隐私换的。