@ieigen/zkzru
Version:
An implementation of [ZK-ZKRollup](https://github.com/ieigen/ZKZRU) in which the relayer **does not** publish transaction data to the main chain, but only publishes the new Merkle root at every update. This provides gas savings but not data availability g
42 lines (35 loc) • 1.01 kB
JavaScript
const ffj = require("ffjavascript");
const buildEddsa = require("circomlibjs").buildEddsa;
const buildPoseidon = require("circomlibjs").buildPoseidon;
const buildBabyjub = require("circomlibjs").buildBabyjub;
const ethers = require("ethers");
const crypto = require("crypto");
module.exports = class TwistedElGamal {
constructor(babyJub, eddsa) {
this.babyJub = babyJub;
this.eddsa = eddsa;
}
random(size) {
return ethers.utils.randomBytes(size)
}
pubkey(sk) {
return this.eddsa.prv2pub(sk)
}
encrypt(publicKey, H, amount) {
const buf = crypto.randomBytes(32);
const r = ffj.Scalar.shr(ffj.Scalar.fromRprLE(buf, 0, 32), 3)
let c_l = this.babyJub.mulPointEscalar(publicKey, r)
let c_r = this.babyJub.addPoint(
this.babyJub.mulPointEscalar(this.babyJub.Base8, r),
this.babyJub.mulPointEscalar(H, amount)
);
return {
r: r,
c_l: c_l,
c_r: c_r
}
}
decrypt(sk, c_l, c_r) {
throw new Exception("not implemented")
}
}