LogoLogo
NEBRA HomeGithub
  • Introduction
    • What is NEBRA UPA?
    • How it works
    • Quickstart
  • Developer Guide
    • Setup
    • Registering applications
    • Submission and verification
    • Proof explorer
    • Gas costs on L1s
    • Gas Costs on L2s
    • Testing workflow
    • Frontend integration
    • Deployments
    • Off-chain verification
  • UPA protocol specification
  • Integrating with zkVMs
    • Integrating with SP1
  • Security and Transparency
Powered by GitBook
On this page
  • Requirements
  • Add the client package
  • UPA instance
  • Initialize the UPA Client
  • In nodejs:
  • In the browser:
  • Add the UPA command line tool

Was this helpful?

  1. Developer Guide

Setup

Step by step guide to set up the UPA for a zk-app.

PreviousDeveloper GuideNextRegistering applications

Last updated 6 months ago

Was this helpful?

Requirements

  • node.js >= 18

  • ethers >= 6

  • snarkjs >= 0.7.1

Add the client package

To add the client package as a dependency to your application:

yarn add @nebrazkp/upa ethers

UPA instance

After adding the client package, you will need a file upa.instance containing the details of a particular deployment of the UPA contracts.

Get the JSON file for the instance you wish to use from the section.

Initialize the UPA Client

The UPA client is the main way your app will interact with the UPA. It allows you to easily submit proofs among other things. To initialize it, first load the contents of upa.instance as json into a variable upaInstanceDescriptor, and then pass this to the constructor with an ethers.Provideror ethers.Signer.

NOTE: The examples below are simplified for illustration purposes

In nodejs:

import { UpaClient } from "@nebrazkp/upa/sdk";
import { config } from "@nebrazkp/upa/tool";
import * as ethers from "ethers";
import * as fs from "fs";

...

const upaInstanceDescriptor = config.loadInstance("upa.instance");

const provider = new ethers.JsonRpcProvider(endpoint);
const keystoreStr = fs.readFileSync(keyfile, "ascii");
const signer = await ethers.Wallet.fromEncryptedJson(keystoreStr, password);

const upaClient = new UpaClient(signer, upaInstanceDescriptor);

In the browser:

import { UpaClient } from "@nebrazkp/upa/sdk";
import * as ethers from "ethers";

...

const upaInstanceDescriptor = { }; // embed or read from server
const provider = new ethers.BrowserProvider((window as any).ethereum);
const signer = await provider.getSigner();
const upaClient = new UpaClient(signer, upaInstanceDescriptor);

where signer is the account which will execute the transactions underlying the client methods.

Add the UPA command line tool

Another way to interact with the UPA is through the command line tool. To set it up, run

export PATH=$PATH:$(pwd)/node_modules/.bin

to enable the upa command in your current shell. If successful, running the upa command will give output like:

NOTE: the upa tool is intended to be self documenting. See upa --help for the full list of available commands.

Deployments