---
tags: research
---
# Sui Move Dialect
There are diffs between Diem(Libra(Meta(Facebook))) Move and Sui Move.
## Differences
- Object-Centric Global Storage
- Addresses Represent Object IDs
- Globally Unique Object IDs
- Module Initializers
- Object References as Entry Point Args
### Object-Global Storage
Core Move includes global storage access with `move_to`, `move_from`, etc.
Both modules and resources stored in newly generated module address in Move.
On-chain storage is expensive (duh).
Sui Move does not have global storage. None of the global storage ops are allowed in Sui Move.
Storage happens within Sui Storage, not Move Storage.
When reading an object in Move, Sui must explicitly pass all objects that need to be accessed.
### Addresses Represent Object IDs
Address type is used for global storage ops in Core Move.
Sui does not support global storage, so address type is used to represent Object ID.
### Object With Key ability, Globally Unique IDs
Objects that are internal to Move and objects that can move between Sui and Move need to be
distinct.
Since `key` ability accessed global storage and Sui doesn't have global, the `key` ability is
overridden to require a struct to have an `id: ID` field. The id must be immutable and cannot
be transferred to other objects.
### Module Initializers
An initializer can init a Sui module into Sui storage.
```
// signature
fun init(_ctx: &mut TxContext) {}
```
### Entry Points Take Object References as Input
Sui offers entry functions that can be directly called from Sui.
```
public entry fun trasnfer(c: coin::Coin<SUI>, recipient: address, _ctx: &mut TxContext) {}
```