CKBuilder反思:你的以太坊账户并不存在

nervos 发布于 2026-06-02 阅读 67

本文通过对比比特币的UTXO模型和以太坊的账户模型,深入解析了Nervos CKB的Cell模型设计。Cell兼具UTXO的离散状态和可编程性,其Lock Script是基于RISC-V的完整程序,可实现自定义加密验证,无需硬分叉。存储方面采用1 CKB = 1 Byte的容量模型,强制支付存储租金,避免了以太坊状态膨胀问题。作者分享了在CKB本地开发环境中的实践体验,指出Cell模型将所有权定义为程序而非数据库记录,提供了真正的状态并行性和可组合性。

现在打开 MetaMask。看看你的余额。假设它显示 1.4 ETH。

有一个问题大多数人从未问过:这个数字在哪里?

不是哲学意义上的。而是字面意思。这个 1.4 存储在什么地方?哪台计算机保存着它?是谁把它记录下来的?

答案是,没有哪台机器拥有一个叫 your_balance = 1.4 的变量。实际存在的是一个全球性的、行星大小的数据结构,叫做世界状态(World State),一个巨大的键值存储,你的地址映射到一个数字。世界上的每个以太坊节点都持有这个结构的一份副本。当你发送 ETH 时,以太坊虚拟机从你的条目中减去,并加到其他人的条目上。两次对共享数据库的编辑。

它有效。以太坊是一个价值 3000 亿美元的网络,所以它显然有效。

但这也是一种带着非常特定的权衡的设计,当你作为构建者试图变得更加复杂时,这些权衡会变得更痛苦。一旦你清晰地看到这些权衡,你就会开始理解为什么 Nervos CKB 要被设计成现在这样。

cover

CKBuilder 的思考是我 CKBuilders 学习旅程中的一篇现场笔记系列,通过初次使用 CKB 进行构建的视角来翻译 CKB 概念。


天空中的账本

在以太坊之前,有比特币。比特币没有账户。它从来没有。

当你“接收”比特币时,实际发生的是,一笔交易被写入区块链,其输出锁定到你的公钥。那个输出(称为 UTXO,未花费交易输出)就待在那里,在链上,等待。它有一个值:比如 0.5 BTC。它有一个锁定:一个必须被满足的条件,然后才能被任何人花费,通常是对你的密钥进行签名检查。

你在比特币中的“余额”并不是存储在某个地方的数字。它是你的密钥可以解锁的所有 UTXO 的总和。你的钱包扫描区块链,找到每个你可以签名的未花费输出,并将它们加起来。那个总数就是它显示给你的。

这是一种根本不同的模型。你的钱不是账本条目。它是散落在链上的锁盒子的集合。要花费,你不是编辑一个数字。你消耗一个盒子并创建新的盒子。

这就是为什么比特币交易是无状态的且可并行化的。两笔不涉及相同 UTXO 的交易可以由不同的处理器完全独立、同时进行验证。没有共享的可变全局状态需要串行化。

以太坊刻意放弃了这一特性,以换取一个更具表达力的编程模型。你可以写循环,存储任意数据,构建复杂的合约。但所有事情都要通过单一的全局 EVM 顺序执行,而每个状态变更都会进入那个共享的世界状态。

这是经典的权衡:表达力 vs. 并行性。

CKB 审视了这种权衡,并说:如果你不必做出这个选择呢?


Cell 是 UTXO,但进化了

CKB 中的核心数据结构叫做 Cell(细胞)。如果你理解比特币的 UTXO,你已经理解了 Cell 的 80%。

Cell 是区块链上的一个离散状态单元。它包含:

  • Capacity(容量): 它持有的 CKB 数量(以及由此决定它可以在链上占用的字节数)
  • Lock Script(锁定脚本): 必须满足才能花费它的条件,就像比特币的锁定脚本一样
  • Type Script(类型脚本): 一个可选的第二层逻辑,用于管理 Cell 的数据
  • Data(数据): 任意字节,你想存储的任何东西

和比特币的 UTXO 一样,Cell 要么未花费,要么不是。你不会编辑它。当你“更新”一个 Cell 时,你会将它作为交易输入消耗掉,并产生新的 Cell 作为输出。旧 Cell 被销毁。新 Cell 存在。原地不变。

在 CKB 中,你的“余额”和你在比特币中的余额完全一样:它是所有你能满足其 Lock Script 的 Cell 的总和。

但这里 CKB 与比特币的分歧以一种对开发者来说改变一切的方式展开。


Lock Script 是一个程序

在比特币中,锁定脚本是比特币脚本,一种故意受限的、基于栈的语言。它可以检查签名。它可以处理一些多重签名。它不能循环。它被设计成受限的,因为比特币开发者希望防止复杂逻辑创建不可预测的状态或阻塞区块生产。

在 CKB 中,Lock Script 是一个完整的 RISC-V 二进制文件。

RISC-V 是一种硬件指令集,和嵌入式系统以及越来越多的服务器芯片中运行的架构相同。它不是区块链特定的设计。它是一种真实的 CPU 架构。而 CKB-VM 是在节点内部运行的完整 RISC-V 处理器。

这意味着:CKB Cell 上的 Lock Script 可以是你能用 Rust 或 C 编写的任何程序,并编译成 RISC-V。想要一个需要五把钥匙中的三把的多重签名?写一个。一个在区块 1,000,000 后打开的时间锁定保险库?写一个。一个使用 WebAuthn 的基于 Passkey 的身份验证流程?这就是 JoyID 钱包所做的。它只是一个验证 WebAuthn 签名而不是 secp256k1 的 Lock Script。

在以太坊上,如果你想要一种新的签名方案,你需要一个预编译(precompile),一个在协议层面硬编码到 EVM 中的快捷方式,需要一次硬分叉来添加。在 CKB 上,你将 RISC-V 二进制文件作为一个 Cell 部署到链上,然后引用它。没有硬分叉。无需许可。

这就是“自带密码学”在实践中意味着什么。CKB 没有将 secp256k1 硬编码为其签名方案。大多数 CKB 地址使用的标准 Secp256k1Blake160 锁本身也只是存储在一个系统 Cell 中的 RISC-V 程序。你可以编写一个竞争实现,部署它,人们今天就可以使用它。


所有权究竟是什么?

当我开始在 CKB 上构建时,最触动我的概念是:

CKB 上的所有权不是一个数据库记录。它是一个程序。

在以太坊上,你拥有 1.4 ETH 这一事实是以太坊节点同意维护的数据库中的一行。安全模型是:只要网络的大部分是诚实的,就没有人能在未经你许可的情况下更改你的行。

在 CKB 上,你拥有一个 Cell 意味着有一个 RISC-V 程序附加到那个 Cell 上(你的 Lock Script),并且任何消耗该 Cell 的交易只有满足该程序时才会有效。安全模型不仅依靠网络的诚实性来保障,还依靠每个节点独立运行脚本并拒绝未通过它的交易来保障。

实际区别是灵活性。如果你想改变你的资产如何被访问的规则,比如你想添加社交恢复或轮换你的密钥,在以太坊上你需要一个带有升级机制的智能合约,需要有人来维护。在 CKB 上,你只需创建一个带有新 Lock Script 的新 Cell。规则被嵌入到资产本身的结构中。


存储作为一等公民

CKB 设计中还有一小部分我觉得非常优雅,它来自容量模型。

每个 Cell 的 capacity 字段必须足够大,以覆盖 Cell 本身的字节大小。精确公式:Cell 序列化后的字节大小决定了你必须存入的最小 CKB 才能创建它。

1 CKB = 1 字节。 这不是比喻。这是状态租金模型。

在以太坊上,存储写入是免费的。你只需支付一次 gas 费来执行交易,但数据永远存在于链上,由网络中的每个节点维护,你无需承担持续成本。这就是为什么以太坊的状态多年来一直增长,却没有机制来阻止它。它提高了运行全节点的硬件要求,悄然而稳步地侵蚀着去中心化。

CKB 从结构上解决了这个问题。你想在链上存储 100 字节?你锁定 100 个 CKB 作为押金。这些 CKB 不会被燃烧。它们被锁定在 Cell 内部。当你不再需要数据而销毁 Cell 时,你会拿回这 100 个 CKB。你占用的空间被释放了。

这对应用的影响是显著的。Spore 协议(一种 CKB NFT 标准)将内容直接存储在 Cell 数据中。一张图片、一个文本文档、一件生成艺术。所有内容都存在于链上,在 Cell 内,而不是在 IPFS 或某个服务器上。因为 Cell 持有与其大小成比例的 CKB,所以 NFT 在其内部自带存储成本。当你转移一个 Spore NFT 时,Cell 自身容量的一小部分就可以支付矿工费。资产为自己的移动提供资金。

你可以向钱包里没有 CKB 的人发送一个 Spore NFT。试试在以太坊上这么做。


我实际构建了什么

在过去的三个星期里,我通过 CKBuilders 项目进行构建,从阅读文档到在本地开发网上运行交易,再到编写我的第一个针对 RISC-V 的 Rust 锁定脚本。

光是本地开发网体验就值得一提。在以太坊上,本地开发通常意味着一个模拟环境。Hardhat 瞬间挖掘区块,并伪造大部分网络行为。OffCKB 在你的机器上运行一个真正的工作量证明节点。区块是实际挖出的。交易必须实际通过脚本验证。环境是真实的,这意味着你在本地发现的 bug 是真正的 bug,而不是本地伪迹。

当我在我的开发网上铸造一个 xUDT 可替代代币时,我必须手动构造 Type Script,将代币金额作为 128 位小端整数编码进 Cell 数据,并在交易的 cellDeps 中包含 xUDT 系统脚本,以便 CKB-VM 知道从哪里加载验证逻辑。这比在 ERC-20 上调用 mint() 要冗长。但我确切理解了每一步发生了什么。没有隐藏机制的抽象。

当我搭建我的第一个 Rust 锁定脚本时,也就是每个 CKB 脚本开发者都从之开始的经典“始终成功”二进制文件,我意识到我写的不是以太坊意义上的智能合约。我在写一个验证器。一个程序,接收一个提出的状态转换(一笔交易),检查它,并返回 0(有效)或一个错误代码。这就是全部工作。没有存储。没有内部状态。只需要:这笔交易是否遵循规则?

这种区别——一个状态的合约与一个验证状态的脚本——是一种思维转变,改变了你对在 CKB 上构建的看法。


谁应该关注

如果你是一个比特币开发者,曾带着羡慕和怀疑看着以太坊的表达力以及全局状态模型,那么 CKB 值得你认真关注。你熟悉的 UTXO 模型完好无损。你一直想要的编程能力就在这里,没有你一直回避的共享全局状态。

如果你是一个以太坊开发者,已经遇到了 EVM 的限制:复杂存储操作的高 gas 成本、添加新密码学原语的困难、升级模式的笨拙,CKB 提供了一种值得理解的替代架构。这种转变是真实的。你对“合约”做什么的整个框架必须改变。但你在另一端得到的是一个系统,其中程序不与其他程序共享状态,并行性很自然,存储诚实地表达其成本。

区块链领域一直在问,为什么这个行业总是在用不同的代币重建相同的东西。CKB 的回答是架构上的:如果状态如何存储和所有权如何定义的基础模型根本不同,你就无法构建相同的东西。你会构建不同的东西。有时它们真的更好。


这是记录我通过 CKBuilders 项目进度的持续系列的一部分。

end

  • 原文链接: nervos.org/knowledge-bas...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论