【通告】Chia BLS 扩展操作码CHIP进入审核

【通告】Chia BLS 扩展操作码CHIP进入审核

Chia BLS Opcodes 扩展 CHIP 已移至审查阶段。请立即发表意见,要不然以后就对 Chia 上的 ZK 原语就只能保持现状了。

【CHIP-0011链接】:https://github.com/Chia-Network/chips/pull/46/files#diff-ffc582ffa2143a0708c912738867637430ce003b16ecca4988df653500d7ab0c

【以下翻译仅供参考】

【通告】Chia BLS 扩展操作码CHIP进入审核

概述

该 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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息