Integrarse con contratos de Blobstream

Comenzando

Requisitos previos

Asegúrese de tener instalado lo siguiente:

Instalación de contratos Blobstream X

Utilizaremos la implementación de Blobstream X de Blobstream, para que podamos instalar su repositorio como una dependencia:

Instale el repositorio de contratos de Blobstream X como una dependencia:

sh

forge install succinctlabs/blobstreamx --no-commit

Asegúrese de que el directorio desde el que está ejecutando este comando sea un repositorio git inicializado. Si no, simplemente inicializa el repositorio usando:

sh

git init

Tenga en cuenta que la versión mínima del compilador Solidity para usar los contratos de Blobstream es 0.8.19.

Ejemplo de uso

Ejemplo de contrato de solidez mínimo para un stub ZK rollup que aprovecha el BlobstreamX.sol contrato para comprobar que los datos han sido publicados en Celestia:

solidez

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.19;

TBD
import "blobstream-contracts/IDAOracle.sol";
import "blobstream-contracts/DataRootTuple.sol";
import "blobstream-contracts/lib/tree/binary/BinaryMerkleProof.sol";

contract MyRollup {
    IDAOracle immutable blobstreamX;
    bytes32[] public rollup_block_hashes;

    constructor(IDAOracle _blobstreamX) {
        blobstreamX = _blobstreamX;
    }

    function submitRollupBlock(
        bytes32 _rollup_block_hash,
        bytes calldata _zk_proof,
        uint256 _blobstreamX_nonce,
        DataRootTuple calldata _tuple,
        BinaryMerkleProof calldata _proof
    ) public {
        // Verify that the data root tuple (analog. block header) has been
        // attested to by the Blobstream contract.
        require(
            blobstreamX.verifyAttestation(_blobstreamX_nonce, _tuple, _proof)
        );

        // Verify the ZKP (zero-knowledge proof).
        // _tuple.dataRoot is a public input, leaves (shares) are private inputs.
        require(verifyZKP(_rollup_block_hash, _zk_proof, _tuple.dataRoot));

        // Everything checks out, append rollup block hash to list.
        rollup_block_hashes.push(_rollup_block_hash);
    }

    function verifyZKP(
        bytes32 _rollup_block_hash,
        bytes calldata _zk_proof,
        bytes32 _data_root
    ) private pure returns (bool) {
        return true;
    }
}

Estructuras de datos

Cada DataRootTuple es una tupla de altura de bloque y raíz de datos. Es análogo a un encabezado de bloque Celestia. DataRootTuples se retransmiten en lotes, comprometidos como a DataRootTupleraíz S (es decir, una raíz Merkle de DataRootTuples).

El BinaryMerkleProof es un RFC-6962- conforme a la prueba Merkle. Desde DataRootTuples son Merkleized en un árbol Merkle binario, verificando la inclusión de un DataRootTuple contra a DataRootTuplela raíz de S requiere verificar una prueba de inclusión de Merkle.

Interfaz

El IDAOracle (Data Adisponibilidad Ola interfaz de Racle Interface) permite que los contratos L2 en Ethereum consulten el BlobstreamX.sol contrato para retransmitido DataRootTuples. El método de interfaz única verifyAttestation verifica una prueba de inclusión de Merkle que a DataRootTuple se incluye en un lote específico (indexado por el lote nonce). En otras palabras, verifica análogamente que se incluye un encabezado de bloque específico en la cadena Celestia.

Consultando la prueba

Para probar que los datos fueron publicados a Celestia, consulte el documentación de consultas de prueba para comprender cómo consultar las pruebas de los nodos de consenso de Celestia y hacerlas utilizables en el contrato del verificador Blobstream X.

Verificación de la inclusión de datos para pruebas de fraude

Se puede encontrar una descripción general de alto nivel de cómo un L2 basado en el fraude interactuaría con Blobstream en documentación de pruebas de inclusión.

El DAVerifier la biblioteca está disponible en blobstream-contracts/lib/verifier/DAVerifier.sol, y proporciona funciones para verificar la inclusión de acciones individuales (o múltiples) contra a DataRootTuple. La biblioteca es apátrida y permite pasar un IDAOracle interfaz como parámetro para verificar la inclusión en su contra.

En el DAVerifier biblioteca, encontramos funciones que ayudan con la verificación de inclusión de datos y el cálculo del tamaño cuadrado de un bloque Celestia. Estas funciones funcionan con el contrato inteligente Blobstream X, utilizando diferentes pruebas para verificar y confirmar la disponibilidad de los datos. Veamos más de cerca estas funciones:

  • verifySharesToDataRootTupleRoot: Esta función verifica que las acciones, que se publicaron en Celestia, fueron comprometidas por el contrato inteligente de Blobstream X. Comprueba que el contrato inteligente de Blobstream X comprometió la raíz de datos y que las raíces de las filas comprometieron las acciones.

  • verifyRowRootToDataRootTupleRoot: Esta función verifica que una raíz de fila/columna, de un bloque Celestia, fue comprometida por el contrato inteligente Blobstream X. Comprueba que el contrato inteligente de Blobstream X haya comprometido la raíz de datos y que la raíz de fila se comprometa con la raíz de datos.

  • verifyMultiRowRootsToDataRootTupleRoot: Esta función verifica que un conjunto de filas/columnas, desde un bloque Celestia, fueron comprometidas por el contrato inteligente Blobstream X. Comprueba que el contrato inteligente de Blobstream X haya comprometido la raíz de datos y que las raíces de las filas se comprometan con la raíz de datos.

  • computeSquareSizeFromRowProof: Esta función calcula el tamaño cuadrado del bloque Celestia desde una raíz de fila/columna hasta la prueba binaria Merkle de raíz de datos. Es responsabilidad del usuario verificar que la prueba es válida y se comprometió con éxito a utilizar el verifyRowRootToDataRootTupleRoot() método.

  • computeSquareSizeFromShareProof: Esta función calcula el tamaño cuadrado del bloque Celestia de una acción a prueba de raíz de fila/columna. Es responsabilidad del usuario verificar que la prueba es válida y que las acciones se comprometieron con éxito a utilizar el verifySharesToDataRootTupleRoot() método.

Para obtener una descripción general de una implementación de implementación de demostración, diríjase a la siguiente sección.

Last updated