值得信赖的区块链资讯!
零知识证明 – 深入理解powersoftau
学习区块链技术的小伙伴不知道有没有同样的体验,每天脑袋都在膨胀,每天都有很多新鲜的知识需要学习总结。最近有些空闲时间看了看powersoftau。了解零知识证明算法的小伙伴的都知道,在利用某些零知识证明算法之前,需要可信设置。Groth16算法针对不同的电路需要单独的可信设置,生成CRS。PLONK算法是Univeral的零知识证明算法,针对不同的电路,在电路规模不超过一定范围的情况下,只需要一次可信设置。如何让多个参与方安全地进行可信设置,生成零知识证明的可信参数,就是powersoftau解决的事情。
powersoftau,采用MPC以及随机Beacon,完成可信设置。
理论基础
目前开源的powersoftau采用的是2017发表的论文:
Scalable Multi-party Computation for zk-SNARK Parameters in the Random Beacon Model
https://eprint.iacr.org/2017/1050
参与方/协调方
整个可信设置由参与方(player)以及协调方(coordinator)组成。协调方将前一个参与方生成的数据发送给下一个参与方。在所有参与方计算完成后,协调方再通过公开随机Beacon参与计算生成最后的参数。

协调方,并不需要可信第三方,因为协调方通过公开随机Beacon生成的参数是可以验证的。所谓的公开随机Beacon,是在某个时间点之前并不知道的随机性数据,并且在同一个时间点后,所有人都可以验证随机数据。
Phase1/Pahse2
论文的第二章给出了整个协议的大体思路。假设Alice和Bob是两个参与方,整个协议逻辑上分成两步:Phase1和Phase2。

Phase1计算出某个多项式项的tau对应的值。Phase2计算出整个多项式对应的值。注意这些值都是有限域上的点。简单的说,Phase1提供单个项的MPC的计算结果,Phase2提供多项组合的MPC的计算结果。Phase1和Phase2计算流程类似,参与方一个个的接着做。整个协议涉及两个基本计算:CONSISTENT和POK。
CONSISTENT
CONSISTENT用来检查两个配对函数的结果是否相等。

检查A,B,C是否满足e(A,B) = e(C1,C2),记为:consistent(A-B; C)。
POK
POK – proof of knowledge。

参数alpha是知识(knowledge)。为了证明知道知识alpha,先计算出r(alpha对应的G1上的点和公共字符串v),并生成G2上的点。通过提供alpha在G1上的点以及alpha*r,可以证明知道知识alpha。证明可以通过配对函数进行验证。
协议逻辑
论文的第四章给出了整个协议的定义。电路被抽象成两个结构:一个结构是计算过程只有乘除的电路部分,一个结构是组合部分。
对一个电路,证明的计算过程如下:

1(a) – 对电路中的每个输入,进行POK的证明。注意v是上一层的结果计算生成。
1(b) – 在上一参与者计算结果的基础上,计算当前参与者的计算结果。其中M是电路的多项式函数。
2 – 应用随机Beacon
相对于计算过程,验证过程也比较清晰:

验证POK证明,验证M的计算是否正确。
论文的第6/7章,详细给出了Groth16算法参数的生成过程。感兴趣的小伙伴,可以自行查看。
源代码分析
powersoftau在github上有多个项目,大同小异。以matter labs的代码为例,分析一下代码逻辑。
https://github.com/matter-labs/powersoftau
这个项目实现Groth16算法的可信设置,支持BN256以及BLS12_381曲线。特别注意的是,这个项目只实现了Phase1,组合的部分(Phase2)这个项目并不涉及。
代码结构

accumulator.rs和batched_accumulator.rs顾名思义,累加器,多个参与者的计算结果的“累加”。bin目录下实现多个程序,实现计算(包括随机Beacon的应用计算),验证计算等等。parameters.rs是参数配置。bn256/small_bn256/bls12_381是对应曲线的参数配置。keypair.rs实现了公钥和私钥的管理。utils.rs实现了一些辅助函数。先从keypair说起。
keypair
keypair实现PublicKey和PrivateKey密钥对。私钥比较直接,包括tau,alpha以及beta:
pub struct PrivateKey<E: Engine> {
pub tau: E::Fr,
pub alpha: E::Fr,
pub beta: E::Fr
}
私钥是随机生成的。公钥相对复杂一些:
pub struct PublicKey<E: Engine> {
pub tau_g1: (E::G1Affine, E::G1Affine),
pub alpha_g1: (E::G1Affine, E::G1Affine),
pub beta_g1: (E::G1Affine, E::G1Affine),
pub tau_g2: E::G2Affine,
pub alpha_g2: E::G2Affine,
pub beta_g2: E::G2Affine
}
针对tau,alpha以及beta,生成G1/G2对应的点。三者的计算方式一致。详细看一下tau对应的公钥的生成过程:
let mut op = |x: E::Fr, personalization: u8| {
// Sample random g^s
let g1_s = E::G1::rand(rng).into_affine();
// Compute g^{s*x}
let g1_s_x = g1_s.mul(x).into_affine();
// Compute BLAKE2b(personalization | transcript | g^s | g^{s*x})
let h: generic_array::GenericArray<u8, U64> = {
let mut h = Blake2b::default();
h.input(&[personalization]);
h.input(digest);
h.input(g1_s.into_uncompressed().as_ref());
h.input(g1_s_x.into_uncompressed().as_ref());
h.result()
};
// Hash into G2 as g^{s'}
let g2_s: E::G2Affine = hash_to_g2::<E>(h.as_ref()).into_affine();
// Compute g^{s'*x}
let g2_s_x = g2_s.mul(x).into_affine();
((g1_s, g1_s_x), g2_s_x)
};
g1_s是在G1随机生成的点,g1_s_x是x*g1_s。g2_s的生成依赖一个digest信息和g1_s的点。也就是说,在知道g1_s和g1_s_x的点以及digest信息的情况下,所有人都可以推算出来。g2_s_x是x*g_s。

其中digest信息是前一个参与者计算结果的hash,具体计算在bin代码解释时详细描述。因为在知道g1_s,g1_s_x和digest的情况下,g2_s可以推算出来。所以,公钥信息只要这三个点就足够:((g1_s, g1_s_x), g2_s_x)。
accumulator
Accumulator负责将多个参与方生成的“参数”信息“累加”起来。所有的参数信息都清晰的描述在注释中:
pub struct Accumulator<E: Engine, P: PowersOfTauParameters> {
/// tau^0, tau^1, tau^2, ..., tau^{TAU_POWERS_G1_LENGTH - 1}
pub tau_powers_g1: Vec<E::G1Affine>,
/// tau^0, tau^1, tau^2, ..., tau^{TAU_POWERS_LENGTH - 1}
pub tau_powers_g2: Vec<E::G2Affine>,
/// alpha * tau^0, alpha * tau^1, alpha * tau^2, ..., alpha * tau^{TAU_POWERS_LENGTH - 1}
pub alpha_tau_powers_g1: Vec<E::G1Affine>,
/// beta * tau^0, beta * tau^1, beta * tau^2, ..., beta * tau^{TAU_POWERS_LENGTH - 1}
pub beta_tau_powers_g1: Vec<E::G1Affine>,
/// beta
pub beta_g2: E::G2Affine,
/// Keep parameters here
pub parameters: P
}
注意tau在G1和G2上的点的个数不一样,分别是TAU_POWERS_G1_LENGTH和TAU_POWERS_LENGTH。这两个宏的计算方式定义在parameters.rs中:
const TAU_POWERS_LENGTH: usize = (1 << Self::REQUIRED_POWER)
const TAU_POWERS_G1_LENGTH: usize = (Self::TAU_POWERS_LENGTH << 1) - 1;
Accumulator主要提供了两个函数transform和verify_transform函数。transform函数在现有Accumulator的基础上叠加目前的PrivateKey的计算。
pub fn transform(&mut self, key: &PrivateKey<E>)
{
...
batch_exp::<E, _>(&mut self.tau_powers_g1, &taupowers[0..], None);
batch_exp::<E, _>(&mut self.tau_powers_g2, &taupowers[0..P::TAU_POWERS_LENGTH], None);
batch_exp::<E, _>(&mut self.alpha_tau_powers_g1, &taupowers[0..P::TAU_POWERS_LENGTH], Some(&key.alpha));
batch_exp::<E, _>(&mut self.beta_tau_powers_g1, &taupowers[0..P::TAU_POWERS_LENGTH], Some(&key.beta));
self.beta_g2 = self.beta_g2.mul(key.beta).into_affine();
...
}
其中taupowers是tau^0, tau^1…tau^(TAU_POWERS_G1_LENGTH)的计算结果。
verify_transform验证transform的计算是否正确。验证需要提供需要验证的计算之前的Accmulator和之后的Accumlator,公钥信息以及digest信息。以tau的计算为例,解释相关逻辑:
pub fn verify_transform<E: Engine, P: PowersOfTauParameters>(before: &Accumulator<E, P>, after: &Accumulator<E, P>, key: &PublicKey<E>, digest: &[u8]) -> bool
在计算出g2_s的基础上(包括g1_s,g1_s_x和digest信息),首先验证公钥信息是否正确:
if !same_ratio(key.tau_g1, (tau_g2_s, key.tau_g2)) {
验证公钥信息,就是POK的验证过程。
接着检查tau^0是否为1:
// Check the correctness of the generators for tau powers
if after.tau_powers_g1[0] != E::G1Affine::one() {
return false;
}
if after.tau_powers_g2[0] != E::G2Affine::one() {
return false;
}
验证tau的计算是否正确:
if !same_ratio((before.tau_powers_g1[1], after.tau_powers_g1[1]), (tau_g2_s, key.tau_g2)) {
验证tau的其他幂次对应的点计算是否正确:
if !same_ratio(power_pairs(&after.tau_powers_g1), (after.tau_powers_g2[0], after.tau_powers_g2[1])) {
return false;
}
if !same_ratio(power_pairs(&after.tau_powers_g2), (after.tau_powers_g1[0], after.tau_powers_g1[1])) {
return false;
}
power_pairs是有个有意思的设计。为了验证所有的幂次对应的点计算是否正确,power_pairs将所有的幂次对应的点乘以单独的随机数,并错位累加。一次验证就能保证多个点是幂次递增关系。
bin
bin实现整个可信设置的协议,包括四种操作:1/new(创建初始的Accumulator) 2/ compute (贡献一次参数计算) 3/ verify (验证一次参加计算) 4/ beacon(贡献随机beacon的参数计算)。
重点梳理一下compute和verify的逻辑,其他逻辑类似。逻辑分别实现在compute_constrainted.rs和verify_transform_constrainted.rs。
compute接受challenge文件,生成response文件。verify接受challenge文件,上一次的response文件,生成new_challenge。

前一个challenge的hash值是作为下一个参与方生成密钥对的digest。某一个参与方生成的参数以及公钥信息会作为response,也是下一个参与方的challenge。因为上一个challenge的hash用于验证下一次的公钥的验证,从而确定了参与方的顺序。
整个协议的流程如下:
new -> compute -> (verify) compute … -> (verify) compute -> (verify) beacon

总结:
powersoftau,采用MPC以及随机Beacon,完成可信设置。通过POK算法实现可验证的密钥对,并建立和上一个参与方计算结果的绑定。参与可信设置的人数可扩展,并且参与方只需要按照顺序一个个的进行指定的计算即可。协调方在接收到某个参与方的计算后,验证后,发送给下一个参与方。
来源:Star Li
比推快讯
更多 >>- 伊朗外交部发言人称伊朗最高领袖和总统“安然无恙”
- 特朗普回应哈梅内伊身亡:我们认为这是真实的报道
- 福克斯:美方认为伊朗最高领袖哈梅内伊已丧生
- Polymarket 上“哈梅内伊是否会在 3 月 31 日前下台”的概率涨至 97%
- 伊朗伊斯兰革命卫队宣布关闭霍尔木兹海峡,但英国方面称其仍然开放
- 数据:若 ETH 跌破 1,809 美元,主流 CEX 累计多单清算强度将达 7.91 亿美元
- 数据:监测到 3,931.28 万 USDT 转出 Binance
- CZ 报平安:一切安好
- 数据:ETH 当前全网 8 小时平均资金费率为 -0.003%
- 美国 CIA 评估:即便哈梅内伊遇害,伊朗也会有强硬派人士接替
- Vitalik:EIP-8141 有望在一年内实现,全面解决账户抽象问题
- 分析:以太坊 MVRV 指标显示币价已处于长期底部区间
- 彭博社:比特币全天候交易,成为在其他市场关闭时表达宏观观点最具流动性资产
- 某巨鲸过去 6 小时卖出 500 枚 PAXG,预计获利 21.7 万美元
- 迪拜棕榈岛附近冒出浓烟并起火
- 伊朗外交部长:几乎所有官员都健康在世
- 网传伊朗最高领袖哈梅内伊已丧生,其 4 月前下台概率猛增至 72%
- 链上黄金于传统市场休市期间承接黑天鹅行情,凸显区块链优势
- USDD 2.0 供应挖矿第 XV 阶段正式开启
- 美以袭击前一小时精准预报,PolyBeats 成功挖掘多个内幕地址
- 比特币短时拉升 1.39%,突破 6.5 万美元
- 知情人士:伊朗国防部长和伊斯兰革命卫队司令身亡
- 11 名美国参议员要求联邦机构调查币安制裁合规情况
- 两年前 4.5 万美元建仓 WBTC 的鲸鱼近 3 周减持 60 枚,将获利 112.5 万美元
- 伊朗称目前发射导弹只是清库存 即将投入一系列“从未面世的神秘武器”
- 下周宏观展望:美以联手引爆中东火药桶,周五非农数据公布
- 美国已计划发起逐步升级的打击行动,并留有缓和余地
- 霍尔木兹海峡油轮运输陷入停滞
- 伊朗最高领袖哈梅内伊将向全国发表讲话
- 伯克希尔哈撒韦 Q4 运营利润同比下降近 30%
- Bubblemaps:六名疑似内部人士通过提前押注美国对伊朗袭击获利 120 万美元
- 阿联酋决定疏散世界最高塔哈利法塔
- 五角大楼披萨指数再次精准预警美国对伊动武
- 2 月份加密领域因漏洞攻击造成的损失约为 3,570 万美元
- Balaji 谈 Anthropic:政治和科技领域的原则往往是部落利益的伪装
- 以色列初步评估:针对伊朗高层的刺杀失败
- 观点:比特币资金费率降至-6%,潜在轧空条件形成
- 2026 年 2 月加密市场融资 8.64 亿美元,环比下降 19.3%
- 主流 Perp DEX 一览:多数平台持仓量已不足 10 亿美元,交易量较昨日再次下滑
- 某巨鲸自 2025 年 10 月起建仓 1240 万美元数字黄金,目前浮盈 352.1 万美元
- 美伊冲突全面爆发,比特币险守 6.3 万美元,黄金代币涨近 6%
- Bitget CandyBomb:交易任意币种解锁 34 万枚 ROBO 空投
- 伊朗:陆军总司令无恙,正在指挥陆军部队
- 美国高级官员:美方尚无人员伤亡
- 以色列空袭的目标包括伊朗最高领袖和总统
- 阿联酋阿布扎比市主要机场附近传来数声爆炸声
- 美国军队高官于海湖庄园指挥伊朗行动
- 观点:加密货币不幸成为周末避险事件中首选的做空对冲工具
- 链上 BTC 与 ETH 最大多头持仓合计亏超 1300 万美元,暂未减仓
- 伊朗最高国家安全委员会:已就美以军事行动予以回应
比推专栏
更多 >>- Big player's 『Trigger moment』|0227Europe
- 简街有没有「操纵」BTC?拆解 AP 制度,读懂 ETF 申赎机制背后的定价权博弈
- Happy new year【Horse success】|0213Asian
- Was it finished?|0206 Asian
- 围猎以太坊多头:「巨鲸」们暴亏 70 亿美元,正被集体围观
- Challenge,risk And chances|0130 Asian
- Meta 豪赌 AI:砸钱 1350 亿美元,2026 的扎克伯格,值得相信么?
- Variables: Terrible snowstorm|0128 Asian
- 英特尔「生死线」时刻:在 ICU 门前,陈立武如何清算遗产并开启自救?
- 從1月13號到今天,提前到5100|0126Asian
观点
比推热门文章
- 特朗普回应哈梅内伊身亡:我们认为这是真实的报道
- 福克斯:美方认为伊朗最高领袖哈梅内伊已丧生
- Polymarket 上“哈梅内伊是否会在 3 月 31 日前下台”的概率涨至 97%
- 伊朗伊斯兰革命卫队宣布关闭霍尔木兹海峡,但英国方面称其仍然开放
- 数据:若 ETH 跌破 1,809 美元,主流 CEX 累计多单清算强度将达 7.91 亿美元
- 数据:监测到 3,931.28 万 USDT 转出 Binance
- CZ 报平安:一切安好
- 数据:ETH 当前全网 8 小时平均资金费率为 -0.003%
- 美国 CIA 评估:即便哈梅内伊遇害,伊朗也会有强硬派人士接替
- Vitalik:EIP-8141 有望在一年内实现,全面解决账户抽象问题
比推 APP



