# 发射你的应用

> 远地虚拟机的开发者手册：客户程序如何编写、构建、运行、证明并在链上结算，以及让它保持正确、可证明且低成本的习惯。

**客户程序**（guest）是远地虚拟机所证明的程序：一个为 `riscv32imac-unknown-none-elf` 编译的 `no_std` Rust 二进制程序，带一个入口点、三个用于输入和输出的内存区域，除此之外别无他物。**宿主程序**（host）是围绕它的一切：负责提供输入、向远地虚拟机请求证明、再把证明交给检验方的代码。两者都由你编写。远地虚拟机提供机器、电路和验证者。

本节同时写给两类读者：坐在键盘前的工程师，以及与他们协作的模型。每一页都把规则直白地写出来，[AI 随行手册](https://apogee.gweb3networks.com/docs/launch/ai-companion)则把全部规则浓缩进一个文件，你可以在助手写下第一行代码之前就交给它。

## 基本模型

> Figure: 各方分工。输入和公开输出（journal）受证明绑定；以虚线表示的证明者提示（advice）则不受绑定，所以客户程序要检查它。验证者从不接触程序本身，只看到它的程序身份。

一份证明只陈述一件事：具有此身份的程序，在其映像上以此公开输入和某份由证明者选定的证明者提示启动，运行至以此状态调用 `EXIT`，并已写出此公开输出。你构建的一切都建立在这句话之上。

## 工作流程

| 步骤 | 你要做的事 | 页面 |
| --- | --- | --- |
| 1 | 无需手动安装任何东西：代码仓库固定了工具链。为证明获取仪式文件 | [环境准备](https://apogee.gweb3networks.com/docs/launch/setup) |
| 2 | 编写客户程序：一个入口点、三个内存区域、普通的 Rust | [编写客户程序](https://apogee.gweb3networks.com/docs/launch/write)、[输入、证明者提示与公开输出](https://apogee.gweb3networks.com/docs/launch/io) |
| 3 | 在划算的地方使用委托的哈希与曲线运算 | [委托](https://apogee.gweb3networks.com/docs/launch/delegations) |
| 4 | 为客户程序目标构建，然后检查映像及其程序身份 | [构建与检查](https://apogee.gweb3networks.com/docs/launch/build) |
| 5 | 在模拟器中运行，统计周期都花在了哪里 | [运行与性能分析](https://apogee.gweb3networks.com/docs/launch/run) |
| 6 | 证明一次运行，并验证它 | [证明与验证](https://apogee.gweb3networks.com/docs/launch/prove) |
| 7 | 通过递归压缩证明，并在以太坊上检验 | [链上结算](https://apogee.gweb3networks.com/docs/launch/on-chain) |

[快速上手](https://apogee.gweb3networks.com/docs/launch/quickstart)用一个只有三行的客户程序，把整个流程完整走一遍。

## 最重要的规则

[客户程序编程指南](https://apogee.gweb3networks.com/docs/launch/guide)逐条解释了这些规则，说明违反时会出什么问题，以及应该怎么做。

- **`usize` 和所有指针都是 32 位。** `usize` 溢出只在客户程序中触发 panic，`x as usize` 会静默截断，任何布局或哈希依赖于长度的东西，在宿主机与客户程序之间都不一致。
- **分配器从不释放内存。** 它从 `__heap_start` 起向上推进一个指针，所以让客户程序耗尽内存的，是它在整个运行期间分配的总量，而不是峰值。复用缓冲区，并用 `with_capacity` 预先设定容量。
- **原子操作能正常工作，但你不应该写它们。** 这台机器只有一个 hart，A 扩展的存在是为了兼容已经在使用它的代码。新写的客户程序代码没有任何需要同步的东西。
- **没有外部世界。** 没有文件、没有时钟、没有随机数、没有网络。客户程序所知道的，只有它的公开输入、它的证明者提示，以及它自己算出的东西。
- **证明者提示由证明者选择。** 在任何由它推导出的内容进入公开输出之前，先把它与证明所绑定的某样东西核对。
- **公开输出很小。** 最多 16,380 字节。任何会增长的内容，都发布其摘要。
- **release 构建中溢出检查保持开启。** 它们是程序计算内容的一部分，所以客户程序的构建 profile 把它们固定下来。
- **每条执行过的指令都是一行被证明的数据。** 证明成本取决于周期数，所以先用 `--release` 构建并统计周期数，再去优化其他任何东西。

## 从哪里开始

- [快速上手](https://apogee.gweb3networks.com/docs/launch/quickstart): 一个客户程序、一次构建、一次运行、一份证明，一气呵成。

- [客户程序编程指南](https://apogee.gweb3networks.com/docs/launch/guide): 各种易错点和推荐做法，每一条都附有理由。

- [AI 随行手册](https://apogee.gweb3networks.com/docs/launch/ai-companion): 一个文件，向助手讲清如何编写客户程序。
