Skip to main content

Create a Nada project and write your first Nada program

The nada tool is used to create a new Nada project, compile all programs in the project, run Nada programs, and generate tests for Nada programs.

info

Before starting this guide, Install the Nillion SDK

Confirm installation:

nillion -V

Create a new Nada project

Create a quickstart directory. Inside of quickstart, use the nada tool to create a new nada project named "nada_quickstart_programs" by running

mkdir quickstart
cd quickstart
nada init nada_quickstart_programs

Set up a Python virtual environment and install nada-dsl

The Nillion Network leverages Nada, our MPC language, for defining MPC programs. Our initial implementation of Nada comes in the form of Nada, a Python DSL (Domain Specific Language).

info

You'll need python3 version 3.11 or higher with a working pip installed to import the nada_dsl dependency. Before setting up your Python virtual environment, confirm that you have python3 (version >=3.11) and pip installed

python3 --version
python3 -m pip --version
  1. Change directories into your new nada project directory

    cd nada_quickstart_programs
  1. Create a python virtual environment

    python3 -m venv .venv
  2. Activate the python virtual environment

    source .venv/bin/activate
  3. Install nada-dsl from pypi

    pip install --upgrade nada-dsl

Write your first Nada program

Open the nada_quickstart_programs folder in your code editor of choice.

info

Your Nada project has the following structure:

nada-project.toml  # Configuration file for your Nada programs
src/ # Directory for writing Nada programs
src/main.py # An example Nada program that adds 2 secret integers
target/ # Directory where `nada build` puts resulting compiled programs
tests/ # Directory where `nada generate-test` puts resulting test files

1. Create a Nada program file

The src/ directory is where you'll write your Nada programs. Create a new Nada program file in the src directory. The secret_addition.py Nada program will add 2 SecretInteger Nada values together.

touch src/secret_addition.py

2. Write the secret addition Nada program

Copy this Nada program into the secret_addition.py file. Don't worry, we'll go through a line by line explanation of the program next.

from nada_dsl import *

def nada_main():

party1 = Party(name="Party1")

my_int1 = SecretInteger(Input(name="my_int1", party=party1))

my_int2 = SecretInteger(Input(name="my_int2", party=party1))

new_int = my_int1 + my_int2

return [Output(new_int, "my_output", party1)]

3. Understand each line of the secret_addition.py Nada program

Let's go through the program line by line to understand what is each part is doing.

  1. First we import all from nada_dsl, the Nada language

    from nada_dsl import *
  2. Next we create function nada_main() - this is the main function that contains our Nada program's code.

    from nada_dsl import *

    def nada_main():
  3. Create a party with a name: Party1

    from nada_dsl import *

    def nada_main():

    party1 = Party(name="Party1")

    This is a single party program, but you could add more than one party; for example we could define party2 = Party(name="Party2").

  4. Create program inputs

    from nada_dsl import *

    def nada_main():

    party1 = Party(name="Party1")

    my_int1 = SecretInteger(Input(name="my_int1", party=party1))

    my_int2 = SecretInteger(Input(name="my_int2", party=party1))

    This program has two inputs, both secret integers. Each input must have a name and a party associated to it. Currently in nada you can only compute on secret or public integers (and rationals by using the nada-algebra library).

  5. Compute on the inputs

    from nada_dsl import *

    def nada_main():

    party1 = Party(name="Party1")

    my_int1 = SecretInteger(Input(name="my_int1", party=party1))

    my_int2 = SecretInteger(Input(name="my_int2", party=party1))

    new_int = my_int1 + my_int2

    This performs addition to sum the inputs. Check out all the built in operations available in nada here.

  6. Return the output of the program

    from nada_dsl import *

    def nada_main():

    party1 = Party(name="Party1")

    my_int1 = SecretInteger(Input(name="my_int1", party=party1))

    my_int2 = SecretInteger(Input(name="my_int2", party=party1))

    new_int = my_int1 + my_int2

    return [Output(new_int, "my_output", party1)]

    To output the result of a program, we must provide a name - in this case my_output - and a party to whom the output is provided - in this case party1.

Compile, run, and test your Nada program

Use the nada tool to compile, run and test the program we have just written. More information about the nada tool can be found here.

  1. Add your program to nada-project.toml config file

    For the nada tool to know about our program, we need to add the following to the to the nada-project.toml config file.

    [[programs]]
    path = "src/secret_addition.py"
    name = "secret_addition"
    prime_size = 128
  2. Run the nada build command to compile programs.

    nada build

    This will compile all programs listed in the nada-project.toml file. You will see the binary files (.nada.bin) outputted to the target/ directory.

  3. Generate test

    nada generate-test --test-name secret_addition_test secret_addition

    This uses the nada tool to generate a set of test values, that will be stored in tests/. Here secret_addition_test is the name of the test, and secret_addition is the name of the program we want to test. You will notice that the test file (tests/secret_addition_test.yaml) is automatically populated with 3s everywhere by default. Later, for the test to pass, we will have to change the output from 3 to the correct output.

  4. Run the program with test values

    nada run secret_addition_test

    Now we run the program. This uses the inputs defined in the test file (tests/secret_addition_test.yaml) and runs the program and prints the result. Make note of the result, we will need it next.

  5. Test the program

    nada test secret_addition_test

    Finally, we test the program. If you run the above command without altering the default values (3s) in the test file (tests/secret_addition_test.yaml), the test will fail because the expected test output doesn't match the resulting output. Modify the value of my_output in the test file and re-test the program.

    Modify test values in secret_addition_test.yaml
---
program: secret_addition
inputs:
my_int1:
SecretInteger: "3"
my_int2:
SecretInteger: "3"
expected_outputs:
my_output:
SecretInteger: "6"
Re-run test
nada test secret_addition_test

Next steps

🧮 Fantastic work! You just created your first Nada project and wrote and tested a Nada program. Now you can move onto the final step: hooking up the secret_addition Nada program to a blind app, which will be able to store the program, then compute with the program on secret, user provided inputs.