BSV 上零知识友好的哈希函数 MiMC

MiMC 是一个“零知识友好”的哈希函数,可以生成有效的零知识证明 (ZKP)。

之前,我们讨论了通过zk-SNARK,零知识证明可以应用于任何数学函数。在内部,需要将函数转换为电路,电路中只允许进行加法和乘法运算。虽然理论上所有函数都可以转换,但实际上某些函数的电路更小,并且它们的 ZKP 成本低于其他函数。例如,SHA256 需要大量位操作,因此在电路大小方面是最昂贵的。

MiMC 散列函数专门设计用于通过仅使用加法和乘法来最小化电路大小,从而最小化 ZKP 成本。同时确保反向工程散列的原像的难度不会降低。

哈希函数可以在许多应用中找到,例如承诺方案、签名和默克尔树。当需要高效的 ZKP 时,MiMC 是一个很好的候选哈希函数。

算法

为了散列单个数字 x,我们计算以下函数:

在这里插入图片描述

r 是轮数,Fᵢ 是第 i 轮的轮函数,k 是密钥。 是函数组合。

cᵢ 是圆形常数,c₀=0

在这里插入图片描述

r rounds of MiMC: Eₖ(x)

实现

下面是 MiMC 的一个实现:

static function hash(int x, int k) : int {
    int ret = 0;
    loop (ROUNDS) : i {
        // t = x + ci + k
        int t = (i == 0) ? x + k : ret + k + CONSTS[i];
        // ret = t^3
        ret = (t * t * t) % P;
    }

    return (ret + k) % P;
}

static function multiHash(static const int SIZE, int[SIZE] xs) : int {
    int ret = 0;
    loop (SIZE) : i {
        // Note the previous `ret` is used as the key for the next iteration.
        ret = (ret + xs[i] + hash(xs[i], ret)) % P;
    }
    return ret;
}
MiMC 合约

1 行的 hash() 计算 Eₖ(x)multiHash() 对任意长的输入 xs 进行哈希处理,其中中间结果 ret 被送入第 17 行的下一次迭代。所有操作都在模 P 中定义。

此处是对MiMC 合约的测试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sCrypt Web3应用开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值