Writing a smart contract in Rust

Sample contract functionality

The sample contract serves as a demonstration of general QVM logic.

It is capable of:

  • registering users into the database

  • storing the last registered user's name in the database

  • echoing the previous user's name to STDOUT

  • incrementing the total registered user count

  • storing above counter in the database

Sample smart contract code

use std::env;

fn get_env(key: String, default: String) -> String {
    env::var(key).unwrap_or(default)
}

fn atoi(val: String) -> i32 {
    val.parse().unwrap_or(0)
}

fn main() {
    let args: Vec<String> = env::args().collect();
    // THIS SAMPLE ONLY SUPPORTS THE "register" FUNCTION
    if args.len() == 3 && args[1] == "register" {
        // GET THE CURRENT USER'S NAME OR DEFAULT TO "unknown" IF THIS IS THE FIRST CALL
        let previous_name = get_env("DB_USER_CURRENT".to_string(),"unknown".to_string());

        // GET THE TOTAL USER COUNT
        let total_user_count= atoi(get_env("DB_TOTALUSERS".to_string(),"0".to_string()));

        // WRITE PREVIOUS USER NAME TO STDOUT
        println!("OUT=prevname: {}", previous_name);

        // UPDATE CURRENT USER NAME BY WRITING IT TO DB
        println!("DBW=USER_CURRENT={}", args[2]);

        // STORE USER NAME UNDER A STORAGE SLOT FOR PERSISTENCE (CURRENT GETS OVERWRITTEN ON EACH CALL)
        println!("DBW=USER_{}={}", total_user_count, args[2]);

        // INCREMENT THE TOTAL USER COUNT
        println!("DBW=TOTALUSERS={}", total_user_count+1);

        std::process::exit(0);
    }

    if args.len() >= 2 {
        eprintln!("Wrong CMD: {}", args[1]);
        std::process::exit(1);
    }
    eprintln!("Wrong args!");
    std::process::exit(1);
}

Save the smart contract

Open a text editor and save above sample contract as main.rs file.

Last updated