Chia BLS Opcodes 扩展 CHIP 已移至审查阶段。请立即发表意见,要不然以后就对 Chia 上的 ZK 原语就只能保持现状了。
【CHIP-0011链接】:https://github.com/Chia-Network/chips/pull/46/files#diff-ffc582ffa2143a0708c912738867637430ce003b16ecca4988df653500d7ab0c
【以下翻译仅供参考】
概述
该 CHIP 将向 CLVM 添加一组新的算子(operator)。这些运算符将启用复杂的 BLS 操作,以及 ZK 证明等新功能,以及从其组成部分计算硬币 ID 的能力。最初,操作员可以从softfork警卫后面接近。之后,它们将成为核心 CLVM 的一部分。
定义
在本文档中,我们将使用以下术语:
Chialisp -构建 Chia 硬币的高级编程语言
CLVM – Chialisp 虚拟机,其中执行已编译的 Chialisp 的字节码。通常也指编译后的字节码本身
BLS – Boneh–Lynn–Shacham,一种支持聚合的数字签名方案。Chia在主网启动之前就一直在使用BLS 密钥
G1 – BLS 椭圆曲线上的第一组点;保存公钥的地方
G2 – BLS 椭圆曲线上的第二组点;保存数字签名的地方
Gt – G1和G2点的目标组,定义为G1 x G2 → Gt
ZK 证明-零知识证明,一种方法,一方(证明者)可以向另一方(验证者)证明给定的陈述是真实的,而证明者避免传达除了陈述确实是事实之外的任何其他信息真的
动机
CLVM 当前包含一个名为point_add的 BLS 运算符。此运算符用于 G1 添加,需要支持合成密钥。然而,CLVM 缺少执行更复杂操作(例如签名验证)所必需的运算符。该 CHIP 将向 CLVM 添加一组新的运算符,以便利用 BLS 签名的全部功能。例如,新运营商将增加验证签名和使用 ZK 证明的能力。此外,CLVM 目前缺乏一种在验证其组件时计算硬币 ID 的方法。为解决此问题,将向 CLVM 添加一个新运算符,该运算符根据其父代币 ID、拼图哈希和金额计算代币 ID。如果任何参数无效,运算符将失败。CLVM 是一种可扩展的链上编程语言,因此添加新的算子并不是一个很大的技术挑战。
向后兼容性
关于此 CHIP 与当前 CLVM 实施的兼容性的几点注意事项:
- 要添加的 CLVM 运算符是向后兼容的——在实现 CHIP 之后成功的任何调用也将事先成功
- 要添加的 CLVM 运算符不向前兼容——一些在 CHIP 实现之前成功的调用之后将不再成功
- 由于要添加的运营商的前向不兼容,此 CHIP 将需要 Chia 区块链的软分叉
- 要添加的运营商不太可能引起争议。但是,与所有分叉一样,存在链分裂的风险
- 软分叉也可能无法被采用。如果没有足够数量的节点升级以包含此 CHIP 在分叉块高度之前引入的更改,则可能会发生这种情况
运算符将分多个阶段引入:
- Pre-CHIP:在 block 之前4 200 000,任何调用新操作符的尝试都将导致成功的 no-op
- 软分叉:软分叉将在块中激活4 200 000。从那个区块开始,新的运营商将展示这个 CHIP 中列出的功能。它们将需要使用软分叉运算符的新语法(从守卫内部)调用softfork。此语法在本 CHIP 的规范部分进行了解释
- 硬分叉:硬分叉将在块中激活5 496 000。这个硬分叉是 CHIP-12 的结果,它与这个 CHIP 无关。从块5 496 000向前,也可以在不使用操作符的情况下调用此 CHIP 中引入的操作符softfork(从softfork守卫外部)。换句话说,新的算子将被添加到核心 CLVM 算子集中。softfork(请注意,如果需要,操作员仍可从守卫内部调用)
基本原理
选择此 CHIP 的设计主要是为了实现标准化。它包括用于加、减、乘和取反 BLS 点的一致方法。point_add为了保持这种一致性,该提案还包括从到 的映射g1_add。该 CHIP 设计的另一个方面是它增强了多个 BLS 分组之间的交叉功能。该设计包括对来自不同分组的点进行配对的能力,以及向 G1 和 G2 点添加任意数据的能力。每个新运营商都将产生 CLVM 成本,详情如下。如果采用这种 CHIP,新的运营商在设计 Chia 币时将是可选的。
规格
为了支持 CLVM 中必要的可用 BLS 操作集,需要 G1 和 G2 点上的数学原语,以及用于配对和映射这些点的函数。
因此,将添加以下运算符:
g1_add
操作码:29
功能:添加两个或更多 G1 点
注意:此运算符已在 CLVM 中实现为point_add. 为了一致性和易用性,将创建一个新的编译器宏来映射point_add到g1_add,以便可以使用任何一个名称并完全向后兼容。
参数:
- 如果参数为零,将返回 G1 标识
- 如果一个参数,结果将是一个成功的空操作
- 如果有两个或多个参数,每个参数必须是一个 G1 点;结果将是参数的总和
用法:(g1_add point1 point2 … pointn)
CLVM 成本:101 094基础,1 343 980每个参数
g1_subtract
操作码:49
功能:从基本 G1 点减去一个或多个 G1 点
参数:
- 如果参数为零,将返回 G1 标识
- 如果一个参数,结果将是一个成功的空操作
- 如果有两个或多个参数,则必须包含一个基 G1 点 (point1),后跟一个或多个 G1 点以从基 G1 点中减去
用法:(g1_subtract point1 point2 … pointn)CLVM 成本:132 332基础,1 362 553每个参数
g1_multiply
操作码:50
功能:将 G1 点乘以标量值
参数:单个 G1 点 (point1) 和单个标量值 (scalar)
用法:(g1_multiply point1 scalar)
CLVM 成本:2 154 347基础,12标量中的每字节
g1_negate
操作码:51
功能:否定G1点
参数:单个 G1 点用法:(g1_negate point1)
CLVM 成本:470 779
g2_add
操作码:52
功能:添加两个或更多 G2 点参数:
- 如果参数为零,将返回 G2 标识
- 如果一个参数,结果将是一个成功的空操作
- 如果有两个或多个参数,每个参数必须是一个 G2 点;结果将是参数的总和
用法:(g2_add point1 point2 … pointn)
CLVM 成本:45 440基础,5 544 581每个参数
g2_substract
操作码:53
功能:从基础 G2 点减去一个或多个 G2 点
参数:
- 如果参数为零,将返回 G2 标识
- 如果一个参数,结果将是一个成功的空操作
- 如果有两个或多个参数,则必须包含一个基 G2 点 (point1),后跟一个或多个 G2 点以从基 G2 点中减去
用法:(g2_subtract point1 point2 … pointn)CLVM 成本:146 290基础,5 495 272每个参数
g2_multiply
操作码:54
功能:将 G2 点乘以标量值
参数:单个 G2 点 (point1) 和单个标量值 (scalar)用法:(g2_multiply point1 scalar)
CLVM 成本:10 078 145基础,12标量中的每字节
g2_negate
操作码:55
功能:否定G2点
参数:单个 G2 点用法:(g2_negate point1)
CLVM 成本:1 881 699
g1_map
操作码:56
功能:将任意数据映射到 G1 点。使用 SHA-256 和 ExpandMsgXmd 将指定的消息散列到 G1,使用指定的 DST(域分隔标签)或默认 DST
参数:第一个参数(必需)是数据;第二个参数(可选)是自定义 DST。BLS_SIG_BLS12381G1_XMD:SHA-256_SSWU_RO_AUG_如果不使用第二个参数,将使用默认的 DST
用法:(g1_map data dst)CLVM 成本:610 907基础,122每字节,135每 DST 字节
g2_map
操作码:57功能:将任意数据映射到 G2 点。使用 SHA-256 和 ExpandMsgXmd 使用指定的 DST 或默认 DST 将指定的消息散列到 G2参数:第一个参数(必需)是数据;第二个参数(可选)是自定义 DST。BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_AUG_如果不使用第二个参数,将使用默认的 DST用法:(g2_map data dst)CLVM 成本:3 380 023基础,122每字节,135每 DST 字节
bls_pairing_identity
操作码:58
功能:1如果所有 G1 和 G2 对的配对是 (Gt) 身份,则返回,否则返回 null
参数:G1/G2 对的列表,作为 cons boxes 传入
用法:(bls_pairing_identity (g1point1 . g2point1) (g1point2 . g2point2) … (g1pointn . g2pointn))
CLVM 成本:4 999 087基础,4 515 438每对 G1/G2
bls_verify
操作码:59
功能:根据签名 ( msg) 根据公钥 ( G1) 验证消息 ( G2)。1如果签名有效则返回,null否则返回。验证使用增强方案,这意味着公钥 (G1) 在散列到 G2 点之前被添加到消息中。夏令时是BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_AUG_。验证包括否定的 G1 生成器和底层配对操作中的签名对
参数:一个 G2 点后跟一个 G1/msg 对列表,作为 cons boxes 传入
用法:(g2point (g1point1 . msg1) (g1point2 . msg2) … (g1pointn . g2pointn))
CLVM 成本:4 999 087基础,4 515 438每对 G1/G2,122每字节,135每 DST 字节此外,将添加以下功能来计算硬币ID:
coinid
操作码:48
功能:给定母代币 ID、拼图哈希和数量,计算该代币的 ID。还验证参数,确保哈希为 32 字节,并且amount在规范表示中并且在有效硬币的范围内。如果任何参数无效则引发异常参数:
- parent-id– 该币母币的币ID
- puzzle-hash– 这个硬币拼图的拼图哈希
- amount– 这枚硬币的价值,以 mojos 为单位
所有这三个参数都是必需的。
用法:(coinid parent-id puzzle-hash amount)
CLVM 成本:800
coinid 的 CLVM 成本的计算类似于sha256:
- SHA256_BASE_COST= 87
- SHA256_COST_PER_ARG= 134(并且有 3 个参数:parent-id、puzzle-hash 和 amount)
- SHA256_COST_PER_BYTE= 2(parent-id 和 puzzle-hash 都是 32 字节;amount 是 8 字节)
- 基础coinid_cost= SHA256_BASE_COST+ SHA256_COST_PER_ARG* 3 + SHA256_COST_PER_BYTE*arg_bytes
- 基数coinid_cost= 87 + (134 * 3) + (2 * (32 + 32 + 8))
- 基数coinid_cost= 633
除了这个成本之外,还有一个每字节的 malloc 成本:
- malloc_cost= 10 每字节分配给堆
- sha256分配的字节数 = 32(和的输出大小相同coinid)
- malloc_cost= 320
理论coinid_cost值是基数coinid_cost和的总和malloc_cost:
- 理论coinid_cost= 633 + 320 = 953
到目前为止,此成本与 的成本相同sha256。但是,sha256更容易出现用户错误。为了激励使用coinid我们选择了折扣成本:
- coinid_cost= 理论coinid_cost- 折扣
- coinid_cost= 953 – 153
- coinid_cost= 800
softfork用法
如向后兼容性部分所述,从块4 200 000(包括)开始,此 CHIP 中引入的运算符将可从守卫内部使用softfork。请注意,从块开始5 496 000,此 CHIP 中的操作员也可以从守卫外部获得softfork(它们将成为硬分叉中 CLVM 的一部分)。在此之后,可以选择从警卫内部通过该 CHIP 呼叫接线员softfork。
另请注意,运算符的语法softfork已更新。使用更新后的运营商从该 CHIP 呼叫运营商时,以下规则适用softfork:
- 该运算符的工作方式与apply( a) 类似,但需要两个额外的参数,cost并且extension
- 因此语法是softfork (<cost> <extension> <quoted-program> <arguments>)
- 该参数是使用指定的cost执行 的 CLVM 成本。如果此成本与执行程序的实际成本不匹配,则操作员将引发异常quoted-programargumentssoftfork
- 该extension参数是一个整数,指示守卫中可用的扩展集softfork。这个整数必须适合一个无符号的 32 位变量
- 就像运算符一样a,quoted-program参数是从softfork守卫内部引用和执行的。
- 不识别extension说明符的客户端必须:
- 共识模式下,忽略整体softfork,返回null并收取指定的cost
- 在 mempool 模式下,立即使程序失败
由于softfork守卫总是返回 null,执行一个守卫的唯一有用结果是终止(即失败)程序或不终止。执行运算符的成本softfork为 140。这计入其参数中指定的成本。softfork使用运算符调用new运算符的例子coinid如下:
(softfork
(q . 1265) ; expected cost (including cost of softfork itself)
(q . 0) ; extension 0
(q a ; defer execution of if-branches
(i
(=
(coinid
(q . 0x1234500000000000000000000000000000000000000000000000000000000000)
(q . 0x6789abcdef000000000000000000000000000000000000000000000000000000)
(q . 123456789)
)
(q . 0x69bfe81b052bfc6bd7f3fb9167fec61793175b897c16a35827f947d5cc98e4bc)
)
(q . 0) ; if coin ID matches, return 0
(q x) ; if coin ID mismatches, raise
)
(q . ())) ; environment to apply
(q . ())) ; environment to softfork
测试用例
此 CHIP 的测试用例位于clvm_rs GitHub 存储库的op-tests文件夹中。这些测试包括:
- 测试-bls-ops.txt
- 测试-blspy-g1.txt
- 测试-blspy-g2.txt
- 测试-blspy-hash.txt
- 测试-blspy-pairing.txt
- 测试-blspy-verify.txt
参照实施
作为此 CHIP 的一部分,以下拉取请求已合并到Chia-Network/chia_rs GitHub 存储库:
- 273 -softfork和coinid运营商
- 274 – 此 CHIP 的主要补丁
- 287 – 更改签名bls_verify和bls_pairing_identity
- 288 – BLS 运营商的更新成本
此外,存储库的PR #15299chia-blockchain为这个 CHIP 实现了软分叉基础设施。
安全
Chia Network, Inc. 已对该 CHIP 涉及的代码进行了内部审查。
额外资产
Chia 键遵循BLS-12-381标准
Chia 图使用符合IRTF CFRG BLS 标准的 BLS 密钥
Chia 键遵循EIP-2333规范,只有一点点不同
版权
通过CC0放弃版权和相关权利。
想要了解更多 Chia 生态发展情况,可以进入https://chiahub.co/进行了解,Chiahub是目前Chia 生态最全面的导航工具,为全球 Chia 爱好者提供最全最新的生态信息服务
原创文章,作者:admin,如若转载,请注明出处:https://news.chiahub.co/202306131522331167.html