You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
swarms/add-repo/zk-test/pedesen.zok

43 lines
1.2 KiB

import "utils/pack/bool/unpack256" as unpack256;
import "utils/casts/field_to_u32" as field_to_u32;
//计算 g^r
//第一步 :将field类型的r转换为bool[256]
//第二步:判断r的每一位上是否等于1 即 bool[i] == 1, 如果等于计算这一位的t=g^EXP[i]的值
//第三步:判断当前bool[i]的区间 即 EXP_PRAMA[i/16]
//第四步:循环左移g^EXP[16]^EXP[i/16]
//最终将 result = result *t,遍历256位将其累积计算 g^r的值
const u32[16] EXP_PRAMA = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
const u32[17] EXP =[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536];
const u32 MAX = 65536;
def commit(field r, field g) -> field {
field mut result = 1;
field mut t = 1;
field mut e = 1;
bool[256] exp_r = unpack256(r);
for u32 i in 0..256 {
for u32 j in 0..EXP_PRAMA[(255-i)/16] {
e = e * g ** MAX;
}
t = if exp_r[i] == true {
e *(g ** (EXP[(255-i)%16]))
} else {
1
};
result = result * t;
e = 1;
}
return result;
}
def main(private field r, field g, field expect_commit) {
field mut res_commit = commit(r,g);
assert(res_commit == expect_commit);
return ;
}