# What is NEBRA UPA?

NEBRA UPA is the first **Universal Proof Aggregation** protocol that scales and composes zero-knowledge proof verification on Ethereum/EVM Chains. NEBRA UPA achieves that using recursive SNARKs, which means NEBRA UPA is secured by 1 million Ethereum validators, without adding new trust assumptions on hardware i.e. TEE or incentive assumptions i.e. restaking.&#x20;

<figure><picture><source srcset="/files/ZvotCUp5fvUWQHTyos3S" media="(prefers-color-scheme: dark)"><img src="/files/j02XqBBd4pZV4x7nGC05" alt="" width="375"></picture><figcaption><p>NEBRA UPA</p></figcaption></figure>

There are 3 key properties of NEBRA UPA:

* **Universality**: NEBRA UPA can aggregate proofs from **any** circuit: this means in the same batch, NEBRA UPA aggregates proofs from different sources, such as proofs from zkEVMs, zkDIDs, and zkCoprocessors. Universality brings "economy of scale" to NEBRA users. Effectively, you don't need to generate a huge number of proofs to enjoy **cheap** amortized verification cost.&#x20;
* **Permissionless**: NEBRA UPA is an on-chain protocol, meaning that anyone can submit proofs to NEBRA.&#x20;
* **Censorship resistant**: NEBRA UPA is made censorship resistant by adopting a forced-inclusion design similar to Ethereum L2s. You can trigger a force inclusion to include your proofs if our off-chain worker refuses to put your proof in the aggregated proof. In addition, we would be slashed if a force inclusion happens.&#x20;

### Why should you use NEBRA?

* **Verify zero-knowledge proofs cheaply without compromises**: Using NEBRA can effectively lower the cost of proof verification by 5x and more for **any** application, while security is still inherited from Ethereum L1, through recursive zero-knowlege proofs.
* **Composing proofs from different sources**: NEBRA UPA can be used to compose proofs from different sources into a single proof. This can unlock powerful use cases, such as:
  * Interoperability between different zkRollups
  * Composing proofs from different ZK verticals such as zkML, zkVM, and zkCoprocessors &#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.nebra.one/introduction/what-is-nebra-upa.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
