near-bindgen

Rust library for writing NEAR smart contracts.

Crates.io version Download Join the community on Discord Travis Build

Features | Pre-requisites | Writing Rust Contract | Building Rust Contract

Example

Wrap a struct in #[near_bindgen] and it generates a smart contract compatible with the NEAR blockchain: ```rust

[near_bindgen]

[derive(Default, BorshDeserialize, BorshSerialize)]

pub struct StatusMessage { records: HashMap, }

[near_bindgen]

impl StatusMessage { pub fn setstatus(&mut self, message: String) { let accountid = env::signeraccountid(); self.records.insert(account_id, message); }

pub fn get_status(&self, account_id: String) -> Option<String> {
    self.records.get(&account_id).cloned()
}

} ```

Features

Pre-requisites

To develop Rust contracts you would need to: * Install Rustup: bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh * Add wasm target to your toolchain: bash rustup target add wasm32-unknown-unknown

Writing Rust Contract

You can follow the examples/status-message crate that shows a simple Rust contract.

The general workflow is the following: 1. Create a crate and configure the Cargo.toml similarly to how it is configured in examples/status-message/Cargo.toml; 2. Crate needs to have one pub struct that will represent the smart contract itself: * The struct needs to implement Default trait which NEAR will use to create the initial state of the contract upon its first usage; * The struct also needs to implement BorshSerialize and BorshDeserialize traits which NEAR will use to save/load contract's internal state;

Here is an example of a smart contract struct: rust #[near_bindgen] #[derive(Default, BorshSerialize, BorshDeserialize)] pub struct MyContract { data: HashMap<u64, u64> }

  1. Define methods that NEAR will expose as smart contract methods:

    Here is an example of smart contract methods: ```rust

    [near_bindgen]

    impl MyContract { pub fn insertdata(&mut self, key: u64, value: u64) -> Option { self.data.insert(key) } pub fn getdata(&self, key: u64) -> Option { self.data.get(&key).cloned() } } ```

Building Rust Contract

We can build the contract using rustc: bash RUSTFLAGS='-C link-arg=-s' cargo build --target wasm32-unknown-unknown --release