What Sui is, how its object-centric model and Sui Move enable parallel execution, how Mysticeti consensus works, trade-offs versus EVM chains, and how developers build and find work in the ecosystem.

Sui is a Layer 1 blockchain built for high throughput, low latency, and direct ownership of on-chain assets. It was developed by Mysten Labs, a team of former Meta engineers from the Novi and Diem projects, and launched on mainnet on May 3, 2023. Sui replaces the account-based state model used by Ethereum with an object-centric model, runs smart contracts in Sui Move, and processes many transactions in parallel instead of one after another.
Sui is a delegated proof-of-stake network with its own execution and consensus stack. The native token, SUI, has a fixed supply of 10 billion and is used to pay gas, stake with validators, and secure the network. At mainnet launch about 5 percent of the supply was in circulation, with the remainder released on a schedule managed in part by the Sui Foundation. You can verify current circulation via the public endpoints at sui-circulation.suiexplorer.com documented on sui.io/token-schedule.
At the data layer, everything on Sui is an object. Each object has a 32-byte unique ID, an owner field, a version number that increments on each mutation, and BCS-encoded contents. Transactions take objects as inputs and produce new or mutated objects as outputs, forming a DAG of transaction effects. This is documented in the Sui object model at docs.sui.io/concepts/object-model.
Sui Move is the smart contract language. It is a variant of Move, the resource-oriented language first created for Diem. Sui adapts Move to its object model so asset rules are checked by the type system and by the bytecode verifier before a package can be published.
Sui targets use cases where asset ownership, speed, and low fees matter: games with on-chain items, fast payments, marketplaces, DeFi with on-chain order books, and apps that need sponsored or zkLogin-based onboarding.
Sui fits you if you:
Sui is a weaker fit if you:
Most teams pair Sui Move for on-chain logic with TypeScript for frontends using the Sui TypeScript SDK at sdk.mystenlabs.com/typescript.
Sui defines three top-level categories:
key and a first field id: UID, created with sui::object::new. Example: struct Sword has key, store { id: UID, damage: u64 }. The verifier ensures fresh, never-reused UIDs.Ownership determines how a transaction is processed. From docs.sui.io/develop/objects/object-ownership:
transfer::share_object. Anyone can read it, and mutations go through consensus because multiple users can contend on it. A DEX pool or Kiosk listing is shared.ConsensusAddressOwner.Version and digest matter. A transaction must provide an (ID, version, digest) reference for each input object. Validators check that the reference matches committed state, which makes parallel scheduling safe.
Traditional EVM chains order all transactions globally. Sui does not. It uses a state-access method. Each transaction declares its object inputs up front. The network can run transactions with non-overlapping objects in parallel, and simple transfers of owned objects can finalize on a fast path without full consensus. Only transactions that touch shared objects need ordering through consensus. The Sui blog post All About Parallelization explains this as parallelism by default rather than an optimistic retry layer used by Aptos Block-STM, Monad, and similar engines.
Within a checkpoint, Sui includes transactions first-come, first-served, then orders them by gas price inside the checkpoint. This limits contention for hot shared objects while keeping inclusion fair for minimum-gas transactions.
At launch, Sui used Narwhal as a DAG-based mempool and Bullshark for ordering. In July 2024 Sui switched to Mysticeti, an uncertified DAG protocol described at sui.io/mysticeti and in the Mysticeti paper at arxiv.org/abs/2310.14821.
Key changes:
Eliminating explicit certification saved about 40 percent of consensus CPU in production, as reported in the March 2026 Decentralized Thoughts analysis of Mysticeti.
Mysticeti v2, detailed on the Sui Blog on November 6, 2025, integrates transaction validation into consensus and adds a Transaction Driver client. Valid transactions no longer need a separate two-thirds quorum vote before consensus. Accept votes are implicit via DAG links. Only rejections need explicit votes. The client submits each transaction to a single validator instead of all validators, batching signatures in block proposals. In rollout measurements, Mysten Labs reported about 35 percent lower latency on Asia-based full nodes (about 1.00 s to 0.65 s) and 25 percent on Europe nodes (about 0.55 s to 0.40 s). From Sui node v1.60, Mysticeti v2 and Transaction Driver became the default path.
All of this keeps the property Sui started with: owned-object transactions skip consensus entirely, shared-object transactions pay consensus cost. For an NFT mint where each mint touches a fresh owned object plus one shared mint counter, most transfers still parallelize, while mints on the shared counter serialize.
The Sui Move Concepts page lists five differences that affect every package:
Diem Move uses move_to, move_from, borrow_global rooted at account addresses. Sui removes these operators. The verifier rejects them. Storage lives in Sui objects outside the module. You pass objects explicitly by ID in the transaction, which enables the parallel schedule above.
Diem Move uses 16-byte addresses for accounts. Sui repurposes address as 32 bytes for both object IDs and account addresses. An object wraps its address in id: UID.
A struct with key must have id: UID as its first field. Example:
module 0x0::my_coin {
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
struct MyCoin has key, store {
id: UID,
value: u64,
}
public fun mint(value: u64, ctx: &mut TxContext): MyCoin {
MyCoin { id: object::new(ctx), value }
}
public fun transfer(coin: MyCoin, recipient: address) {
transfer::public_transfer(coin, recipient)
}
}
The same coin on Aptos would use move_to to an account address. On Sui you create the object and transfer it with public_transfer.
An optional private fun init(ctx: &mut TxContext) runs once at publish time to create singleton objects such as a TreasuryCap or a shared registry. It must be named init, take &mut TxContext, return nothing, and be private.
entry so they can be called in a Programmable Transaction Block but not from other packages. This matters for randomness and for enforcing transaction-level composition. A PTB groups up to 1,024 commands (Move calls, transfers, splits, merges, publishes) into one atomic transaction. Outputs of one command can be inputs to the next, effects apply only if all commands succeed, and fresh objects must be consumed or transferred inside the same PTB. This is lightweight compared to deploying a wrapper contract for batching on EVM.Other Move properties remain: modules versus scripts, privileged packing and unpacking inside the defining module, four abilities (copy, drop, store, key), signer checks replaced where relevant by TxContext::sender, and bytecode verification plus optional formal verification with the Move Prover.
PTBs are the normal transaction format on Sui. With the TypeScript SDK you build them like:
import { Transaction } from "@mysten/sui/transactions";
const tx = new Transaction();
const [coin] = tx.splitCoins(tx.gas, [1_000_000_000]);
tx.transferObjects([coin], "0xRecipientAddress");
const result = await client.signAndExecuteTransaction({ transaction: tx, signer: keypair });
For game or DeFi flows, a single PTB can create an NFT, list it in a Kiosk, split a payment coin, and call a DeepBook limit order, all atomically and with one gas charge. The CLI equivalent is sui client ptb documented at docs.sui.io/references/cli/ptb.
Gas is paid in SUI. Storage costs are refundable when you delete or shrink an object, which creates a storage rebate path. A share of fees goes to a storage fund that subsidizes long-term state growth so early and late users pay similar effective rates. The docs note that the sender who touches an object receives a percentage of the rebate, and a portion of the storage fund share of rewards is reinvested.
PTBs save gas versus many single-command transactions because per-transaction overhead is paid once and effects are batched. For shared-object contention, Sui applies per-object gas limits per commit and can defer transactions that exceed the budget, with a configurable maximum of deferral rounds before cancellation.
Sui presents itself as more than a settlement layer. Since 2024 to 2025 Mysten Labs shipped several stack components that docs.sui.io now groups under the Sui Stack:
Around these primitives, community projects include Aftermath Finance, Cetus, Navi, Suilend, SuiNS, and others. The Sui Foundation tracks ecosystem directories at sui.directory and docs.sui.io.
Sui also provides standard tooling: the Sui CLI with sui move build, sui move test, and sui client publish, the Move Analyzer language server for VS Code, Cursor, and IntelliJ with go-to-definition and diagnostics, a Move formatter, the Move Registry (MVR) for on-chain package naming and versioning, and RPC via JSON-RPC, gRPC, and GraphQL. You can run a local stack with sui devstack that boots Sui, Walrus, Seal, and DeepBook together for testing.
copy and drop cannot be duplicated or lost by accident. Privileged packing, ability checks, and bytecode verification enforce this at publish time and at runtime.Walrus with Seal for storage plus access control, and DeepBook for native order book liquidity, let you compose apps without stitching three external services manually.
move_to, borrow_global, and UID.TxContext, sui::transfer, sponsorship, and PTB composition do not translate to EVM or Solana. A module written for Aptos needs structural changes for Sui.Move.toml and sui move test, not npm and jest. Full dApps are bilingual: Move for on-chain logic plus TypeScript for PTBs and frontend.There are fewer Sui Move roles than Solidity roles, though scarcity can mean higher pay for proven Move developers. If you need volume of openings quickly, start with EVM and add Sui Move as a second specialization.
Pick Sui or Aptos first. Do not try to learn both dialects at once.
Install the Sui CLI from docs.sui.io/guides/developer/getting-started/sui-install. Check sui --version (current releases at time of writing are in the 1.x line). Install the TypeScript SDK with npm install @mysten/sui. Add the Move Analyzer extension in VS Code for diagnostics and auto-format with the Prettier Move plugin.
Create a package and implement one owned object with access control:
sui move new hello_sui
cd hello_sui
sui move build
sui move test
Write sources/counter.move:
module hello_sui::counter {
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use sui::transfer;
struct Counter has key, store {
id: UID,
value: u64,
owner: address,
}
fun init(ctx: &mut TxContext) {
let sender = ctx.sender();
let c = Counter { id: object::new(ctx), value: 0, owner: sender };
transfer::share_object(c);
}
entry fun increment(c: &mut Counter) {
c.value = c.value + 1;
}
}
init creates a shared Counter on publish. increment mutates the shared object and will go through consensus. For an owned-object variant, remove share_object, create the Counter with transfer::public_transfer(c, sender), and add a function increment_owned(c: &mut Counter) that bypasses consensus.
Run sui move test for unit tests, sui move test --coverage for coverage. Read the Move Book chapters on modules, structs and resources, and abilities before adding a coin. Publish to testnet or devnet with sui client publish --gas-budget 100000000 and note the package ID and object IDs in the transaction effects.
Use the SDK to call multiple functions atomically:
import { Transaction } from "@mysten/sui/transactions";
import { SuiClient } from "@mysten/sui/client";
const client = new SuiClient({ url: "https://fullnode.testnet.sui.io" });
const tx = new Transaction();
const counterArg = tx.object("0xYourSharedCounterId");
tx.moveCall({ target: "0xPackage::counter::increment", arguments: [counterArg] });
const [newCoin] = tx.splitCoins(tx.gas, [100_000]);
tx.transferObjects([newCoin], tx.pure.address("0xFriend"));
const signed = await client.signAndExecuteTransaction({ transaction: tx, signer: wallet });
This PTB increments a shared counter and sends a coin in one atomic execution with one gas payment. Explore the PTB cookbook at docs.sui.io/develop/transactions/ptbs/ptb-cookbook for sponsored, kiosk, and split/merge patterns.
public_transfer so royalties and transfer policies are enforced. See docs.sui.io/standards/kiosk.deepbook::book::place_limit_order. For data, store a blob with the Walrus CLI at docs.wal.app and gate access with Seal at docs.seal.mystenlabs.com.Read the Sui framework at github.com/MystenLabs/sui/tree/main/crates/sui-framework/packages/sui-framework/sources. It is the most reviewed Sui Move you can copy patterns from. Complete the BasicCoin tutorial at github.com/move-language/move/tree/main/language/documentation/tutorial steps 1 to 8, then port that coin to Sui with UID and TxContext so you see exactly where global storage operators disappear.
No. Sui does not run Solidity or Yul. You write Sui Move and compose calls with PTBs. EVM developers lower migration cost with OpenZeppelin contracts for Sui at docs.openzeppelin.com/contracts-sui and with the Move Book at move-book.com, but you still rewrite state as objects.
They share the base language and VM verifier but differ on storage. Aptos keeps account-based global storage with move_to and borrow_global, adds an object model as a framework at package level, and supports in-place upgrades with compatibility checks. Sui removes global storage, requires id: UID for any key struct, adds init and entry semantics for the object model, and composes transactions as PTBs. Expect changes when porting.
Because each transaction declares its object inputs. The network can check whether inputs overlap. If they do not, transactions run concurrently. Owned-object transactions do not need ordering, so they finalize faster. Shared-object transactions still go through Mysticeti consensus.
In production Mysticeti commits at about 400 ms, with batch throughput above 50,000 TPS in low-latency tuning and above 100,000 TPS at about 1 second in the April 2024 Mysticeti post. Single-owner transactions are lower, reported at about 250 ms in the same tests, and the November 2025 Mysticeti v2 post showed further latency reductions via Transaction Driver. Actual user latency also depends on full node location and load.
You get lower latency and lower cost for the same PTB. The client no longer broadcasts every transaction to all validators for signatures. It picks one validator, includes the transaction in the validator's DAG block, and retrieves certified effects via the DAG position. For most developers the change is transparent, handled by the SDK and full nodes from node v1.60 onward.
Yes, both are native. Sponsored transactions let a gas station or app pay gas. zkLogin lets users derive a Sui address from an OAuth JWT with a zero-knowledge proof. Together they allow onboarding without requiring new users to hold SUI first. See docs.sui.io for the current SDK calls.
Programmable Transaction Blocks. They group up to 1,024 commands into one atomic transaction. Results of one command can be used as arguments to the next. Effects apply only if all commands succeed. This is how Sui does batching without deploying a wrapper contract.
Store small, consensus-critical state as Sui objects. Store larger blobs on Walrus and keep the blob ID plus access policy in a Sui object. Use Seal for encryption and fine-grained decryption policies checked by Move. This pattern is used by marketplace, media, and AI data projects on Sui.
Fees are paid in SUI. You pay computation plus storage for new objects, and you get a rebate when you delete objects. The storage fund, funded by past fees, covers long-term replication cost so ongoing fees remain similar for new users. You set a gas budget per transaction, and the protocol caps compute per commit per object to bound shared-object contention.
Start with objects and ownership plus one PTB. Recreate a simple ERC-20 you understand as a Sui coin with store but not copy or drop, with a TreasuryCap singleton created in init that gates mint. Then build a PTB that mints, transfers, and lists the coin in a Kiosk. That path makes resources replace mappings in your mental model.
Sui is not a drop-in for an EVM chain. Treat it as a language for scarcity and access control with an object store and a DAG consensus that checks your work twice: the compiler checks abilities, and the network schedules your object inputs in parallel.
Explore more guides and career playbooks