Implemente un devnet OP Stack

Configuración de dependencia

Configuración del entorno e instalación de Golang

Primero, instale dependencias para el software Celestia y para Apila OP.

Repositorio de clones

A continuación, clone el repositorio:

bash

cd $HOME
git clone https://github.com/celestiaorg/optimism
cd optimism

Consulte la versión para ver la versión estable o la versión ascendente:

v1.2.0-OP_v1.7.0-CN_v0.12.4rebase-arribabash

git checkout tags/v1.2.0-OP_v1.7.0-CN_v0.12.4
git submodule update --init --recursive

Construir devnet

Construir definiciones de TypeScript para dependencias TS:

bash

cd $HOME
cd optimism
make

Establecer variables de entorno para iniciar la red:

bash

export SEQUENCER_BATCH_INBOX_ADDRESS=0xff00000000000000000000000000000000000000
export L2OO_ADDRESS=0x70997970C51812dc3A010C7d01b50e0d17dc79C8

Iniciar devnet

Inicie la red ejecutando:

bash

make devnet-up

Esto inicia la capa 1 (ETH), la capa 2 (op-geth), capa de disponibilidad de datos (Celestia), el secuenciador (op-node), remitente de lotes (op-batcher), servicio de compromiso estatal (op-proposer).

Ver los registros del devnet

Si desea ver los registros del devnet, ejecute el siguiente comando desde la raíz del directorio Optimism:

bash

make devnet-logs
Opcional: Consejos de docker

Encuentra una transacción

Ahora, verificaremos una transacción reciente en el L1 con:

bash

cast block latest --rpc-url localhost:8545

La salida de un bloque que contiene una transacción se verá así:

consola

baseFeePerGas        7
difficulty           2
extraData            0xd883010d04846765746888676f312e32312e33856c696e7578000000000000006b3afa42dce1f87f1f07a1ef569c4d43e41738ef93c865098bfa1458645f384e2e4498bcfe4ad9353ff1913a2e16162f496fafe5b0939a6c78fb5b503248d6da01
gasLimit             30000000
gasUsed              21568
hash                 0x1cb54d2369752ef73511c202ff9cdfd0eadf3a77b7aef0092bea63f2b5d57659
logsBloom            0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
miner                0x0000000000000000000000000000000000000000
mixHash              0x0000000000000000000000000000000000000000000000000000000000000000
nonce                0x0000000000000000
number               1141
parentHash           0x664bf4bb4a57dd5768a0a98991d77c58fb7a4e164c2581c79fb33ce9c3d4c250
receiptsRoot         0xaf8ff6af1180c8be9e4e8f3a5f882b3b227233f4abbefa479836d3721682a389
sealFields           []
sha3Uncles           0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347
size                 767
stateRoot            0xd4b998a35d20d98ed3488221f0c161a0a9572d3de66399482553c8e3d2fae751
timestamp            1699638350
withdrawalsRoot
totalDifficulty      2283
transactions:        [
  0x79a0a7a1b4936aafe7a37dbfb07a6a9e55c145a4ed6fd54f962649b4b7db8de7
]

Copie el hash de la transacción de transactions: <transaction-hash> y establecerlo como una variable:

bash

export TX_HASH=0x79a0a7a1b4936aafe7a37dbfb07a6a9e55c145a4ed6fd54f962649b4b7db8de7

Lea los datos de la llamada de transacción

Ahora lea los datos de la llamada de transacción en el L1:

bash

cast tx $TX_HASH --rpc-url localhost:8545

La salida se verá similar a la siguiente:

consola

blockHash            0x9f4dfae061b5ddd86f95a81be5daa0d7fe32e7f7f770f86dc375e0007d249bd2
blockNumber          24
from                 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
gas                  21572
gasPrice             1040676758
hash                 0xadd3a5dc0b8c605aeac891098e87cbaff43bb642896ebbf74f964c0690e46df2
input                0xce3500000000000000769074a923011bdda721eacc34c8a77c69c10f2b6c8e659f987e82f217a5340f
nonce                4
r                    0xaf5c1505c7dfcebca94d9a6a8c0caf99b6c87a8ed6d6c0b3161c9026f270a84f
s                    0x383ed2debf9f9055920cd7340418dda7e2bca6b989eb6992d83d123d4e322f2a
to                   0xFf00000000000000000000000000000000000901
transactionIndex     0
v                    0
value                0
yParity              0

PUNTA

Está buscando una transacción de bateador en la dirección 0xFf00000000000000000000000000000000000901.

Primero, elimine el prefijo 0xce. Ahora, establece el input como el INPUT variable y codificarlo como base64:

bash

export INPUT=ce3500000000000000769074a923011bdda721eacc34c8a77c69c10f2b6c8e659f987e82f217a5340f
export ENCODED_INPUT=$(echo "$INPUT" | xxd -r -p | base64)

PUNTA

Recuerda eliminar el 0xce prefijo!

Encuentra los datos sobre Celestia

Clonar el go-da repositorio:

bash

cd $HOME
git clone https://github.com/rollkit/go-da.git
cd go-da/proto/da

Ahora, de go-da/proto/da correr:

bash

grpcurl -proto da.proto -plaintext -d "{\"ids\": [{\"value\": \"$ENCODED_INPUT\"}]}" 127.0.0.1:26650 da.DAService.Get

¡Su resultado se verá similar al siguiente!

consola

{
  "blobs": [
    {
      "value": "AKUumhJ8FnuyVrBs38FDKEIAAAAAAZB42trhw/DDc4GFAlv4klkv5Zh4E16mmO5fpNOS1f5wzpds8YK3S0Rvs4ULLJj13euw+Ovdv6Q23zuV1ShROEvk5aptIT7bGmZunvc1OiKwJTXVbN0BiGm6k2zNWq78cNsT2ez3+nzQq84Ds28or/aKz/o1w4NpV7w4caZtgJomX71w96m63+xzYnarXLu7WWvRrwbeb6cW8R93YHXt1r4+TXCBGVe76obzf5JLTNu22gksD2cL+83D8DGjX0FKcwZD0VofkGmboKY1uTddu8704s2MwgNNe09s1bzw+n9Fq6fKFw7pvwJL200eCS0oFJ3HfPAEywnlgyyGQc89dh+98GD5TrdU4aNql9afmW+sDzJtC9S0fzLWYROOS0bvK3W7EvNpmWXe5qrdzKlBmv1LZi4ofrrxLHGmbYOaJhHsEn+B81lGUh33HDet8K9nVKKSF2+W3Xul6uPSxydPBwsv2GHskR+yfUlDbvyl1ROTvtS1zXlpEPz0M1e/RIIt57fVj0Gm7TgACAAA//+Qdel2AQ=="
    }
  ]
}

Mecanismo de retroceso Ethereum en OP Stack

El Mecanismo de retroceso de Ethereum permite que los rollups "caigan" a Ethereum u otra cadena EVM en caso de tiempo de inactividad o errores al enviar datos a Celestia.

Implementación de fallback

El mecanismo de retroceso de Ethereum se implementa en el celestiaorg/optimismo versión v1.1.0.

El op-batcher/batcher/driver.go y op-node/rollup/derive/calldata_source.go los archivos son parte del mecanismo de devolución de Ethereum en el op-batcher y op-node respectivamente.

En driver.go, el calldataTxCandidate la función es responsable de la ruta de escritura del retroceso de Ethereum. Esta función crea y envía una transacción a la dirección de la bandeja de entrada por lotes con los datos dados. Utiliza el subyacente txmgr para manejar el envío de transacciones y la gestión de precios del gas.

Si los datos de la transacción se pueden publicar como un blob a Celestia, reemplaza el calldata con un identificador de blob y envía la transacción con estos datos. Si no se puede publicar en Celestia, vuelve a Ethereum sin ningún cambio en la transacción.

El identificador de blob comienza con el prefijo especial 0xce, que se eligió como mnemotécnico para Celestia, e indica que los datos restantes deben interpretarse como un Block Height (8 bytes) y Blob Commitment (32 bytes) codificados por little-endian. La combinación de estos se puede usar más tarde para recuperar los calldata originales de Celestia.

Prefijo

8 bytes

32 bytes

0xce

Altura del Bloque

Compromiso de Blob

ir

func (l *BatchSubmitter) sendTransaction(
    txdata txData,
    queue *txmgr.Queue[txData],
    receiptsCh chan txmgr.TxReceipt[txData],
) {
    // ...
}

En calldata_source.go, el DataFromEVMTransactions la función define la ruta de lectura del retroceso de Ethereum. Esta función filtra todas las transacciones y devuelve los calldata de las transacciones que se envían a la dirección de la bandeja de entrada del lote desde la dirección del remitente del lote.

Si la calldata coincide con el prefijo de versión 0xce, se decodifica como un identificador de blob, el calldata original se recupera de Celestia y se devuelve para su derivación. Si la calldata no coincide con el prefijo, toda la calldata se devuelve para su derivación.

ir

func DataFromEVMTransactions(
    config *rollup.Config,
    batcherAddr common.Address,
    txs types.Transactions,
    log log.Logger
) ([]eth.Data, error) {
    // ...
}

Estas dos funciones trabajan juntas para garantizar que el mecanismo de retroceso de Ethereum funcione correctamente, lo que permite que el despliegue continúe funcionando incluso durante los períodos de inactividad en Celestia.

Probando el fallback

La prueba del mecanismo de retroceso de Ethereum se puede hacer con el go-da herramienta. La activación de una transacción de blob simultánea causará el op-batcher transacción de Blob a fallar, con un incorrect account sequence error, que desencadena una devolución a Ethereum.

Para activar la transacción, envíe este comando desde el mismo go/proto/da directorio:

bash

grpcurl -proto da.proto -plaintext -d '{"blobs": [{"value": "SGVsbG8gd28ybGQh"}]}' 127.0.0.1:26650 da.DAService.Submit

Alternativamente, puede apagar el local-celestia-devnet y vea que los registros de devnet de OP Stack muestran que el rollup ha vuelto al L1, en este caso Ethereum, para publicar datos.

Lotes de span

Los lotes de span se pueden habilitar configurando OP_BATCHER_BATCH_TYPE: 1 en tu docker-compose.yml archivo.

Tenga en cuenta que esto requiere que se configure el tiempo de activación de Delta. Para su devnet, debe establecer "l2GenesisDeltaTimeOffset": "0x0", en devnetL1-template.json. Esto permitirá lotes de tramo y se puede probar mediante el engrasado docker compose logs -f | grep batch_type que debe incluir batch_type=SpanBatch y batch_type=1.

Last updated