> For the complete documentation index, see [llms.txt](https://learn.qanplatform.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.qanplatform.com/developers/qvm-multi-language-smart-contracts/docs-for-supported-languages/rust-smart-contract/writing-a-smart-contract-in-rust.md).

# 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

```rust
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.

{% content-ref url="/pages/OxVPW9omyYNTCfkgHCj4" %}
[Compiling a smart contract in Rust](/developers/qvm-multi-language-smart-contracts/docs-for-supported-languages/rust-smart-contract/compiling-a-smart-contract-in-rust.md)
{% endcontent-ref %}
