Rust

💡

N1 is currently in closed early access and only available to select developers. These docs are meant to provide insight into what developing on N1 feels like. If you are interested in developing an app on N1, sign up to the Early Access Program ↗ (opens in a new tab).

We provide a wasm (i.e. WebAssembly) execution environment for developers to deploy their Rust applications to. We use standard wasm tooling for Rust and provide an interface for sending and receving messages to and from the rest of the network. This is used to asynchronously compose with other programs. To get started, first go familiarize yourself with the Rust and WebAssembly book (opens in a new tab) before starting. We provide a thin n1_sdk crate that you can use to send and receive messages. Below is a minimal example of a N1 program written in Rust showing the most important functionality provided by the n1_sdk crate.

use wasm_bindgen::prelude::*;
use n1_sdk::{Result, send, U256};
 
#[no_mangle]
#[wasm_bindgen]
pub fn execute(action: &[u8]) -> Result<()> {
    // Your entrypoint code here. You define the serialization format
    // for your actions and return the result.
 
    // For example, you could choose to use JSON to encode
    // the actions that your program supports.
    #[derive(serde::Serialize, serde::Deserialize)]
    enum MyAction {
        Increment,
        Decrement,
    }
 
    // You can deserialize the action like this:
    let action: MyAction = serde_json::from_slice(action)?;
 
    // And then you can do something with it:
    match action {
        MyAction::Increment => todo!(),
        MyAction::Decrement => todo!(),
    }
 
    // For sending a message, you can use the `send` function:
    let payload = b"Hello, world!";
    let dest = U256::from(0x01);
    send(&payload, dest)?;
 
    todo!()
}
 
#[no_mangle]
#[wasm_bindgen]
pub fn on_recv(payload: &[u8], sender: U256) -> Result<()> {
    // This function is called when a message is received.
    // The semantics of the payload are up to you.
    todo!()
}

For example, our Nord orderbook provides a crate for encoding and decoding messages, which can be used to implement applications such as trading bots.

use wasm_bindgen::prelude::*;
use n1_sdk::{Result, send, U256};
 
let NORD = U256::from(/* nord's address */);
 
#[no_mangle]
#[wasm_bindgen]
pub fn execute(_action: &[u8]) -> Result<()> {
    send(
        nord::actions::PlaceOrder {
            market_id: 0,
            price: 100,
            size: 100,
            ..Default::default()
        }.encode(),
        NORD,
    )?;
    Ok(())
}
 
#[no_mangle]
#[wasm_bindgen]
pub fn on_recv(payload: &[u8], sender: U256) -> Result<()> {
    if sender == NORD {
        let receipt = nord::receipt::Receipt::decode(payload)?;
 
        match receipt {
            nord::receipt::Receipt::OrderPlaced { .. } => {
                // Do something with the receipt.
                todo!()
            }
            _ => todo!()
        }
    }
    Ok(())
}