Skip to content

Commit

Permalink
upgrade to Zig v0.12
Browse files Browse the repository at this point in the history
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
  • Loading branch information
jsign committed May 4, 2024
1 parent c1fb71f commit a7c10d7
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 25 deletions.
14 changes: 1 addition & 13 deletions build.zig
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
const std = @import("std");
const Builder = std.build.Builder;

// Although this function looks imperative, note that its job is to
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});

// Standard optimization options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
// set a preferred release mode, allowing the user to decide how to optimize.
const optimize = b.standardOptimizeOption(.{});

_ = b.addModule("poseidon", Builder.CreateModuleOptions{ .source_file = .{ .path = "src/poseidon.zig" } });
_ = b.addModule("poseidon", .{ .root_source_file = .{ .path = "src/poseidon.zig" } });

const exe = b.addExecutable(.{
.name = "zig-poseidon",
Expand Down
8 changes: 4 additions & 4 deletions src/bn254/tests.zig
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ test "circomlib compatibility" {
}

fn test_run(comptime test_cases: []const test_case) !void {
var allocator = std.testing.allocator;
const allocator = std.testing.allocator;
var bn254_params = try parameters.get_babyjubjub_parameters(allocator);
defer bn254_params.deinit();

Expand All @@ -44,16 +44,16 @@ fn test_run(comptime test_cases: []const test_case) !void {

var frs: [tc.v.len]Fr.NonMontgomeryDomainFieldElement = undefined;
for (tc.v, 0..) |v, i| {
std.mem.writeIntLittle(u256, &buf, v);
std.mem.writeInt(u256, &buf, v, .little);
var nonMont: Fr.NonMontgomeryDomainFieldElement = undefined;
Fr.fromBytes(&nonMont, buf);
Fr.toMontgomery(&frs[i], nonMont);
}

var hash = instance.hash(frs);
const hash = instance.hash(frs);

Fr.toBytes(&buf, hash);
const res = std.mem.readInt(u256, &buf, std.builtin.Endian.Little);
const res = std.mem.readInt(u256, &buf, .little);

try std.testing.expect(tc.exp_hash == res);
}
Expand Down
16 changes: 8 additions & 8 deletions src/parameters.zig
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ pub fn PoseidonFamilyParameters(comptime Fr: type) type {
for (0..parameters.value.C.len) |i| {
ret.C[i] = try allocator.alloc(Fr.MontgomeryDomainFieldElement, parameters.value.C[i].len);
for (0..parameters.value.C[i].len) |j| {
var fe = try std.fmt.parseInt(u256, parameters.value.C[i][j], 0);
const fe = try std.fmt.parseInt(u256, parameters.value.C[i][j], 0);
var buf: [32]u8 = undefined;
std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
std.mem.writeInt(@TypeOf(fe), &buf, fe, .little);
Fr.fromBytes(&ret.C[i][j], buf);
Fr.toMontgomery(&ret.C[i][j], ret.C[i][j]);
}
Expand All @@ -53,9 +53,9 @@ pub fn PoseidonFamilyParameters(comptime Fr: type) type {
for (0..parameters.value.M[i].len) |j| {
ret.M[i][j] = try allocator.alloc(Fr.MontgomeryDomainFieldElement, parameters.value.M[i][j].len);
for (0..parameters.value.M[i][j].len) |k| {
var fe = try std.fmt.parseInt(u256, parameters.value.M[i][j][k], 0);
const fe = try std.fmt.parseInt(u256, parameters.value.M[i][j][k], 0);
var buf: [32]u8 = undefined;
std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
std.mem.writeInt(@TypeOf(fe), &buf, fe, .little);
Fr.fromBytes(&ret.M[i][j][k], buf);
Fr.toMontgomery(&ret.M[i][j][k], ret.M[i][j][k]);
}
Expand All @@ -67,9 +67,9 @@ pub fn PoseidonFamilyParameters(comptime Fr: type) type {
for (0..parameters.value.P[i].len) |j| {
ret.P[i][j] = try allocator.alloc(Fr.MontgomeryDomainFieldElement, parameters.value.P[i][j].len);
for (0..parameters.value.P[i][j].len) |k| {
var fe = try std.fmt.parseInt(u256, parameters.value.P[i][j][k], 0);
const fe = try std.fmt.parseInt(u256, parameters.value.P[i][j][k], 0);
var buf: [32]u8 = undefined;
std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
std.mem.writeInt(@TypeOf(fe), &buf, fe, .little);
Fr.fromBytes(&ret.P[i][j][k], buf);
Fr.toMontgomery(&ret.P[i][j][k], ret.P[i][j][k]);
}
Expand All @@ -79,9 +79,9 @@ pub fn PoseidonFamilyParameters(comptime Fr: type) type {
for (0..parameters.value.S.len) |i| {
ret.S[i] = try allocator.alloc(Fr.MontgomeryDomainFieldElement, parameters.value.S[i].len);
for (0..parameters.value.S[i].len) |j| {
var fe = try std.fmt.parseInt(u256, parameters.value.S[i][j], 0);
const fe = try std.fmt.parseInt(u256, parameters.value.S[i][j], 0);
var buf: [32]u8 = undefined;
std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
std.mem.writeInt(@TypeOf(fe), &buf, fe, .little);
Fr.fromBytes(&ret.S[i][j], buf);
Fr.toMontgomery(&ret.S[i][j], ret.S[i][j]);
}
Expand Down
125 changes: 125 additions & 0 deletions src/parameters2.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
const std = @import("std");
const BN254Fr = @import("bn254/fr.zig");

const BN254W2 = PoseidonParameters(
BN254Fr,
2,
4,
56,
@embedFile("bn254/optimized_poseidon_constants.json"),
);

fn PoseidonParameters(
comptime ScalarField: type,
comptime w: u8,
comptime partial_rounds: u8,
comptime half_full_rounds: u8,
comptime json_spec: []const u8,
) type {
_ = half_full_rounds;
_ = partial_rounds;
_ = w;
_ = ScalarField;
var alloc_buf: [10 * (1 << 20)]u8 = undefined;
var fba = std.heap.FixedBufferAllocator.init(&alloc_buf);
var allocator = fba.allocator();

const ParametersJSON = struct {
C: [][][]const u8,
M: [][][][]const u8,
P: [][][][]const u8,
S: [][][]const u8,
};
var parameters = try std.json.parseFromSliceLeaky(
ParametersJSON,
allocator,
json_spec,
.{},
);
defer parameters.deinit();

// if (w - 2 >= parameters.C.len) {
// @compileError("width isn't supported");
// }
// const _Fr = ScalarField;

// const Parameters = struct {
// C: [w * (half_full_rounds + 1) + partial_rounds + (half_full_rounds - 1) * w]_Fr.MontgomeryDomainFieldElement,
// M: [w][w]_Fr.MontgomeryDomainFieldElement,
// P: [w][w]_Fr.MontgomeryDomainFieldElement,
// S: [(w + (w - 1)) * partial_rounds]_Fr.MontgomeryDomainFieldElement,
// };
// const ret: Parameters = undefined;

// const i = w;
// for (0..parameters.value.C[i].len) |j| {
// var fe = try std.fmt.parseInt(u256, parameters.value.C[i][j], 0);
// var buf: [32]u8 = undefined;
// std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
// _Fr.fromBytes(&ret.C[i][j], buf);
// _Fr.toMontgomery(&ret.C[i][j], ret.C[i][j]);
// }

// for (0..parameters.value.M[i].len) |j| {
// for (0..parameters.value.M[i][j].len) |k| {
// var fe = try std.fmt.parseInt(u256, parameters.value.M[i][j][k], 0);
// var buf: [32]u8 = undefined;
// std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
// _Fr.fromBytes(&ret.M[i][j][k], buf);
// _Fr.toMontgomery(&ret.M[i][j][k], ret.M[i][j][k]);
// }
// }

// for (0..parameters.value.P[i].len) |j| {
// for (0..parameters.value.P[i][j].len) |k| {
// var fe = try std.fmt.parseInt(u256, parameters.value.P[i][j][k], 0);
// var buf: [32]u8 = undefined;
// std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
// _Fr.fromBytes(&ret.P[i][j][k], buf);
// _Fr.toMontgomery(&ret.P[i][j][k], ret.P[i][j][k]);
// }
// }

// for (0..parameters.value.S[i].len) |j| {
// var fe = try std.fmt.parseInt(u256, parameters.value.S[i][j], 0);
// var buf: [32]u8 = undefined;
// std.mem.writeIntLittle(@TypeOf(fe), &buf, fe);
// _Fr.fromBytes(&ret.S[i][j], buf);
// _Fr.toMontgomery(&ret.S[i][j], ret.S[i][j]);
// }

// return struct {
// const Fr = _Fr;
// const MontFr = Fr.MontgomeryDomainFieldElement;
// const NonMontFr = Fr.NonMontgomeryDomainFieldElement;

// const width = w;
// const F_r: u8 = partial_rounds;
// const F_P: u8 = half_full_rounds;

// const C: [w * (half_full_rounds + 1) + partial_rounds + (half_full_rounds - 1) * w]MontFr = ret.C;
// const M: [w][w]MontFr = ret.M;
// const P: [w][w]MontFr = ret.P;
// const S: [(w + (w - 1)) * partial_rounds]MontFr = ret.S;
// };
return struct {};
}

test "l" {
comptime {
var alloc_buf: [10 * (1 << 20)]u8 = undefined;
var fba = std.heap.FixedBufferAllocator.init(&alloc_buf);
const Test = struct {
C: [][]const u8,
};
const foo = try std.json.parseFromSliceLeaky(
Test,
fba.allocator(),
"{ \"C\": [[1, 2, 3]] }",
.{},
);
_ = foo;
}

// _ = BN254W2;
}

0 comments on commit a7c10d7

Please sign in to comment.