自 2022 年 AA 叙事在以太坊社区火热以来,账户抽象概念便流行于 Web3 社区。它实际上是一种关于账户体系的设计理念,旨在更高层次上建立标准,增强账户的功能性。而在以太坊等主流区块链中,由于存在固定规则的限制,账户体系的灵活性和通用性非常差,比如说:
- 你的账户中要事先有 ETH 等 Gas Token,不然无法发起交易,显然这对新账户非常不友好;
- 以 EVM 系为代表的公链仅支持单一的账户体系,其他公链或 Web2 用户需要使用新的账户工具和入口。
此前在以太坊社区风靡一时的 EIP-4337 提案被认为可以解决上述问题,但受制于其技术模型、历史包袱与生态发展、开发者认知等因素,EIP-4337 的修补方案更像是在打补丁,而不是从根本上解决问题;尝试为 EVM 添加新操作码的 EIP-3074,则被认为存在安全隐患,在解决旧问题的同时带来了新问题,可行性备受争议。
碍于各种原因,以太坊创始团队在主网启动之初,没有对账户体系进行周全考虑,留下了大量的包袱,如:EOA 账户与合约账户分野、不支持无 gas 交易、不支持多种加密原语等。这些历史包袱对以太坊 AA 路线图的实施造成了明显阻碍,甚至可以说,以太坊的 AA 方案并不能让其账户体系超越后来的新公链,而只是在弥补两者间的差距。如果一条公链在最初设计时就充分考虑账户设计,就不用像以太坊一样走弯路了。
与 EVM 系公链所不同,Nervos 在设计之初就深入考虑了账户体系的问题,在进行了调研后,我们认为,Nervos 的账户体系更偏向AA的底层和本质,其 UTXO 账户模型及支持多种验证方式的 OmniLock,从始至终都与AA的目标深度契合,且没有历史包袱,天生支持 BTC、ETH 乃至 Solana 等其他公链的账户体系。
此外,对于近期火热的 BTCFi 而言,由于其本身就是为原生比特币资产引入 DeFi 等场景,要让比特币持有者获得无缝的产品体验,有必要兼容主流的比特币钱包等周边设施,而 CKB 的原生 AA 方案天然实现了这一点,为 BTCFi 的大规模采用创造了必要条件。
下面我们将从设计理念、系统架构、应用、生态等多个角度解读 Nervos 的账户抽象体系。
比特币 UTXO 与 Nervos 的 Cell 模型
大多数人都知道,基于 UTXO 模型的公链,其数据存储结构并不基于 “账户 — 余额” 体系,而采用了一种独特的形式。具体而言,UTXO 像黄金一样可以被熔化或铸造,每次交易都会有旧的 UTXO 销毁,新的 UTXO 诞生。此外,UTXO 数据并不存储在某个集中式地址下,而是分散存储在生成 UTXO 的那笔交易里,要读取过往区块的记录才能找到。
毫不夸张的说,比特币开创了一种区别于传统 Web2 平台 “账户-信息” 体系的存储范式,这可以解决状态爆炸、数据读写效率低下、所有权模糊化的问题。在 UTXO 模型下,不同人的资产数据存储位置与所有权划分十分清晰,对并行/并发比较友好,也便于支持存储租赁等功能,可以避开传统账户体系的很多坑。
Nervos 公链的账户体系在设计之初,便充分吸收了比特币 UTXO 的优点,其 Cell 模型实际上是比特币 UTXO 的升级版,提供了图灵完备的可编程性。此外,无论是 CKB 还是其他资产都是一等资产,并不像 EVM 公链一样把原生资产与 ERC-20 区别对待。
CKB 的 Cell 在运作机理上与比特币 UTXO 大致相同:都是被 “锁定脚本” 和 “解锁脚本” 驱动的,每个 UTXO/Cell 在产生时,都会有一个 “锁定脚本”,就像一道密码锁;而 “解锁脚本” 是对应的密钥,可以解开 “锁定脚本”。只要你能提交 “锁” 对应的 “密钥”,其关联的 UTXO 就会任你差遣。
但与比特币 UTXO 不同的是,Cell 在锁定脚本之上增设了 “TypeScript” 字段。如果说 LockScript 是身份验证器,决定你是否有资格改写这个 Cell,那么 TypeScript 就是附着在 Cell 中的智能合约,DEX、借贷协议的代码都可以部署在 TypeScript 内。
如果开发者要在 CKB 上实现类似于 AMM 的流动性池,只需要在一个专用 Cell 的 TypeScript 中写好合约代码,然后在这个 Cell 的 Data 字段中,存放流动性池的状态信息(比如池子里各类资产余额),之后用户和 TypeScript 中的代码交互就行了。
CKB 的这种设计在比特币 UTXO 模型之上拓展出了更丰富的场景,可编程性强得多,且由于 CKB 本身采用 RISC-V 虚拟机,支持多种编程语言写的程序,能够支持的各种逻辑要远比比特币强大。
至于 Cell 的锁定脚本 LockScript,则与我们今天的核心话题 AA 正相关。因为 AA 所主张的一大特性,在于让链上账户支持灵活多样的身份验证方式。对于 UTXO 而言,要实现这一功能,就要在充当身份验证器的 LockScript 上下功夫,CKB 为此推出了专门支持多种身份验证方案的 OmniLock 脚本。
下面让我们来了解下 OmniLock 的具体设计。
OmniLock 与账户抽象
在前面我们曾提到,CKB 的 Cell 与比特币 UTXO,其使用权限都是由锁定脚本来定义的,LockScript 中会确定哪些人可以改写这个 Cell,起到身份验证的作用。为了支持多种认证方法,CKB 提供了名为 OmniLock 的通用型锁定脚本,可以兼容多种签名算法和验证机制。
OmniLock 将不同的验证逻辑进行了模块化处理,只要设置不同的参数,就可以灵活配置不同的验证算法。用户可以分别使用 BTC、ETH 甚至 WebAuthn 等账户、钱包/鉴权方式,直接操纵 CKB 链上的资产。
那么 OmniLock 具体是怎么实现和使用的?其实要通俗的解释,OmniLock 是 Nervos 直接在 CKB 链上布置好的一段代码,这段代码写在了某个特定的 Cell 上,可以被其他 Cell 使用,就好像 EVM 公链中的 “系统合约” 一样。如果某个 Cell 要使用 OmniLock,可以在自己的锁定脚本中声明引用 OmniLock。
下面我们可以通过一段伪代码理解锁定脚本和 OmniLock 的工作原理。
CKB 的锁定脚本包含 Code hash、hash type 和 Args 三个字段,由于Code hash 和 hash type 与本节内容关联性不大,这里不作解释。下面我们着重介绍 Args 字段,通过对 Args 进行灵活配置,就可以使用 OmniLock 中定义好的不同验证算法。
Args 字段对应的内容可以分为两部分,一部分是 Auth,专门用于身份验证,其长度为 21 字节,包含 1 字节的 flag 标识符,以及 20 字节的鉴权数据。Auth 的鉴权数据中包含一段预设好的公钥哈希,只有公钥哈希对应的公钥主人才能通过身份验证,有资格改写 Cell 中的数据。
Auth 中的 flag 则是一个标识符,用于选择不同的鉴权方式,此处说的鉴权方式不仅指密码学验签,还包括信息处理等综合流程:如 flag 为 0x01 时,代表以太坊外部消息的鉴权方式。除了以太坊,OmniLock 还支持 Bitcoin、Dogecoin、Tron、多签等丰富的消息验证形式。
Args 中的另一部分叫 Omnilock args,它就像一个按钮,可以在 OmniLock 预设好的功能模式中进行选择,如用管理员模式(如 USDT 的管理员冻结功能)、用于小额支付的 anyone-can-pay 模式(小额捐赠使用)、时间锁模式等。Anyway,只要对 Omnilock args 进行调整,就可以使用 OmniLock 中预先写好的不同功能。
综上,我们可以在 Cell 锁定脚本的 Auth 和 Omnilock args 字段输入不同的参数,来选择不同公链或平台的身份验证方法,为 CKB 引入多种多样的身份验证方式。当然,除了 OmniLock 中预先定义的几种鉴权方式外,开发者也可以自行定义身份验证方案。
Nervos 账户抽象生态:CCC、Mobit 和 JoyID
上面我们已经知道,OmniLock 是 Nervos 实现账户抽象的基础,而基于 OmniLock 的钱包如 Mobit、.bit、Omiga 和中间件 CCC(Common Chains Connector)等则构成了 Nervos 丰富的 BTCFi 账户抽象生态,此外还包括提供安全隐私保护和身份管理服务的 DID 平台 did.id,以及去中心化 DOBs 资产交易平台 Dobby 等。
AA 的良好特性给 BTCFi 生态应用也带来了极大的便捷性,使得 CKB 生态内的项目可以直接支持 BTC 钱包交互,降低了使用门槛。在下文中,让我们以具体的案例切入,来考察 CKB 的 AA 生态。
Common Chains Connector(CCC)
首先我们以 CCC 为例,这是一个钱包连接中间件,专门为钱包和 dApp 提供各种公链对 CKB 的可操作性。
下图是 CCC 的连接窗口。这里我们以 MetaMask 为例,如果你拥有一个以太坊账户,如何操作 CKB 链上的对应账户。
当使用 CCC 进行 CKB 链上交易时, 该 demo 会调起 MetaMask 钱包的 personal_sign 方法来进行签名,这种方法用于签名一段不直接上链的文字消息。
我们可以看出该信息包含的内容是 CKB transaction 的一系列十六进制码。通过 MetaMask 签名后的消息,将被提交至 Nervos CKB 链上,并通过 OmniLock 等机制进行验证。
而前面我们曾提,Nervos 本身就支持验证以太坊的消息格式,可以说 CKB 从底层就考虑好了对接其他公链生态。对用户而言,你可以通过既有的、熟悉的入口和工具进入 CKB 生态。
而对于开发者,Nervos 在底层定义好了 OmniLock 标准,并通过 CCC 抽象了多链钱包的实现细节,极大降低了开发难度,让上层应用开发者可以更好地专注于上层业务逻辑的开发而不必过度关注于底层细节。
Mobit
Mobit 是基于 Nervos 的 DID 和资产管理平台,如果用一个比喻,Mobit 就像是外界进入 Nervors 生态的一道大门,而这道大门的门槛很低。借助 Mobit,用户几乎不需要任何前置知识,只需要一些简单操作,就可以用其他公链的账户在 Nervos 生态中完成交互。
下图是 Mobit 的连接窗口。可以看到目前 Mobit 已经支持多个主流公链的账户体系,且这个列表还在继续扩张。
仍以 MetaMask 钱包为例。连接后的界面同样可以看到用户的 EVM 和 CKB 地址,并展示该地址在 CKB 链上持有的 Token 和 DOBs 资产。
这里说下 DOBs,它是 Nervos 生态中特有的,类似于 NFT 的资产,但 DOBs 与 NFT 有本质不同。首先,DOBs 的数据完整保存在链上,可以看成是 “全链 NFT”,而很多以太坊 NFT 的数据并未完整存储在链上。
另外,每个 DOBs 都可以设置 Chatbot,可以与持有者进行对话等交互场景,随着不同持有者各异的养成路径,相比于传统的 NFT,每个 DOBs 将具有更显著的个体差异。
至于 Omiga 是 Nervos 生态中 DOBs 的交易平台,用户可以直接在 Mobit 的 Apps 界面一键跳转进入。
Omiga 同样利用了 Nervos 的账户抽象功能:
Mobit 的操作简单、功能全面,将有助于 BTCFi 的交互。BTCFi 产品本质是为原生的比特币资产提供多样性的 DeFi 体验,能否兼容主流比特币钱包将会是 BTCFi 周边设施需要考虑的重要因素,而 CKB 目前已经做好了准备。
对 WebAuthn 的采用
WebAuthn 是一种由万维网联盟(W3C)和 FIDO(Fast IDentity Online)联盟共同开发的网络标准,目标是提高用户身份验证的安全性、简化登录过程,减少对传统密码或私钥的依赖。
一些主流的桌面或移动操作系统如 iOS 和 Android 中内置的密钥管理软件,可以使用本地的安全模块或云存储来存储密钥并进行签名。目前 WebAuthn 主流实践中一般会支持 P-256,P-384,P-521 等,由于 Nervos 的 OmniLock 支持自定义的密码学原语,所以也可以覆盖这些。
以下是一些 WebAuthn 支持的客户端:
1. Apple KeyChain
- Security Enclave: 苹果的设备使用 Secure Enclave 来处理关键的加密操作,包括私钥存储和签名。
- iOS 和 macOS: 苹果的系统可以使用钥匙串API进行身份验证和签名操作,也可以通过 Face ID 或 Touch ID 进行用户认证。
2. Windows Hello
- TPM(Trusted Platform Module): Windows 设备可以通过 Windows Hello 利用 TPM 进行私钥生成和签名。
- 生物认证: Windows Hello 支持指纹识别和面部识别来验证用户身份。
3. Android Keystore
- Android 设备可以利用硬件安全模块进行密钥存储和签名,通过生物特征(如指纹或面部识别)进行认证。
4. Ubisoft Security Keys
- 安全密钥硬件设备,如 YubiKey,支持通过 USB NFC 进行安全认证和签名操作。
CKB 生态钱包 JoyID 就是利用 WebAuthn 技术所实现的应用。通过 JoyID,用户可以直接通过生物识别(如指纹或面部识别)方式进行身份验证,实现无缝且高安全性的登录和身份管理。
Nervos 生态中的 .bit 也是利用 WebAuthn 实现来登录并使用区块链的一个场景。
从上面的案例我们可以看出,CKB 的 AA 方案天生就支持其他公链和 Web2 用户。对于广大 Web2 用户而言,支持 WebAuthn 是至关重要的,它摆脱了私钥和助记词管理的包袱,极大降低了使用门槛。越早在这个方向上发力的公链生态,在日后就越有优势。
总结
以太坊受限于其历史包袱问题,现有的 AA 解决方案基本治标不治本,无法从根源上解决问题;而 Nervos 在启动主网之初就充分顾及了账户体系的设计,提供了 OmniLock 功能,可以支持任意形式的身份验证方式。
Nervos 的 Cell 模型实质上是对比特币 UTXO 的功能拓展,其锁定脚本可以支持多种验签算法,OmniLock 则以类似于系统合约的方式,支持任意 Cell 在锁定脚本中直接调用,为广大开发者和用户提供了 Web2 级别的体验。
目前 Nervos 账户抽象生态内已经有 CCC、Mobit、JoyID 等产品,基本比较完备。
BTCFi 本质是为原生的比特币资产提供多样性的 DeFi 体验,能否兼容主流比特币钱包将会是 BTCFi 周边设施需要考虑的重要因素,而 CKB 作为 BTCFi 生态中的重要设施,采取了包容并蓄的做法,尽可能在开发者侧和用户侧都为 BTCFi 的 mass adoption 创造必要条件。