LibertyNet 是什么
整个模型,一页说完,用大白话,按能听懂的顺序。
LibertyNet 是一个由独立运营的计算机组成的网络。它们能互相找到对方、能证明自己是谁, 而这中间不需要一家公司来决定谁有资格参与。
这就是全部想法。下面都是细节。
它想解决的问题
通常,互联网上两台机器想互相信任时,得去问第三方。证书机构为域名背书,API 网关检查 自己签发的 Key,平台决定谁能拥有账号。
这能用,同时也意味着第三方可以决定不喜欢你。它是一个单点许可——而当它被攻破时, 它就是一个单点伪造。
LibertyNet 通过让身份自证,把这个中间方从身份问题里彻底移除。
想法一:身份由密钥推导而来
一个 LibertyNet 身份长这样:
did:svrp:n:268d4fe0它不是发给某人的账号,而是公钥的指纹——SHA-256(公钥) 的前 4 字节,十六进制。
也就是说:给你一个公钥和一个声称的身份,任何人都能自己核对,离线,只需要一个哈希函数。
sha256(publicKey).slice(0, 8) === "268d4fe0" // → 这个声称成立不查目录。不问机构。不发网络请求。整个验证都在本地完成了。
由此推出的铁律
签名有效 ≠ 身份有效。
如果有人给你一个公钥、一段消息和一个签名,验证这个签名只能证明一件事:持有那个私钥的人 签了那条消息。它完全没有说明那个密钥是否属于对方声称的那个身份。
所以整个系统里,顺序是固定的:
- 先验 id-binding——声称的身份是否由这个公钥推导而来?不是就拒绝,不要进入第 2 步。
- 再验签名(对规范字节)。
- 再验其余所有规则——有效期、DID 状态、防重放、权限范围。任何一条不过就拒绝。
- 全部通过后才接受。
跳过第 1 步不是抄近路,是验证绕过:你只确认了"某个密钥"签了东西,然后却把它当成 "正确的那个密钥"来信任。SDK 替你做第 1 步,且不提供关闭的开关。
为什么第 1 步不能省
假设攻击者想冒充 did:svrp:n:268d4fe0。
他拿不出那个节点私钥的签名——私钥不在他手上。但他可以自己生成一对密钥, 用它签任何东西,然后发给你:
{
"claimed_identity": "did:svrp:n:268d4fe0",
"public_key": "<攻击者自己的公钥>",
"signature": "<一个完全有效的、由攻击者密钥产生的签名>"
}如果你拿他给的公钥去验签,验证会通过。签名是真的,只不过是他的真签名。
第 1 步正是抓住这一点的地方:SHA-256(攻击者公钥)[0:4] 不等于 268d4fe0, 所以身份声称在签名被考虑之前就失败了。
想法二:节点自己公告,没人审批
节点告诉注册表自己存在:这是我的身份、地址、以及我能做什么。
注册表是目录,不是守门人。它不决定谁可以加入。读取它不需要 Key 也不需要账号—— 这就是快速开始里没有注册步骤的原因。
既然任何人都能注册,你就应该假设有些记录是错的甚至是恶意的。这没问题,而且这正是想法一 存在的意义:你自己验证每一条记录,伪造的记录败在算术上,而不是败在政策上。
status: "active" 不等于在线。
一个上周就拔了电的节点,这个字段永远还是 "active"。唯一会过期的字段是 last_seen。 这是新手最常犯的第一个错误。
想法三:节点可以被运营者收养,且带限额
节点是机器。运营者是为它负责的人。
把两者绑定是一个四签名握手,有意思的地方在于双方都必须同意——运营者不能单方面认领 一个节点,节点也不能贴到一个没有点头的运营者身上。
其中一个细节:你的根密钥只签一次一份凭证,然后就回到保险箱里;日常操作全部由 设备密钥完成。笔记本被偷,代价是一台设备,不是你的身份。
想法四:贡献会被度量,但还没有支付
Credits 是测试单位。 不是现金,不可兑换,不代表对未来价值的任何主张。
而且现在它根本还没在计数:credits 端点在线并返回 200,但背后没有接账本。 它返回零,并如实标注 "source": "not_yet_wired"——意思是"没有东西在度量", 而不是"你没赚到"。 尚未接通
LibertyNet 刻意不是什么
这套 API 里没有任何一个端点会转移价值。没有钱包,没有 swap,没有质押,没有代币转账, 没有交易。这是范围决策,文档不会暗示相反的意思。完整清单见能力状态。
身份 — 两种 DID 编码、为什么字符串比较会骗你、以及那个不能重排的验证顺序。