docs-move-programmability
Move Concepts | Sui Documentation
Skip to main content
Sui Documentation
Guides Concepts Standards References
Ask Sui AI
Search
Overview
Ethereum -> Sui
Solana -> Sui
Architecture
Tokenomics
Accessing Data
Cryptography
Coin Management
Move Concepts
Gaming on Sui
Research Papers
🗳️ Book Office Hours →
💬 Join Discord →
Move Concepts
On this page
Move Concepts
Move is an open source language for writing safe
packages to manipulate on-chain objects (sometimes referred to as smart contracts ).
Move is a platform-agnostic language to enable common libraries, tooling, and developer communities across blockchains with vastly different data and execution models.
Move is adaptable to meet the needs of the blockchain the code operates on, see Move on Sui to review enhancements made to
Move for optimization on the Sui blockchain.
You can use
Move to define, create, and manage programmable Sui objects representing assets and smart contracts. Sui's object system is implemented by adding new functionality to
Move while also imposing additional restrictions.
Move on Sui contains some important differences from
Move on other blockchains. Sui takes advantage of
Move 's security and flexibility, enhancing it with the features to vastly improve throughput, reduce delays in
finality , and make
Move programming more approachable. For full details, see the Sui Smart Contracts Platform whitepaper.
tip
Where the Sui documentation refers to the
Move language, the content is documenting the specific
Move implementation on the Sui blockchain. If relevant, the documentation expressly refers to the original use case for the
Move language as
Move on Diem.
Key differences
Key differences of
Move on Sui include:
Sui uses its own object-centric global storage
Addresses represent object IDs
Sui objects have globally unique IDs
Sui has module initializers ( init )
Sui has unique use cases for the
entry keyword
Object -centric global storage
In
Move on Diem, global storage is part of the programming model. Resources and
modules are held in global storage, owned by an account which has an
address . Transactions are free to access resources from any account in global storage when they run, using special operations such as move_to and move_from .
This approach introduces a scaling issue, as it is not possible to statically determine which transactions are contending over the same resource and which are not. This is similar to the scaling issues faced by other blockchains where smart contracts typically store account information in large, internal mappings, which limit throughput.
Move on Sui
addresses the scaling issue by not having global storage or its related operations. When objects (in contrast to resources) and
packages (sets of
modules ) are stored on Sui, they are each given unique identifiers. All of a
transaction 's inputs are explicitly specified up front using these unique identifiers to allow the network to schedule transactions with non-overlapping inputs in parallel.
Addresses represent
object IDs
In
Move on Diem, there is a 16 byte address type used to represent account
addresses in global storage. A 16 byte
address is sufficient for the
Move on Diem security model.
Sui doesn't have global storage, so address is repurposed as a 32 byte identifier used for both objects and accounts. Each
transaction is signed by an account (the sender) that is accessible from the
transaction context, and each
object stores its address wrapped in its id: UID field.
See the address section in The
Move Book for an overview on
addresses and refer to object . move in the Sui framework for implementation details.
Object with key ability, globally unique IDs
In
Move on Diem, the key ability indicates that the type is a resource, meaning it, along with an account
address , can be used as a key in global storage.
On Sui, the key ability indicates that a struct is an
object type and comes with an additional requirement that the first field of the struct has signature id: UID to contain the
object 's unique
address on-chain. Sui's bytecode verifier ensures that new objects are always assigned fresh UID s. Identifiers are never reused.
Module initializers
As described in object-centric global storage , you publish
Move
modules into Sui storage. The Sui runtime executes a special initializer function you optionally define in a
module only once at the time of
module publication to pre-initialize
module -specific data, for example, creating singleton objects. See the module initializer section in The
Move Book for more information.
Entry functions
The entry keyword has a specific use case in
Move on Sui. Use entry when you want some functionality to be usable by anyone on chain, but not be wrapped around other
Move logic. In other words, a function can be called in programmable transaction blocks (PTBs) but not in other Sui
packages . For example, this is utilized when using Sui's on-chain randomness standard to prevent other smart contract engineers from creating logic to essentially front-run or back-run the randomness generation. Find more information about this in the on-chain randomness page .
Make your function private (don't add the public visibility keyword) and mark it with the entry keyword, as in entry fun example_function .
In addition to this Sui-specific use case, there are other rules and restrictions for entry functions:
entry functions can only return types with the drop ability.
entry functions can only take objects as inputs if they weren't used as inputs in any non- entry functions in the same
PTB .
Edit this page
Previous Coin Management
Next Gaming on Sui
Key differences
Object-centric global storage
Addresses represent object IDs
Object with key ability, globally unique IDs
Module initializers
Entry functions
© 2026 Sui Foundation | Documentation distributed under CC BY 4.0