> ## Documentation Index
> Fetch the complete documentation index at: https://docs.optimism.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 커스텀 백엔드

> kona-derive와 kona-executor의 데이터 소스 trait을 구현하여 zkVM이나 TEE 같은 커스텀 검증 가능 백엔드에서 OP Stack STF를 실행합니다.

이 가이드에서는 `kona-client` 또는 그 변형을 원하는 검증 가능 백엔드에서 실행할 수 있도록 해 주는 데이터 소스 trait을 구현하는 과정을 안내합니다. 시작하기 전에, [OP Stack STF 이해하기](https://docs.optimism.io/ko/op-stack/fault-proofs/kona/proof/stf.md)에서 다루는 두 가지 구성 요소인 derivation 파이프라인과 실행 엔진에 익숙해져 있어야 합니다.

## 백엔드 Trait

이 문서의 [FPVM 백엔드](https://docs.optimism.io/ko/op-stack/fault-proofs/kona/proof/fpvm-backend.md) 섹션에서 다룬 것처럼, `kona-client`에는 [PreimageOracle ABI][preimage-specs]를 통해 데이터를 가져오는
`kona-derive` 및 `kona-executor` 데이터 소스 trait의 구현이 포함되어 있습니다.

하지만 이러한 데이터 소스 trait을 커스텀 구현하면, zkVM이나 TEE와 같은 다른 검증 가능 환경 위에서
`kona-client`를 실행하는 것도 가능합니다.

[`op-succinct`](https://github.com/succinctlabs/op-succinct)는 커스텀 백엔드와 커스텀 프로그램 모두의 훌륭한 예시입니다.
[sp1\_lib::io](https://docs.rs/sp1-lib/latest/sp1_lib/io/index.html)를 기반으로 `kona-derive`와 `kona-executor`의 데이터 소스 trait을 모두 구현하여
다음을 수행합니다.

1. `kona-client`를 그대로 실행하여 단일 블록의 derivation과 실행을 SP-1에서 증명합니다.
2. `kona-derive`와 `kona-executor`를 사용하여 [Span Batch](https://specs.optimism.io/protocol/delta/span-batches.html#span-batches)
   하나 분량의 L2 블록 전체를 도출하고 실행합니다.

이 섹션에서는 다른 플랫폼에서도 같은 작업을 수행하는 방법을 설명합니다.

### 커스텀 `kona-derive` 소스

시작하기 전에, 다음 trait의 커스텀 구현을 만들어야 합니다.

| Trait | 설명 |
| - | - |
| [`ChainProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.ChainProvider.html) | `ChainProvider` trait은 L2 체인 derivation 중에 L1에서 데이터를 가져오기 위한 최소한의 인터페이스를 정의합니다. |
| [`L2ChainProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.L2ChainProvider.html) | `ChainProvider` trait은 L2 체인 derivation 중에 safe L2 체인에서 데이터를 가져오기 위한 최소한의 인터페이스를 정의합니다. |
| [`BlobProvider`](https://docs.rs/kona-derive/latest/kona_derive/trait.BlobProvider.html) | `BlobProvider` trait은 L2 체인 derivation 중에 L1 consensus layer에서 EIP-4844 blob을 가져오기 위한 인터페이스를 정의합니다. |

이들을 구현하고 나면, 데이터 소스를 `PipelineBuilder`에 전달하기만 하면 파이프라인을 간단히 구성할 수 있습니다. 플랫폼에 따라 수신 데이터의 검증 요구 사항이 다르다는 점에 유의하십시오. 예를 들어, zkVM을
대상으로 하는 프로그램은 수신 데이터가 실제로 유효하다는 제약을 걸어야 하지만, 결함 증명 프로그램은 이 검증을 host의 온체인 구현에 맡길 수 있습니다.

```rust theme={null}
let chain_provider = ...;
let l2_chain_provider = ...;
let blob_provider = ...;
let l1_origin = ...;

let cfg = Arc::new(RollupConfig::default());
let l1_cfg = Arc::new(L1ChainConfig::default());
let attributes = StatefulAttributesBuilder::new(
   cfg.clone(),
   l1_cfg,
   l2_chain_provider.clone(),
   chain_provider.clone(),
   None, // interop dependency set; required when interop is scheduled
);
let dap = EthereumDataSource::new_from_parts(
   chain_provider.clone(),
   blob_provider,
   cfg.as_ref()
);

// Construct a new derivation pipeline.
let pipeline = PipelineBuilder::new()
   .rollup_config(cfg)
   .dap_source(dap)
   .l2_chain_provider(l2_chain_provider)
   .chain_provider(chain_provider)
   .builder(attributes)
   .origin(l1_origin)
   .build_polled();
```

여기서부터는 원하는 실행 페이로드를 생성하기 위한 커스텀 derivation 드라이버가 필요합니다. `kona-client`의 예시는
[단일 증명 구현](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/bin/client/src/single.rs)에서 확인할 수 있습니다.

### `kona-mpt` / `kona-executor` 소스

시작하기 전에, 다음 trait의 커스텀 구현을 만들어야 합니다.

| Trait | 설명 |
| - | - |
| [`TrieProvider`](https://docs.rs/kona-mpt/latest/kona_mpt/trait.TrieProvider.html) | `TrieProvider` trait은 L2 체인에서 페이로드를 실행하는 동안 trie 노드 preimage와 체인 정보를 가져오기 위한 인터페이스를 정의합니다. |
| [`TrieDBHinter`](https://docs.rs/kona-mpt/latest/kona_mpt/trait.TrieHinter.html) | `TrieDBHinter` trait은 클라이언트가 사용할 trie 증명 preimage를 준비하도록 host 프로그램에 요청하기 위한 인터페이스를 정의합니다. zkVM처럼 witness를 사전에 생성하는 타깃을 위해 no-op hinter가 [`NoopTrieHinter`](https://docs.rs/kona-mpt/latest/kona_mpt/struct.NoopTrieHinter.html)로 제공됩니다. |

이들이 준비되면 다음과 같이 `StatelessL2Builder`를 구성할 수 있습니다.

```rust theme={null}
let cfg = RollupConfig::default();
let provider = ...;
let hinter = ...;
let evm_factory = ...;       // e.g. an alloy-evm EvmFactory implementation
let receipt_builder = ...;   // OP Stack callers pass OpAlloyReceiptBuilder
let parent_header = ...;     // Sealed<Header> of the parent block

let mut executor = StatelessL2Builder::new(
   &cfg,
   evm_factory,
   receipt_builder,
   provider,
   hinter,
   parent_header,
);

let outcome = executor.build_block(...).expect("Failed execution");
```

### 모두 결합하기

`kona-derive`와 `kona-executor` 모두에 대한 커스텀 백엔드 trait을 구현하고 나면,
최종 바이너리는 [`kona-client`의 바이너리](https://github.com/ethereum-optimism/optimism/blob/develop/rust/kona/bin/client/src/kona.rs)와 비슷한 형태가 될 것입니다.
또는 더 넓은 범위의 블록을 증명하려는 경우, [`op-succinct`의 `range` 프로그램](https://github.com/succinctlabs/op-succinct/tree/main/programs/range)이
연속된 여러 블록에 걸쳐 파이프라인과 executor를 실행하는 좋은 예시를 제공합니다.

[op-stack]: https://github.com/ethereum-optimism/optimism

[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program

[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon

[cannon-rs]: https://github.com/op-rs/cannon-rs

[asterisc]: https://github.com/ethereum-optimism/asterisc

[fp-specs]: https://specs.optimism.io/fault-proof/index.html

[fpp-specs]: https://specs.optimism.io/fault-proof/index.html#fault-proof-program

[preimage-specs]: https://specs.optimism.io/fault-proof/index.html#pre-image-oracle

[cannon-specs]: https://specs.optimism.io/fault-proof/cannon-fault-proof-vm.html

[l2-output-root]: https://specs.optimism.io/protocol/proposals.html#l2-output-commitment-construction

[op-succinct]: https://github.com/succinctlabs/op-succinct

[revm]: https://github.com/bluealloy/revm

[kona]: https://github.com/ethereum-optimism/optimism/tree/develop/rust/kona

[issues]: https://github.com/ethereum-optimism/optimism/issues

[new-issue]: https://github.com/ethereum-optimism/optimism/issues/new

[contributing]: https://github.com/ethereum-optimism/optimism/blob/develop/CONTRIBUTING.md

[op-labs]: https://github.com/ethereum-optimism

[bad-boi-labs]: https://github.com/BadBoiLabs
