Skip to content

Commit

Permalink
lock all solidity versions to 0.8.16 for ease of using third party li…
Browse files Browse the repository at this point in the history
…bs. Adds working commitment encoding for SyncStep
  • Loading branch information
willemolding committed Sep 28, 2023
1 parent b15b490 commit 801435f
Show file tree
Hide file tree
Showing 12 changed files with 64 additions and 20 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[submodule "contracts/lib/forge-std"]
path = contracts/lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "contracts/lib/telepathy-contracts"]
path = contracts/lib/telepathy-contracts
url = https://github.com/succinctlabs/telepathy-contracts
2 changes: 1 addition & 1 deletion contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ ffi = true
libs = ['lib']
optimizer = true
optimizer_runs = 1_000_000_000
solc = "0.8.19"
solc = "0.8.16"
fs_permissions = [{ access = "read", path = "./test/data/"}]

[profile.default.optimizer_details]
Expand Down
1 change: 1 addition & 0 deletions contracts/lib/telepathy-contracts
Submodule telepathy-contracts added at 0f3c68
3 changes: 2 additions & 1 deletion contracts/remappings.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
ds-test/=lib/forge-std/lib/ds-test/src/
forge-std/=lib/forge-std/src/
forge-std/=lib/forge-std/src/
telepathy-libs/=lib/telepathy-contracts/src/libraries/
2 changes: 1 addition & 1 deletion contracts/script/SpectreDeployLocal.s.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
pragma solidity 0.8.16;

import "forge-std/Script.sol";
import "forge-std/safeconsole.sol";
Expand Down
2 changes: 1 addition & 1 deletion contracts/script/SpectreDeployYulLocal.s.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
pragma solidity 0.8.16;

import "forge-std/Script.sol";
import "forge-std/safeconsole.sol";
Expand Down
2 changes: 1 addition & 1 deletion contracts/snark-verifiers/committee_update_aggregated.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
pragma solidity 0.8.16;

contract Verifier {

Expand Down
2 changes: 1 addition & 1 deletion contracts/snark-verifiers/sync_step.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
pragma solidity 0.8.16;

contract Verifier {

Expand Down
2 changes: 1 addition & 1 deletion contracts/src/Spectre.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma solidity 0.8.16;

import { SyncStep } from "./SyncStep.sol";

Expand Down
28 changes: 16 additions & 12 deletions contracts/src/SyncStep.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma solidity 0.8.16;

import {SSZ} from "telepathy-libs/SimpleSerialize.sol";
import "forge-std/console.sol";

library SyncStep {
bytes32 constant DOMAIN = keccak256("sync-step"); // TODO: Fix this to the actual domain used for the given network

library SyncStep {
struct SyncStepArgs {
uint256 attestedSlot;
uint256 finalizedSlot;
Expand All @@ -17,17 +19,19 @@ library SyncStep {
* This must always match the prodecure used in lightclient-circuits/src/sync_step_circuit.rs - SyncStepCircuit::instance()
* @param args The arguments for the sync step
* @param keysPoseidonCommitment The commitment to the keys used in the sync step
* @return comm The public input commitment that can be sent to the verifier contract.
*/
function toInputCommitment(SyncStepArgs memory args, bytes32 keysPoseidonCommitment) internal pure returns (uint256 comm) {
// May need to convert to LE
bytes32 attestedSlotBytes = bytes32(args.attestedSlot);
bytes32 finalizedSlotBytes = bytes32(args.finalizedSlot);
bytes32 participationBytes = bytes32(args.participation);
function toInputCommitment(SyncStepArgs memory args, bytes32 keysPoseidonCommitment) internal view returns (uint256) {
bytes32 attestedSlotBytes = SSZ.toLittleEndian(args.attestedSlot);
bytes32 finalizedSlotBytes = SSZ.toLittleEndian(args.finalizedSlot);
bytes32 participationBytes = SSZ.toLittleEndian(args.participation);

bytes32 h = sha256(bytes.concat(attestedSlotBytes, finalizedSlotBytes));
h = sha256(bytes.concat(participationBytes, h));
h = sha256(bytes.concat(args.executionPayloadRoot, h));
h = sha256(bytes.concat(keysPoseidonCommitment, h));
comm = uint256(h) & ((uint256(1) << 253) - 1); // truncate to 253 bits
h = sha256(bytes.concat(h, participationBytes));
h = sha256(bytes.concat(h, args.executionPayloadRoot));
h = sha256(bytes.concat(h, keysPoseidonCommitment));

uint256 commitment = uint256(SSZ.toLittleEndian(uint256(h)));
return commitment & ((uint256(1) << 253) - 1); // truncated to 253 bits
}
}
2 changes: 1 addition & 1 deletion contracts/test/SpectreSyncStep.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;
pragma solidity 0.8.16;

import "forge-std/Script.sol";
import "forge-std/safeconsole.sol";
Expand Down
35 changes: 35 additions & 0 deletions contracts/test/SyncStep.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "forge-std/Test.sol";
import "forge-std/console.sol";
import {SSZ} from "telepathy-libs/SimpleSerialize.sol";
import {SyncStep} from "../src/SyncStep.sol";

contract SyncStepInputEncoding is Test {
using SyncStep for SyncStep.SyncStepArgs;

// attested_slot: 40
// finalized_slot: 24
// participation: 32
// executionPayloadRoot: d11151b7c53e3ed79401bcdbb74845bc99ed0de99d32ebee241fc58c1e8c68cb
// keys poseidon commitment: 02b0a3b579953718463ac4baa9987225c5d74b0a7b4193e51ae091f5a0aa1c11
// input_commitment: 8d387254c3f6a8074f1f4d78f99eec52a2a93104494d69ac6f52884780426019

function testToInputCommitment() public {
SyncStep.SyncStepArgs memory args = SyncStep.SyncStepArgs({
attestedSlot: 40,
finalizedSlot: 24,
participation: 32,
executionPayloadRoot: 0xd11151b7c53e3ed79401bcdbb74845bc99ed0de99d32ebee241fc58c1e8c68cb
});
bytes32 keysPoseidonCommitment = 0x02b0a3b579953718463ac4baa9987225c5d74b0a7b4193e51ae091f5a0aa1c11;

uint256 comm = args.toInputCommitment(keysPoseidonCommitment);

// expected commitment as a little endian bit integer expressed as hex
bytes32 expected = 0x8d387254c3f6a8074f1f4d78f99eec52a2a93104494d69ac6f52884780426019;

assertEq(SSZ.toLittleEndian(comm), expected, "Input commitment does not match");
}
}

0 comments on commit 801435f

Please sign in to comment.