From bad0ee4418fe421de41572300ca4da177c68b434 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Fri, 9 May 2025 13:56:07 -0300 Subject: [PATCH 1/4] Replace cert and blob verifier with risczero --- .../eigenda/EigenDAL1DAValidator.sol | 35 ++++++++++++++----- l1-contracts/deploy-scripts/DeployL1.s.sol | 10 +++--- l1-contracts/deploy-scripts/DeployUtils.s.sol | 12 +++---- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol b/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol index 056ba50ad7..4ec5a24b1b 100644 --- a/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol +++ b/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol @@ -5,18 +5,25 @@ pragma solidity 0.8.28; import {IL1DAValidator, L1DAValidatorOutput} from "../../IL1DAValidator.sol"; import {OperatorDAInputTooSmall} from "../../DAContractsErrors.sol"; -interface IEigenDABlobProofRegistry { - function isVerified(bytes calldata inclusion_data) external view returns (bool, bytes32); +interface IRiscZeroVerifier { + function verify(bytes calldata seal, bytes32 imageId, bytes32 journalDigest) external view; +} + +struct EigenDAInclusionData { + bytes seal, + bytes32 imageId, + bytes32 journalDigest, + bytes32 eigenDAHash, } contract EigenDAL1DAValidator is IL1DAValidator { error InvalidValidatorOutputHash(); error ProofNotVerified(); - IEigenDABlobProofRegistry public eigenDACertAndBlobVerifier; + IRiscZeroVerifier public risc0Verifier; - constructor(address eigendaCertAndBlobVerifierAddress) { - eigenDACertAndBlobVerifier = IEigenDABlobProofRegistry(eigendaCertAndBlobVerifierAddress); + constructor(address risc0VerifierAddress) { + risc0Verifier = IRiscZeroVerifier(risc0VerifierAddress); } function checkDA( @@ -31,13 +38,23 @@ contract EigenDAL1DAValidator is IL1DAValidator { } bytes32 stateDiffHash = bytes32(operatorDAInput[:32]); - // Check that the proof for the given inclusion data was verified in the EigenDA CertAndBlobVerifier contract - (bool isVerified, bytes32 eigenDAHash) = eigenDACertAndBlobVerifier.isVerified(operatorDAInput[32:]); + // Decode the inclusion data from the operatorDAInput + EigenDAInclusionData memory inclusionData = abi.decode( + operatorDAInput[32:], + (EigenDAInclusionData) + ); + + // Verify the risczero proof + risc0Verifier.verify( + inclusionData.seal, + inclusionData.imageId, + inclusionData.journalDigest + ); if (!isVerified) revert ProofNotVerified(); - // Check that the eigenDAHash from the EigenDACertAndBlobVerifier (originally calculted on Risc0 guest) is correct - if (l2DAValidatorOutputHash != keccak256(abi.encodePacked(stateDiffHash, eigenDAHash))) + // Check that the eigenDAHash from the Inclusion Data (originally calculted on Risc0 guest) is correct + if (l2DAValidatorOutputHash != keccak256(abi.encodePacked(stateDiffHash, inclusionData.eigenDAHash))) revert InvalidValidatorOutputHash(); output.stateDiffHash = stateDiffHash; diff --git a/l1-contracts/deploy-scripts/DeployL1.s.sol b/l1-contracts/deploy-scripts/DeployL1.s.sol index f2244a48e5..f5ce48c503 100644 --- a/l1-contracts/deploy-scripts/DeployL1.s.sol +++ b/l1-contracts/deploy-scripts/DeployL1.s.sol @@ -284,10 +284,10 @@ contract DeployL1Script is Script, DeployUtils { } if (config.contracts.eigenDAL1DAValidator == address(0)) { - if (config.contracts.eigenDACertAndBlobVerifier == address(0)) { - console.log("EigenDACertAndBlobVerifier not deployed, do not use for production"); + if (config.contracts.eigenda_risczero_verifier == address(0)) { + console.log("EigenDARiscZeroVerifier not deployed, do not use for production"); } - addresses.daAddresses.eigenDACertAndBlobVerifier = config.contracts.eigenDACertAndBlobVerifier; + addresses.daAddresses.eigenDARiscZeroVerifier = config.contracts.eigenDARiscZeroVerifier; addresses.daAddresses.eigenDAL1DAValidator = deploySimpleContract("EigenDAL1DAValidator", false); } else { addresses.daAddresses.eigenDAL1DAValidator = config.contracts.eigenDAL1DAValidator; @@ -604,8 +604,8 @@ contract DeployL1Script is Script, DeployUtils { vm.serializeAddress( "deployed_addresses", - "eigenda_cert_and_blob_verifier_addr", - addresses.daAddresses.eigenDACertAndBlobVerifier + "eigenda_risc_zero_verifier_addr", + addresses.daAddresses.eigenDARiscZeroVerifier ); string memory deployedAddresses = vm.serializeAddress( diff --git a/l1-contracts/deploy-scripts/DeployUtils.s.sol b/l1-contracts/deploy-scripts/DeployUtils.s.sol index 4c1b609789..32f2485f10 100644 --- a/l1-contracts/deploy-scripts/DeployUtils.s.sol +++ b/l1-contracts/deploy-scripts/DeployUtils.s.sol @@ -64,7 +64,7 @@ struct DataAvailabilityDeployedAddresses { address availBridge; address availL1DAValidator; address eigenDAL1DAValidator; - address eigenDACertAndBlobVerifier; + address eigenDARiscZeroVerifier; } // solhint-disable-next-line gas-struct-packing @@ -129,7 +129,7 @@ struct ContractsConfig { bytes32 evmEmulatorHash; address availL1DAValidator; address eigenDAL1DAValidator; - address eigenDACertAndBlobVerifier; + address eigenDARiscZeroVerifier; } struct TokensConfig { @@ -212,10 +212,8 @@ abstract contract DeployUtils is Create2FactoryUtils { config.contracts.eigenDAL1DAValidator = toml.readAddress("$.contracts.eigenda_l1_validator"); } - if (vm.keyExistsToml(toml, "$.contracts.eigenda_cert_and_blob_verifier_addr")) { - config.contracts.eigenDACertAndBlobVerifier = toml.readAddress( - "$.contracts.eigenda_cert_and_blob_verifier_addr" - ); + if (vm.keyExistsToml(toml, "$.contracts.eigenda_risc_zero_verifier")) { + config.contracts.eigenDARiscZeroVerifier = toml.readAddress("$.contracts.eigenda_risc_zero_verifier"); } config.tokens.tokenWethAddress = toml.readAddress("$.tokens.token_weth_address"); @@ -446,7 +444,7 @@ abstract contract DeployUtils is Create2FactoryUtils { } else if (compareStrings(contractName, "DummyAvailBridge")) { return abi.encode(); } else if (compareStrings(contractName, "EigenDAL1DAValidator")) { - return abi.encode(addresses.daAddresses.eigenDACertAndBlobVerifier); + return abi.encode(addresses.daAddresses.eigenDARiscZeroVerifier); } else if (compareStrings(contractName, "Verifier")) { return abi.encode(addresses.stateTransition.verifierFflonk, addresses.stateTransition.verifierPlonk); } else if (compareStrings(contractName, "VerifierFflonk")) { From cdfc182fc2ac7553b87983cc20bd01a923e13e2e Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Fri, 9 May 2025 14:00:00 -0300 Subject: [PATCH 2/4] Fix compilation --- .../eigenda/EigenDAL1DAValidator.sol | 21 ++++++------------- l1-contracts/deploy-scripts/DeployL1.s.sol | 2 +- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol b/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol index 4ec5a24b1b..c0d2d2b29b 100644 --- a/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol +++ b/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol @@ -10,10 +10,10 @@ interface IRiscZeroVerifier { } struct EigenDAInclusionData { - bytes seal, - bytes32 imageId, - bytes32 journalDigest, - bytes32 eigenDAHash, + bytes seal; + bytes32 imageId; + bytes32 journalDigest; + bytes32 eigenDAHash; } contract EigenDAL1DAValidator is IL1DAValidator { @@ -39,19 +39,10 @@ contract EigenDAL1DAValidator is IL1DAValidator { bytes32 stateDiffHash = bytes32(operatorDAInput[:32]); // Decode the inclusion data from the operatorDAInput - EigenDAInclusionData memory inclusionData = abi.decode( - operatorDAInput[32:], - (EigenDAInclusionData) - ); + EigenDAInclusionData memory inclusionData = abi.decode(operatorDAInput[32:], (EigenDAInclusionData)); // Verify the risczero proof - risc0Verifier.verify( - inclusionData.seal, - inclusionData.imageId, - inclusionData.journalDigest - ); - - if (!isVerified) revert ProofNotVerified(); + risc0Verifier.verify(inclusionData.seal, inclusionData.imageId, inclusionData.journalDigest); // Check that the eigenDAHash from the Inclusion Data (originally calculted on Risc0 guest) is correct if (l2DAValidatorOutputHash != keccak256(abi.encodePacked(stateDiffHash, inclusionData.eigenDAHash))) diff --git a/l1-contracts/deploy-scripts/DeployL1.s.sol b/l1-contracts/deploy-scripts/DeployL1.s.sol index f5ce48c503..189ffcc46a 100644 --- a/l1-contracts/deploy-scripts/DeployL1.s.sol +++ b/l1-contracts/deploy-scripts/DeployL1.s.sol @@ -284,7 +284,7 @@ contract DeployL1Script is Script, DeployUtils { } if (config.contracts.eigenDAL1DAValidator == address(0)) { - if (config.contracts.eigenda_risczero_verifier == address(0)) { + if (config.contracts.eigenDARiscZeroVerifier == address(0)) { console.log("EigenDARiscZeroVerifier not deployed, do not use for production"); } addresses.daAddresses.eigenDARiscZeroVerifier = config.contracts.eigenDARiscZeroVerifier; From fceb735278f003c22b0bdb886f91ceb960d9c865 Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Tue, 13 May 2025 10:15:48 -0300 Subject: [PATCH 3/4] Fix risc zero verifier deploy --- l1-contracts/deploy-scripts/DeployUtils.s.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l1-contracts/deploy-scripts/DeployUtils.s.sol b/l1-contracts/deploy-scripts/DeployUtils.s.sol index 32f2485f10..60b2f76037 100644 --- a/l1-contracts/deploy-scripts/DeployUtils.s.sol +++ b/l1-contracts/deploy-scripts/DeployUtils.s.sol @@ -212,8 +212,8 @@ abstract contract DeployUtils is Create2FactoryUtils { config.contracts.eigenDAL1DAValidator = toml.readAddress("$.contracts.eigenda_l1_validator"); } - if (vm.keyExistsToml(toml, "$.contracts.eigenda_risc_zero_verifier")) { - config.contracts.eigenDARiscZeroVerifier = toml.readAddress("$.contracts.eigenda_risc_zero_verifier"); + if (vm.keyExistsToml(toml, "$.contracts.eigenda_risc_zero_verifier_addr")) { + config.contracts.eigenDARiscZeroVerifier = toml.readAddress("$.contracts.eigenda_risc_zero_verifier_addr"); } config.tokens.tokenWethAddress = toml.readAddress("$.tokens.token_weth_address"); From b894f2460baf1e152a0918efcc713a1aa238dd7b Mon Sep 17 00:00:00 2001 From: Gianbelinche <39842759+gianbelinche@users.noreply.github.com> Date: Fri, 23 May 2025 17:19:08 -0300 Subject: [PATCH 4/4] Fix typo --- .../contracts/da-layers/eigenda/EigenDAL1DAValidator.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol b/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol index c0d2d2b29b..f468f9573a 100644 --- a/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol +++ b/da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol @@ -44,7 +44,7 @@ contract EigenDAL1DAValidator is IL1DAValidator { // Verify the risczero proof risc0Verifier.verify(inclusionData.seal, inclusionData.imageId, inclusionData.journalDigest); - // Check that the eigenDAHash from the Inclusion Data (originally calculted on Risc0 guest) is correct + // Check that the eigenDAHash from the Inclusion Data (originally calculated on Risc0 guest) is correct if (l2DAValidatorOutputHash != keccak256(abi.encodePacked(stateDiffHash, inclusionData.eigenDAHash))) revert InvalidValidatorOutputHash();