Skip to content

Commit a196bc3

Browse files
authored
[move-model-2] Rewrite normalized module for broader use (MystenLabs#21751)
## Description - Improved efficiency of normalized module through use of Rcs - Generalized Identifiers to allow for different "interned" symbols ## Test plan - Ran tests --- ## Release notes Check each box that your changes affect. If none of the boxes relate to your changes, release notes aren't required. For each box you select, include information after the relevant heading that describes the impact of your changes that a user might notice and any actions they must take to implement updates. - [ ] Protocol: - [ ] Nodes (Validators and Full nodes): - [ ] gRPC: - [ ] JSON-RPC: - [ ] GraphQL: - [ ] CLI: - [ ] Rust SDK:
1 parent d460cd6 commit a196bc3

File tree

32 files changed

+1983
-1473
lines changed

32 files changed

+1983
-1473
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/sui-core/src/unit_tests/move_package_upgrade_tests.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,11 @@ async fn test_upgrade_package_happy_path() {
329329
.unwrap();
330330
let config = ProtocolConfig::get_for_max_version_UNSAFE();
331331
let binary_config = to_binary_config(&config);
332-
let normalized_modules = package.move_package().normalize(&binary_config).unwrap();
332+
let pool = &mut move_binary_format::normalized::RcPool::new();
333+
let normalized_modules = package
334+
.move_package()
335+
.normalize(pool, &binary_config, /* include code */ true)
336+
.unwrap();
333337
assert!(normalized_modules.contains_key("new_module"));
334338
assert!(normalized_modules["new_module"]
335339
.functions

crates/sui-framework/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Mysten Labs, Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
use move_binary_format::normalized;
45
use move_binary_format::{
56
binary_config::BinaryConfig, compatibility::Compatibility, CompiledModule,
67
};
@@ -248,14 +249,17 @@ pub async fn compare_system_package<S: ObjectStore>(
248249
.try_as_package_mut()
249250
.expect("Created as package");
250251

251-
let cur_normalized = match cur_pkg.normalize(binary_config) {
252+
let pool = &mut normalized::RcPool::new();
253+
let cur_normalized = match cur_pkg.normalize(pool, binary_config, /* include code */ false) {
252254
Ok(v) => v,
253255
Err(e) => {
254256
error!("Could not normalize existing package: {e:?}");
255257
return None;
256258
}
257259
};
258-
let mut new_normalized = new_pkg.normalize(binary_config).ok()?;
260+
let mut new_normalized = new_pkg
261+
.normalize(pool, binary_config, /* include code */ false)
262+
.ok()?;
259263

260264
for (name, cur_module) in cur_normalized {
261265
let new_module = new_normalized.remove(&name)?;

crates/sui-indexer-alt-jsonrpc/src/api/move_utils/response.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,12 @@ fn normalized_type(sig: &OpenSignatureBody) -> SuiMoveNormalizedType {
111111
S::U128 => T::U128,
112112
S::U256 => T::U256,
113113
S::Vector(sig) => T::Vector(Box::new(normalized_type(sig))),
114-
S::Datatype(t, params) => T::Struct {
115-
address: t.package.to_canonical_string(/* with_prefix */ true),
116-
module: t.module.to_string(),
117-
name: t.name.to_string(),
118-
type_arguments: params.iter().map(normalized_type).collect(),
119-
},
114+
S::Datatype(t, params) => T::new_struct(
115+
t.package.to_canonical_string(/* with_prefix */ true),
116+
t.module.to_string(),
117+
t.name.to_string(),
118+
params.iter().map(normalized_type).collect(),
119+
),
120120
S::TypeParameter(ix) => T::TypeParameter(*ix),
121121
}
122122
}

crates/sui-indexer/src/apis/move_utils.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::collections::BTreeMap;
66
use async_trait::async_trait;
77
use jsonrpsee::core::RpcResult;
88
use jsonrpsee::RpcModule;
9-
use move_binary_format::normalized::Module as NormalizedModule;
9+
use move_binary_format::normalized;
1010

1111
use sui_json_rpc::error::SuiRpcInputError;
1212
use sui_json_rpc::SuiRpcModule;
@@ -39,9 +39,13 @@ impl MoveUtilsServer for MoveUtilsApi {
3939
package_id: ObjectID,
4040
) -> RpcResult<BTreeMap<String, SuiMoveNormalizedModule>> {
4141
let resolver_modules = self.inner.get_package(package_id).await?.modules().clone();
42+
let pool = &mut normalized::RcPool::new();
4243
let sui_normalized_modules = resolver_modules
4344
.into_iter()
44-
.map(|(k, v)| (k, NormalizedModule::new(v.bytecode()).into()))
45+
.map(|(k, v)| {
46+
let m = &normalized::Module::new(pool, v.bytecode(), /* include code */ false);
47+
(k, m.into())
48+
})
4549
.collect::<BTreeMap<String, SuiMoveNormalizedModule>>();
4650
Ok(sui_normalized_modules)
4751
}

crates/sui-json-rpc-types/src/sui_move.rs

Lines changed: 106 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use colored::Colorize;
55
use itertools::Itertools;
66
use move_binary_format::file_format::{Ability, AbilitySet, DatatypeTyParameter, Visibility};
77
use move_binary_format::normalized::{
8-
Enum as NormalizedEnum, Field as NormalizedField, Function as SuiNormalizedFunction,
8+
self, Enum as NormalizedEnum, Field as NormalizedField, Function as NormalizedFunction,
99
Module as NormalizedModule, Struct as NormalizedStruct, Type as NormalizedType,
1010
};
1111
use move_core_types::annotated_value::{MoveStruct, MoveValue, MoveVariant};
@@ -91,19 +91,25 @@ pub enum SuiMoveNormalizedType {
9191
U256,
9292
Address,
9393
Signer,
94-
#[serde(rename_all = "camelCase")]
9594
Struct {
96-
address: String,
97-
module: String,
98-
name: String,
99-
type_arguments: Vec<SuiMoveNormalizedType>,
95+
#[serde(flatten)]
96+
inner: Box<SuiMoveNormalizedStructType>,
10097
},
10198
Vector(Box<SuiMoveNormalizedType>),
10299
TypeParameter(SuiMoveTypeParameterIndex),
103100
Reference(Box<SuiMoveNormalizedType>),
104101
MutableReference(Box<SuiMoveNormalizedType>),
105102
}
106103

104+
#[derive(Serialize, Deserialize, Debug, JsonSchema, Clone)]
105+
#[serde(rename_all = "camelCase")]
106+
pub struct SuiMoveNormalizedStructType {
107+
pub address: String,
108+
pub module: String,
109+
pub name: String,
110+
pub type_arguments: Vec<SuiMoveNormalizedType>,
111+
}
112+
107113
#[derive(Serialize, Deserialize, Debug, JsonSchema, Clone)]
108114
#[serde(rename_all = "camelCase")]
109115
pub struct SuiMoveNormalizedFunction {
@@ -141,45 +147,53 @@ impl PartialEq for SuiMoveNormalizedModule {
141147
}
142148
}
143149

144-
impl From<NormalizedModule> for SuiMoveNormalizedModule {
145-
fn from(module: NormalizedModule) -> Self {
150+
impl<S: std::hash::Hash + Eq + ToString> From<&NormalizedModule<S>> for SuiMoveNormalizedModule {
151+
fn from(module: &NormalizedModule<S>) -> Self {
146152
Self {
147153
file_format_version: module.file_format_version,
148-
address: module.address.to_hex_literal(),
149-
name: module.name.to_string(),
154+
address: module.address().to_hex_literal(),
155+
name: module.name().to_string(),
150156
friends: module
151157
.friends
152-
.into_iter()
158+
.iter()
153159
.map(|module_id| SuiMoveModuleId {
154-
address: module_id.address().to_hex_literal(),
155-
name: module_id.name().to_string(),
160+
address: module_id.address.to_hex_literal(),
161+
name: module_id.name.to_string(),
156162
})
157163
.collect::<Vec<SuiMoveModuleId>>(),
158164
structs: module
159165
.structs
160-
.into_iter()
161-
.map(|(name, struct_)| (name.to_string(), SuiMoveNormalizedStruct::from(struct_)))
166+
.iter()
167+
.map(|(name, struct_)| {
168+
(name.to_string(), SuiMoveNormalizedStruct::from(&**struct_))
169+
})
162170
.collect::<BTreeMap<String, SuiMoveNormalizedStruct>>(),
163171
enums: module
164172
.enums
165-
.into_iter()
166-
.map(|(name, enum_)| (name.to_string(), SuiMoveNormalizedEnum::from(enum_)))
173+
.iter()
174+
.map(|(name, enum_)| (name.to_string(), SuiMoveNormalizedEnum::from(&**enum_)))
167175
.collect(),
168176
exposed_functions: module
169177
.functions
170-
.into_iter()
171-
.filter_map(|(name, function)| {
178+
.iter()
179+
.filter(|(_name, function)| {
180+
function.is_entry || function.visibility != Visibility::Private
181+
})
182+
.map(|(name, function)| {
172183
// TODO: Do we want to expose the private functions as well?
173-
(function.is_entry || function.visibility != Visibility::Private)
174-
.then(|| (name.to_string(), SuiMoveNormalizedFunction::from(function)))
184+
185+
(
186+
name.to_string(),
187+
SuiMoveNormalizedFunction::from(&**function),
188+
)
175189
})
176190
.collect::<BTreeMap<String, SuiMoveNormalizedFunction>>(),
177191
}
178192
}
179193
}
180194

181-
impl From<SuiNormalizedFunction> for SuiMoveNormalizedFunction {
182-
fn from(function: SuiNormalizedFunction) -> Self {
195+
impl<S: ToString> From<&NormalizedFunction<S>> for SuiMoveNormalizedFunction {
196+
fn from(function: &NormalizedFunction<S>) -> Self {
183197
Self {
184198
visibility: match function.visibility {
185199
Visibility::Private => SuiMoveVisibility::Private,
@@ -189,59 +203,62 @@ impl From<SuiNormalizedFunction> for SuiMoveNormalizedFunction {
189203
is_entry: function.is_entry,
190204
type_parameters: function
191205
.type_parameters
192-
.into_iter()
206+
.iter()
207+
.copied()
193208
.map(|a| a.into())
194209
.collect::<Vec<SuiMoveAbilitySet>>(),
195210
parameters: function
196211
.parameters
197-
.into_iter()
198-
.map(SuiMoveNormalizedType::from)
212+
.iter()
213+
.map(|t| SuiMoveNormalizedType::from(&**t))
199214
.collect::<Vec<SuiMoveNormalizedType>>(),
200215
return_: function
201216
.return_
202-
.into_iter()
203-
.map(SuiMoveNormalizedType::from)
217+
.iter()
218+
.map(|t| SuiMoveNormalizedType::from(&**t))
204219
.collect::<Vec<SuiMoveNormalizedType>>(),
205220
}
206221
}
207222
}
208223

209-
impl From<NormalizedStruct> for SuiMoveNormalizedStruct {
210-
fn from(struct_: NormalizedStruct) -> Self {
224+
impl<S: ToString> From<&NormalizedStruct<S>> for SuiMoveNormalizedStruct {
225+
fn from(struct_: &NormalizedStruct<S>) -> Self {
211226
Self {
212227
abilities: struct_.abilities.into(),
213228
type_parameters: struct_
214229
.type_parameters
215-
.into_iter()
230+
.iter()
231+
.copied()
216232
.map(SuiMoveStructTypeParameter::from)
217233
.collect::<Vec<SuiMoveStructTypeParameter>>(),
218234
fields: struct_
219235
.fields
220-
.into_iter()
221-
.map(SuiMoveNormalizedField::from)
236+
.iter()
237+
.map(|f| SuiMoveNormalizedField::from(&**f))
222238
.collect::<Vec<SuiMoveNormalizedField>>(),
223239
}
224240
}
225241
}
226242

227-
impl From<NormalizedEnum> for SuiMoveNormalizedEnum {
228-
fn from(value: NormalizedEnum) -> Self {
243+
impl<S: ToString> From<&NormalizedEnum<S>> for SuiMoveNormalizedEnum {
244+
fn from(value: &NormalizedEnum<S>) -> Self {
229245
Self {
230246
abilities: value.abilities.into(),
231247
type_parameters: value
232248
.type_parameters
233-
.into_iter()
249+
.iter()
250+
.copied()
234251
.map(SuiMoveStructTypeParameter::from)
235252
.collect::<Vec<SuiMoveStructTypeParameter>>(),
236253
variants: value
237254
.variants
238-
.into_iter()
255+
.iter()
239256
.map(|variant| {
240257
(
241258
variant.name.to_string(),
242259
variant
243260
.fields
244-
.into_iter()
261+
.iter()
245262
.map(SuiMoveNormalizedField::from)
246263
.collect::<Vec<SuiMoveNormalizedField>>(),
247264
)
@@ -260,17 +277,17 @@ impl From<DatatypeTyParameter> for SuiMoveStructTypeParameter {
260277
}
261278
}
262279

263-
impl From<NormalizedField> for SuiMoveNormalizedField {
264-
fn from(normalized_field: NormalizedField) -> Self {
280+
impl<S: ToString> From<&NormalizedField<S>> for SuiMoveNormalizedField {
281+
fn from(normalized_field: &NormalizedField<S>) -> Self {
265282
Self {
266283
name: normalized_field.name.to_string(),
267-
type_: SuiMoveNormalizedType::from(normalized_field.type_),
284+
type_: SuiMoveNormalizedType::from(&normalized_field.type_),
268285
}
269286
}
270287
}
271288

272-
impl From<NormalizedType> for SuiMoveNormalizedType {
273-
fn from(type_: NormalizedType) -> Self {
289+
impl<S: ToString> From<&NormalizedType<S>> for SuiMoveNormalizedType {
290+
fn from(type_: &NormalizedType<S>) -> Self {
274291
match type_ {
275292
NormalizedType::Bool => SuiMoveNormalizedType::Bool,
276293
NormalizedType::U8 => SuiMoveNormalizedType::U8,
@@ -281,30 +298,32 @@ impl From<NormalizedType> for SuiMoveNormalizedType {
281298
NormalizedType::U256 => SuiMoveNormalizedType::U256,
282299
NormalizedType::Address => SuiMoveNormalizedType::Address,
283300
NormalizedType::Signer => SuiMoveNormalizedType::Signer,
284-
NormalizedType::Struct {
285-
address,
286-
module,
287-
name,
288-
type_arguments,
289-
} => SuiMoveNormalizedType::Struct {
290-
address: address.to_hex_literal(),
291-
module: module.to_string(),
292-
name: name.to_string(),
293-
type_arguments: type_arguments
294-
.into_iter()
295-
.map(SuiMoveNormalizedType::from)
296-
.collect::<Vec<SuiMoveNormalizedType>>(),
297-
},
298-
NormalizedType::Vector(v) => {
299-
SuiMoveNormalizedType::Vector(Box::new(SuiMoveNormalizedType::from(*v)))
301+
NormalizedType::Datatype(dt) => {
302+
let normalized::Datatype {
303+
module,
304+
name,
305+
type_arguments,
306+
} = &**dt;
307+
SuiMoveNormalizedType::new_struct(
308+
module.address.to_hex_literal(),
309+
module.name.to_string(),
310+
name.to_string(),
311+
type_arguments
312+
.iter()
313+
.map(SuiMoveNormalizedType::from)
314+
.collect::<Vec<SuiMoveNormalizedType>>(),
315+
)
300316
}
301-
NormalizedType::TypeParameter(t) => SuiMoveNormalizedType::TypeParameter(t),
302-
NormalizedType::Reference(r) => {
303-
SuiMoveNormalizedType::Reference(Box::new(SuiMoveNormalizedType::from(*r)))
317+
NormalizedType::Vector(v) => {
318+
SuiMoveNormalizedType::Vector(Box::new(SuiMoveNormalizedType::from(&**v)))
304319
}
305-
NormalizedType::MutableReference(mr) => {
306-
SuiMoveNormalizedType::MutableReference(Box::new(SuiMoveNormalizedType::from(*mr)))
320+
NormalizedType::TypeParameter(t) => SuiMoveNormalizedType::TypeParameter(*t),
321+
NormalizedType::Reference(false, r) => {
322+
SuiMoveNormalizedType::Reference(Box::new(SuiMoveNormalizedType::from(&**r)))
307323
}
324+
NormalizedType::Reference(true, mr) => SuiMoveNormalizedType::MutableReference(
325+
Box::new(SuiMoveNormalizedType::from(&**mr)),
326+
),
308327
}
309328
}
310329
}
@@ -325,6 +344,24 @@ impl From<AbilitySet> for SuiMoveAbilitySet {
325344
}
326345
}
327346

347+
impl SuiMoveNormalizedType {
348+
pub fn new_struct(
349+
address: String,
350+
module: String,
351+
name: String,
352+
type_arguments: Vec<SuiMoveNormalizedType>,
353+
) -> Self {
354+
SuiMoveNormalizedType::Struct {
355+
inner: Box::new(SuiMoveNormalizedStructType {
356+
address,
357+
module,
358+
name,
359+
type_arguments,
360+
}),
361+
}
362+
}
363+
}
364+
328365
#[derive(Serialize, Deserialize, Debug, JsonSchema, Clone)]
329366
pub enum ObjectValueKind {
330367
ByImmutableReference,
@@ -653,3 +690,8 @@ impl From<MoveStruct> for SuiMoveStruct {
653690
}
654691
}
655692
}
693+
694+
#[test]
695+
fn enum_size() {
696+
assert_eq!(std::mem::size_of::<SuiMoveNormalizedType>(), 16);
697+
}

0 commit comments

Comments
 (0)