Introduction to Move

Move is a statically typed, bytecode-compiled programming language for writing smart contracts — programs that run on a blockchain and manage digital assets.

1.1 What is Move?

Move is a statically typed, bytecode-compiled programming language for writing smart contracts — programs that run on a blockchain and manage digital assets. It was designed from the ground up around one idea: digital assets should behave like physical objects. A coin cannot be accidentally copied, and it cannot silently disappear; it can only be *moved* from one place to another.

Move source code is compiled to Move bytecode, which is checked by an on-chain bytecode verifier before it is published, and then executed by the Move VM. The verifier enforces type safety, resource safety (no copying or dropping of assets unless allowed), and reference safety — even if somebody writes bytecode by hand.

1.2 Where Move runs

Chain / platform Sui (Mysten Labs) Sui Move, Move 2024 edition Objects with unique IDs Mainnet since May 2023 Aptos (Aptos Labs) Aptos Move, Move 2

Global storage under accounts + Object framework Mainnet since Oct 2022 Aptos-compatible Move (MoveVM) Mainnet launched 2025 IOTA (Rebased)

Initia, Rooch, Starcoin, 0L Various Move variants Mostly global storage Diem (Libra) Original "core" Move Discontinued (2022)

1.3 Key characteristics

Resources / linear types — values whose types lack the copy and drop abilities must be used exactly once: moved, stored, or explicitly destroyed by their defining module.

Abilities — copy, drop, store, key declare what a type is allowed to do.

Module encapsulation — only the module that declares a struct can create it, destroy it, or access its fields. This is the foundation of Move's security.

No dynamic dispatch — all calls are resolved statically, eliminating re-entrancy by construction.

Generics with ability constraints and phantom type parameters.

Formal verification — the Move Prover checks specifications written in the language itself.

No null, no inheritance, no pointers (only safe references), no floating point.

1.4 A taste of Move

The two dialects share the same core language (types, abilities, generics, references), but differ in how data is stored on chain. This course teaches the shared core and then each storage model side by side.

// Sui Move (2024 edition)
module hello::greeting;

use std::string::String;

public struct Greeting has key, store {
    id: UID,
    text: String,
}

public fun new(text: String, ctx: &mut TxContext): Greeting {
    Greeting { id: object::new(ctx), text }
}
// Aptos Move
module hello_addr::greeting {
    use std::string::String;

    struct Greeting has key {
        text: String,
    }

    public entry fun set(account: &signer, text: String) {
        move_to(account, Greeting { text });
    }
}