Writing the Hello World Contract

Project Setup

Step 1: Create a New Project

Create a new project using cargo-stylus and navigate into the project directory:

cargo stylus new hello_world
cd hello_world

Step 2: Edit Cargo.toml

Open the Cargo.toml file and add the necessary dependencies and features:

[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

[dependencies]
stylus-sdk = { version = "0.5.2", features = ["debug"] }
wee_alloc = "0.4.5"

[features]
export-abi = ["stylus-sdk/export-abi"]

[profile.release]
codegen-units = 1
strip = true
lto = true
panic = "abort"
opt-level = "s"

[workspace]

Step 3: Edit Contract Code

Open the src/lib.rs file and replace the content with the following code:

// Disable Rust standard library to keep the contract small.
#![no_main]
#![no_std]

// Import the necessary crates and modules.
extern crate alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

use alloc::string::String;
use alloc::vec::Vec;
use stylus_sdk::{console, stylus_proc::entrypoint, ArbResult};

// Define the entrypoint for the contract.
#[entrypoint]
fn user_main(_input: Vec<u8>) -> ArbResult {
    // Print a "Hello, world!" message to the console.
    console!("Hello, world!");
    Ok(Vec::new())
}

Explanation

  • No Standard Library: #![no_main] and #![no_std] are used to disable the Rust standard library, which keeps the contract's WASM size small.

  • Allocator: wee_alloc is a small allocator designed for WASM environments, reducing the contract's footprint.

  • Imports: alloc provides heap-allocated types like String and Vec. stylus_sdk includes necessary macros and functions for Stylus development.

  • Entry Point: #[entrypoint] defines the starting point of the contract. console! macro prints "Hello, world!" to the console for debugging purposes.

Last updated