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

# 本地开发

> 使用完整本地 Ephemeral Rollup 栈、Surfpool 或本地 VRF 预言机来运行和测试你的 Native Rust 或 Anchor 程序。

***

### 快速入口

查看适用于 Anchor 和 Native Rust 的程序与测试脚本：

<CardGroup cols={2}>
  <Card title="GitHub" icon="anchor" href="/cn/pages/ephemeral-rollups-ers/how-to-guide/quickstart" iconType="duotone">
    Anchor 实现
  </Card>

  <Card title="GitHub" icon="rust" href="/cn/pages/ephemeral-rollups-ers/how-to-guide/rust-program" iconType="duotone">
    Native Rust 实现
  </Card>
</CardGroup>

***

## 本地设置选项

你可以通过三种方式在本地运行 Ephemeral Rollups：

* 使用 `mb-test-validator` 作为基础层并搭配本地 `ephemeral-validator` 的完整本地栈。
* 使用本地 Surfpool 作为基础层替代方案，同时仍在本地运行 rollup。
* 让本地 `ephemeral-validator` 直接连接到如 Devnet 这样的公共基础层。

如果你希望所有组件都运行在自己的机器上，就选择完整本地方案。若你想保留 Surfpool 工作流，同时对本地 Ephemeral Rollup 进行测试，就选择 Surfpool。若你想在不运行本地 Solana validator 的情况下使用本地 rollup 进程，就选择 Devnet 方案。

### 重要：使用正确的验证器身份升级程序

使用本地 ER 验证器时，应将其连接到账户发生委托的那个基础层。如果你将 PDA 委托给某个特定的 ER 验证器身份，请更新程序中的 delegation 配置，以确保 commit 和 undelegation 能在基础层上正确完成。

<Note>
  <p>
    这些公共验证器可用于开发环境。请确保在你的委托指令中添加对应的
    ER 验证器：
  </p>

  **主网**

  <ul>
    <li>
      亚洲 (as.magicblock.app):{" "}
      <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
    </li>

    <li>
      欧盟 (eu.magicblock.app):{" "}
      <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
    </li>

    <li>
      美国 (us.magicblock.app):{" "}
      <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
    </li>

    <li>
      TEE (mainnet-tee.magicblock.app):{" "}
      <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
    </li>
  </ul>

  **开发网**

  <ul>
    <li>
      亚洲 (devnet-as.magicblock.app):{" "}
      <code>MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57</code>
    </li>

    <li>
      欧盟 (devnet-eu.magicblock.app):{" "}
      <code>MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e</code>
    </li>

    <li>
      美国 (devnet-us.magicblock.app):{" "}
      <code>MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd</code>
    </li>

    <li>
      TEE (devnet-tee.magicblock.app):{" "}
      <code>MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo</code>
    </li>
  </ul>

  **本地网络**

  <ul>
    <li>
      本地 ER (localhost:7799):{" "}
      <code>mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev</code>
    </li>
  </ul>
</Note>

<Tabs>
  <Tab title="完整本地">
    <Steps>
      <Step title="安装 Ephemeral Validator CLI">
        ```bash theme={null}
        npm install -g @magicblock-labs/ephemeral-validator@latest
        ```
      </Step>

      <Step title="启动本地 Solana 基础层">
        `mb-test-validator` 会启动一个本地 Solana validator，可作为完整本地环境的基础层。

        ```bash theme={null}
        mb-test-validator --reset
        ```

        该设置使用 `http://localhost:8899` 作为 RPC，`ws://localhost:8900` 作为 WebSocket 连接地址。
      </Step>

      <Step title="在 localhost 上部署或升级程序">
        <Tabs>
          <Tab title="Rust Native">
            ```bash theme={null}
            cargo build-sbf
            solana config set --url localhost
            solana program deploy YOUR_PROGRAM_PATH
            ```
          </Tab>

          <Tab title="Anchor">
            ```bash theme={null}
            anchor build && anchor deploy \
              --provider.cluster localnet
            ```
          </Tab>
        </Tabs>
      </Step>

      <Step title="启动本地 ephemeral validator">
        将本地 Ephemeral Rollup 连接到本地 Solana validator：

        ```bash theme={null}
        ephemeral-validator --remotes "http://localhost:8899" --remotes "ws://localhost:8900" -l "7799" --lifecycle ephemeral
        ```
      </Step>

      <Step title="针对本地 rollup 运行测试">
        本地 rollup 的 RPC 地址为 `http://localhost:7799`，WebSocket 地址为 `ws://localhost:7800`。

        <Tabs>
          <Tab title="Rust Native">
            ```bash theme={null}
            EPHEMERAL_PROVIDER_ENDPOINT=http://localhost:7799 \
            EPHEMERAL_WS_ENDPOINT=ws://localhost:7800 \
            PROVIDER_ENDPOINT=http://localhost:8899 \
            WS_ENDPOINT=ws://localhost:8900 \
            yarn test
            ```
          </Tab>

          <Tab title="Anchor">
            ```bash theme={null}
            EPHEMERAL_PROVIDER_ENDPOINT="http://localhost:7799" \
            EPHEMERAL_WS_ENDPOINT="ws://localhost:7800" \
            anchor test \
              --provider.cluster localnet \
              --skip-local-validator \
              --skip-build \
              --skip-deploy
            ```
          </Tab>
        </Tabs>
      </Step>
    </Steps>
  </Tab>

  <Tab title="Surfpool">
    <Steps>
      <Step title="安装 Surfpool">
        ```bash theme={null}
        curl -sL https://run.surfpool.run/ | bash
        ```
      </Step>

      <Step title="安装 Ephemeral Validator CLI">
        ```bash theme={null}
        npm install -g @magicblock-labs/ephemeral-validator@latest
        ```
      </Step>

      <Step title="启动 Surfpool">
        这个示例会保持 Surfpool 在本地运行，同时将 Solana Devnet 作为上游基础层：

        ```bash theme={null}
        surfpool start --rpc-url https://api.devnet.solana.com
        ```

        Surfpool 会暴露本地 RPC 和 WebSocket 端点，供 ephemeral validator 连接。
      </Step>

      <Step title="启动 ephemeral validator">
        将 validator 指向 Surfpool 的本地 RPC 和 WebSocket 端点：

        ```bash theme={null}
        ephemeral-validator --remotes "http://localhost:8899" --remotes "ws://localhost:8900" -l "7799" --lifecycle ephemeral
        ```
      </Step>

      <Step title="向 rollup 发送测试交易">
        ```bash theme={null}
        solana transfer <your address> 0 -u "http://localhost:7799"
        ```
      </Step>

      <Step title="检查交易">
        该交易应出现在 ER TUI 中，你可以在其中检查交易并在浏览器中打开它。

        该流程基于 [使用 Surfpool 在本地运行 Ephemeral Rollups](https://x.com/PiccoGabriele/status/2030045550230524212)。
      </Step>
    </Steps>
  </Tab>

  <Tab title="Devnet">
    <Steps>
      <Step title="在 Devnet 上部署或升级程序">
        为程序加入 MagicBlock delegation，并将其部署到 Devnet：

        <Tabs>
          <Tab title="Rust Native">
            ```bash theme={null}
            cargo build-sbf
            solana config set --url devnet
            solana program deploy YOUR_PROGRAM_PATH
            ```
          </Tab>

          <Tab title="Anchor">
            ```bash theme={null}
            anchor build && anchor deploy \
              --provider.cluster devnet
            ```
          </Tab>
        </Tabs>
      </Step>

      <Step title="安装并运行本地 ephemeral validator">
        ```bash theme={null}
        npm install -g @magicblock-labs/ephemeral-validator@latest
        ```

        ```bash theme={null}
        RUST_LOG=info ephemeral-validator \
          --lifecycle ephemeral \
          --remote-url "https://rpc.magicblock.app/devnet" \
          --rpc-port 7799
        ```
      </Step>

      <Step title="针对本地 rollup 运行测试">
        <Tabs>
          <Tab title="Rust Native">
            ```bash theme={null}
            EPHEMERAL_PROVIDER_ENDPOINT=http://localhost:7799 \
            EPHEMERAL_WS_ENDPOINT=ws://localhost:7800 \
            yarn test
            ```
          </Tab>

          <Tab title="Anchor">
            ```bash theme={null}
            EPHEMERAL_PROVIDER_ENDPOINT="http://localhost:7799" \
            EPHEMERAL_WS_ENDPOINT="ws://localhost:7800" \
            anchor test \
              --provider.cluster devnet \
              --skip-local-validator \
              --skip-build \
              --skip-deploy
            ```
          </Tab>
        </Tabs>
      </Step>
    </Steps>
  </Tab>
</Tabs>

## 在本地运行 VRF Oracle

如果你还需要端到端测试 VRF，可以让本地 `vrf-oracle` 对接本地测试队列运行。

<Steps>
  <Step title="安装最新的 Ephemeral Validator CLI">
    ```bash theme={null}
    npm install -g @magicblock-labs/ephemeral-validator@latest
    ```
  </Step>

  <Step title="启动本地 Solana validator">
    ```bash theme={null}
    mb-test-validator --reset
    ```
  </Step>

  <Step title="启动 ephemeral validator">
    ```bash theme={null}
    ephemeral-validator --remote-url "http://localhost:8899" --rpc-port 7799 --lifecycle ephemeral
    ```
  </Step>

  <Step title="启动本地 VRF 预言机">
    这个预言机会把请求加入本地测试队列：

    ```bash theme={null}
    VRF_ORACLE_SKIP_PREFLIGHT="true" RPC_URL="http://localhost:8899" WEBSOCKET_URL="ws://localhost:8999" RUST_LOG=info vrf-oracle
    ```

    如果你的本地 validator 暴露了不同的 WebSocket 端口，请相应更新 `WEBSOCKET_URL`。
  </Step>
</Steps>

***
