Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 18 additions & 10 deletions da-contracts/contracts/da-layers/eigenda/EigenDAL1DAValidator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -31,13 +38,14 @@ 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));

if (!isVerified) revert ProofNotVerified();
// Verify the risczero proof
risc0Verifier.verify(inclusionData.seal, inclusionData.imageId, inclusionData.journalDigest);

// 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 calculated on Risc0 guest) is correct
if (l2DAValidatorOutputHash != keccak256(abi.encodePacked(stateDiffHash, inclusionData.eigenDAHash)))
revert InvalidValidatorOutputHash();

output.stateDiffHash = stateDiffHash;
Expand Down
10 changes: 5 additions & 5 deletions l1-contracts/deploy-scripts/DeployL1.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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.eigenDARiscZeroVerifier == 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;
Expand Down Expand Up @@ -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(
Expand Down
12 changes: 5 additions & 7 deletions l1-contracts/deploy-scripts/DeployUtils.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ struct DataAvailabilityDeployedAddresses {
address availBridge;
address availL1DAValidator;
address eigenDAL1DAValidator;
address eigenDACertAndBlobVerifier;
address eigenDARiscZeroVerifier;
}

// solhint-disable-next-line gas-struct-packing
Expand Down Expand Up @@ -129,7 +129,7 @@ struct ContractsConfig {
bytes32 evmEmulatorHash;
address availL1DAValidator;
address eigenDAL1DAValidator;
address eigenDACertAndBlobVerifier;
address eigenDARiscZeroVerifier;
}

struct TokensConfig {
Expand Down Expand Up @@ -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_addr")) {
config.contracts.eigenDARiscZeroVerifier = toml.readAddress("$.contracts.eigenda_risc_zero_verifier_addr");
}

config.tokens.tokenWethAddress = toml.readAddress("$.tokens.token_weth_address");
Expand Down Expand Up @@ -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")) {
Expand Down
Loading