Skip to content

Commit 7e5b886

Browse files
Update the way that keys are build in views obtained by linera-views-derive. (#4419)
## Motivation It has recently been indicated in PR #4347 that the use `ChainId` in a message would be a waste of space. But there are other wastage of key space that can be reduced. Fixes #2391 ## Proposal We check for the number of entries in views obtained by `linera-views-derive`. If lower than 256, we convert to `u8`. It is likely that we need to remove as well the `linera_views::views::MIN_VIEW_TAG`. ## Test Plan CI. ## Release Plan It is definitely breaking the testnet. ## Links None
1 parent 88768dc commit 7e5b886

17 files changed

+195
-181
lines changed

linera-views-derive/src/lib.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ fn generate_view_code(input: ItemStruct, root: bool) -> TokenStream2 {
7777
let mut num_init_keys_quotes = Vec::new();
7878
let mut pre_load_keys_quotes = Vec::new();
7979
let mut post_load_keys_quotes = Vec::new();
80+
let num_fields = input.fields.len();
8081
for (idx, e) in input.fields.iter().enumerate() {
8182
let name = e.ident.clone().unwrap();
8283
let test_flush_ident = format_ident!("deleted{}", idx);
83-
let idx_lit = syn::LitInt::new(&idx.to_string(), Span::call_site());
8484
let g = get_extended_entry(e.ty.clone());
8585
name_quotes.push(quote! { #name });
8686
rollback_quotes.push(quote! { self.#name.rollback(); });
@@ -93,15 +93,29 @@ fn generate_view_code(input: ItemStruct, root: bool) -> TokenStream2 {
9393
}
9494
});
9595
num_init_keys_quotes.push(quote! { #g :: NUM_INIT_KEYS });
96+
97+
let derive_key_logic = if num_fields < 256 {
98+
let idx_u8 = idx as u8;
99+
quote! {
100+
let __linera_reserved_index = #idx_u8;
101+
let __linera_reserved_base_key = context.base_key().derive_tag_key(linera_views::views::MIN_VIEW_TAG, &__linera_reserved_index)?;
102+
}
103+
} else {
104+
assert!(num_fields < 65536);
105+
let idx_u16 = idx as u16;
106+
quote! {
107+
let __linera_reserved_index = #idx_u16;
108+
let __linera_reserved_base_key = context.base_key().derive_tag_key(linera_views::views::MIN_VIEW_TAG, &__linera_reserved_index)?;
109+
}
110+
};
111+
96112
pre_load_keys_quotes.push(quote! {
97-
let __linera_reserved_index = #idx_lit;
98-
let __linera_reserved_base_key = context.base_key().derive_tag_key(linera_views::views::MIN_VIEW_TAG, &__linera_reserved_index)?;
113+
#derive_key_logic
99114
keys.extend(#g :: pre_load(&context.clone_with_base_key(__linera_reserved_base_key))?);
100115
});
101116
post_load_keys_quotes.push(quote! {
102-
let __linera_reserved_index = #idx_lit;
117+
#derive_key_logic
103118
let __linera_reserved_pos_next = __linera_reserved_pos + #g :: NUM_INIT_KEYS;
104-
let __linera_reserved_base_key = context.base_key().derive_tag_key(linera_views::views::MIN_VIEW_TAG, &__linera_reserved_index)?;
105119
let #name = #g :: post_load(context.clone_with_base_key(__linera_reserved_base_key), &values[__linera_reserved_pos..__linera_reserved_pos_next])?;
106120
__linera_reserved_pos = __linera_reserved_pos_next;
107121
});

linera-views-derive/src/snapshots/linera_views_derive__tests__test_generate_view_code_C.snap

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ where
2828
fn pre_load(context: &C) -> Result<Vec<Vec<u8>>, linera_views::ViewError> {
2929
use linera_views::context::Context as _;
3030
let mut keys = Vec::new();
31-
let __linera_reserved_index = 0;
31+
let __linera_reserved_index = 0u8;
3232
let __linera_reserved_base_key = context
3333
.base_key()
3434
.derive_tag_key(
@@ -41,7 +41,7 @@ where
4141
usize,
4242
>::pre_load(&context.clone_with_base_key(__linera_reserved_base_key))?,
4343
);
44-
let __linera_reserved_index = 1;
44+
let __linera_reserved_index = 1u8;
4545
let __linera_reserved_base_key = context
4646
.base_key()
4747
.derive_tag_key(
@@ -63,15 +63,15 @@ where
6363
) -> Result<Self, linera_views::ViewError> {
6464
use linera_views::context::Context as _;
6565
let mut __linera_reserved_pos = 0;
66-
let __linera_reserved_index = 0;
67-
let __linera_reserved_pos_next = __linera_reserved_pos
68-
+ RegisterView::<C, usize>::NUM_INIT_KEYS;
66+
let __linera_reserved_index = 0u8;
6967
let __linera_reserved_base_key = context
7068
.base_key()
7169
.derive_tag_key(
7270
linera_views::views::MIN_VIEW_TAG,
7371
&__linera_reserved_index,
7472
)?;
73+
let __linera_reserved_pos_next = __linera_reserved_pos
74+
+ RegisterView::<C, usize>::NUM_INIT_KEYS;
7575
let register = RegisterView::<
7676
C,
7777
usize,
@@ -80,15 +80,15 @@ where
8080
&values[__linera_reserved_pos..__linera_reserved_pos_next],
8181
)?;
8282
__linera_reserved_pos = __linera_reserved_pos_next;
83-
let __linera_reserved_index = 1;
84-
let __linera_reserved_pos_next = __linera_reserved_pos
85-
+ CollectionView::<C, usize, RegisterView<C, usize>>::NUM_INIT_KEYS;
83+
let __linera_reserved_index = 1u8;
8684
let __linera_reserved_base_key = context
8785
.base_key()
8886
.derive_tag_key(
8987
linera_views::views::MIN_VIEW_TAG,
9088
&__linera_reserved_index,
9189
)?;
90+
let __linera_reserved_pos_next = __linera_reserved_pos
91+
+ CollectionView::<C, usize, RegisterView<C, usize>>::NUM_INIT_KEYS;
9292
let collection = CollectionView::<
9393
C,
9494
usize,

linera-views-derive/src/snapshots/linera_views_derive__tests__test_generate_view_code_C_with_where.snap

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ where
2929
fn pre_load(context: &C) -> Result<Vec<Vec<u8>>, linera_views::ViewError> {
3030
use linera_views::context::Context as _;
3131
let mut keys = Vec::new();
32-
let __linera_reserved_index = 0;
32+
let __linera_reserved_index = 0u8;
3333
let __linera_reserved_base_key = context
3434
.base_key()
3535
.derive_tag_key(
@@ -42,7 +42,7 @@ where
4242
usize,
4343
>::pre_load(&context.clone_with_base_key(__linera_reserved_base_key))?,
4444
);
45-
let __linera_reserved_index = 1;
45+
let __linera_reserved_index = 1u8;
4646
let __linera_reserved_base_key = context
4747
.base_key()
4848
.derive_tag_key(
@@ -64,15 +64,15 @@ where
6464
) -> Result<Self, linera_views::ViewError> {
6565
use linera_views::context::Context as _;
6666
let mut __linera_reserved_pos = 0;
67-
let __linera_reserved_index = 0;
68-
let __linera_reserved_pos_next = __linera_reserved_pos
69-
+ RegisterView::<C, usize>::NUM_INIT_KEYS;
67+
let __linera_reserved_index = 0u8;
7068
let __linera_reserved_base_key = context
7169
.base_key()
7270
.derive_tag_key(
7371
linera_views::views::MIN_VIEW_TAG,
7472
&__linera_reserved_index,
7573
)?;
74+
let __linera_reserved_pos_next = __linera_reserved_pos
75+
+ RegisterView::<C, usize>::NUM_INIT_KEYS;
7676
let register = RegisterView::<
7777
C,
7878
usize,
@@ -81,15 +81,15 @@ where
8181
&values[__linera_reserved_pos..__linera_reserved_pos_next],
8282
)?;
8383
__linera_reserved_pos = __linera_reserved_pos_next;
84-
let __linera_reserved_index = 1;
85-
let __linera_reserved_pos_next = __linera_reserved_pos
86-
+ CollectionView::<C, usize, RegisterView<C, usize>>::NUM_INIT_KEYS;
84+
let __linera_reserved_index = 1u8;
8785
let __linera_reserved_base_key = context
8886
.base_key()
8987
.derive_tag_key(
9088
linera_views::views::MIN_VIEW_TAG,
9189
&__linera_reserved_index,
9290
)?;
91+
let __linera_reserved_pos_next = __linera_reserved_pos
92+
+ CollectionView::<C, usize, RegisterView<C, usize>>::NUM_INIT_KEYS;
9393
let collection = CollectionView::<
9494
C,
9595
usize,

linera-views-derive/src/snapshots/linera_views_derive__tests__test_generate_view_code_CustomContext.snap

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ where
3333
) -> Result<Vec<Vec<u8>>, linera_views::ViewError> {
3434
use linera_views::context::Context as _;
3535
let mut keys = Vec::new();
36-
let __linera_reserved_index = 0;
36+
let __linera_reserved_index = 0u8;
3737
let __linera_reserved_base_key = context
3838
.base_key()
3939
.derive_tag_key(
@@ -46,7 +46,7 @@ where
4646
usize,
4747
>::pre_load(&context.clone_with_base_key(__linera_reserved_base_key))?,
4848
);
49-
let __linera_reserved_index = 1;
49+
let __linera_reserved_index = 1u8;
5050
let __linera_reserved_base_key = context
5151
.base_key()
5252
.derive_tag_key(
@@ -68,15 +68,15 @@ where
6868
) -> Result<Self, linera_views::ViewError> {
6969
use linera_views::context::Context as _;
7070
let mut __linera_reserved_pos = 0;
71-
let __linera_reserved_index = 0;
72-
let __linera_reserved_pos_next = __linera_reserved_pos
73-
+ RegisterView::<CustomContext, usize>::NUM_INIT_KEYS;
71+
let __linera_reserved_index = 0u8;
7472
let __linera_reserved_base_key = context
7573
.base_key()
7674
.derive_tag_key(
7775
linera_views::views::MIN_VIEW_TAG,
7876
&__linera_reserved_index,
7977
)?;
78+
let __linera_reserved_pos_next = __linera_reserved_pos
79+
+ RegisterView::<CustomContext, usize>::NUM_INIT_KEYS;
8080
let register = RegisterView::<
8181
CustomContext,
8282
usize,
@@ -85,19 +85,19 @@ where
8585
&values[__linera_reserved_pos..__linera_reserved_pos_next],
8686
)?;
8787
__linera_reserved_pos = __linera_reserved_pos_next;
88-
let __linera_reserved_index = 1;
89-
let __linera_reserved_pos_next = __linera_reserved_pos
90-
+ CollectionView::<
91-
CustomContext,
92-
usize,
93-
RegisterView<CustomContext, usize>,
94-
>::NUM_INIT_KEYS;
88+
let __linera_reserved_index = 1u8;
9589
let __linera_reserved_base_key = context
9690
.base_key()
9791
.derive_tag_key(
9892
linera_views::views::MIN_VIEW_TAG,
9993
&__linera_reserved_index,
10094
)?;
95+
let __linera_reserved_pos_next = __linera_reserved_pos
96+
+ CollectionView::<
97+
CustomContext,
98+
usize,
99+
RegisterView<CustomContext, usize>,
100+
>::NUM_INIT_KEYS;
101101
let collection = CollectionView::<
102102
CustomContext,
103103
usize,

linera-views-derive/src/snapshots/linera_views_derive__tests__test_generate_view_code_CustomContext_with_where.snap

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ where
3434
) -> Result<Vec<Vec<u8>>, linera_views::ViewError> {
3535
use linera_views::context::Context as _;
3636
let mut keys = Vec::new();
37-
let __linera_reserved_index = 0;
37+
let __linera_reserved_index = 0u8;
3838
let __linera_reserved_base_key = context
3939
.base_key()
4040
.derive_tag_key(
@@ -47,7 +47,7 @@ where
4747
usize,
4848
>::pre_load(&context.clone_with_base_key(__linera_reserved_base_key))?,
4949
);
50-
let __linera_reserved_index = 1;
50+
let __linera_reserved_index = 1u8;
5151
let __linera_reserved_base_key = context
5252
.base_key()
5353
.derive_tag_key(
@@ -69,15 +69,15 @@ where
6969
) -> Result<Self, linera_views::ViewError> {
7070
use linera_views::context::Context as _;
7171
let mut __linera_reserved_pos = 0;
72-
let __linera_reserved_index = 0;
73-
let __linera_reserved_pos_next = __linera_reserved_pos
74-
+ RegisterView::<CustomContext, usize>::NUM_INIT_KEYS;
72+
let __linera_reserved_index = 0u8;
7573
let __linera_reserved_base_key = context
7674
.base_key()
7775
.derive_tag_key(
7876
linera_views::views::MIN_VIEW_TAG,
7977
&__linera_reserved_index,
8078
)?;
79+
let __linera_reserved_pos_next = __linera_reserved_pos
80+
+ RegisterView::<CustomContext, usize>::NUM_INIT_KEYS;
8181
let register = RegisterView::<
8282
CustomContext,
8383
usize,
@@ -86,19 +86,19 @@ where
8686
&values[__linera_reserved_pos..__linera_reserved_pos_next],
8787
)?;
8888
__linera_reserved_pos = __linera_reserved_pos_next;
89-
let __linera_reserved_index = 1;
90-
let __linera_reserved_pos_next = __linera_reserved_pos
91-
+ CollectionView::<
92-
CustomContext,
93-
usize,
94-
RegisterView<CustomContext, usize>,
95-
>::NUM_INIT_KEYS;
89+
let __linera_reserved_index = 1u8;
9690
let __linera_reserved_base_key = context
9791
.base_key()
9892
.derive_tag_key(
9993
linera_views::views::MIN_VIEW_TAG,
10094
&__linera_reserved_index,
10195
)?;
96+
let __linera_reserved_pos_next = __linera_reserved_pos
97+
+ CollectionView::<
98+
CustomContext,
99+
usize,
100+
RegisterView<CustomContext, usize>,
101+
>::NUM_INIT_KEYS;
102102
let collection = CollectionView::<
103103
CustomContext,
104104
usize,

linera-views-derive/src/snapshots/linera_views_derive__tests__test_generate_view_code_custom__GenericContext_T_.snap

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ where
3333
) -> Result<Vec<Vec<u8>>, linera_views::ViewError> {
3434
use linera_views::context::Context as _;
3535
let mut keys = Vec::new();
36-
let __linera_reserved_index = 0;
36+
let __linera_reserved_index = 0u8;
3737
let __linera_reserved_base_key = context
3838
.base_key()
3939
.derive_tag_key(
@@ -46,7 +46,7 @@ where
4646
usize,
4747
>::pre_load(&context.clone_with_base_key(__linera_reserved_base_key))?,
4848
);
49-
let __linera_reserved_index = 1;
49+
let __linera_reserved_index = 1u8;
5050
let __linera_reserved_base_key = context
5151
.base_key()
5252
.derive_tag_key(
@@ -68,15 +68,15 @@ where
6868
) -> Result<Self, linera_views::ViewError> {
6969
use linera_views::context::Context as _;
7070
let mut __linera_reserved_pos = 0;
71-
let __linera_reserved_index = 0;
72-
let __linera_reserved_pos_next = __linera_reserved_pos
73-
+ RegisterView::<custom::GenericContext<T>, usize>::NUM_INIT_KEYS;
71+
let __linera_reserved_index = 0u8;
7472
let __linera_reserved_base_key = context
7573
.base_key()
7674
.derive_tag_key(
7775
linera_views::views::MIN_VIEW_TAG,
7876
&__linera_reserved_index,
7977
)?;
78+
let __linera_reserved_pos_next = __linera_reserved_pos
79+
+ RegisterView::<custom::GenericContext<T>, usize>::NUM_INIT_KEYS;
8080
let register = RegisterView::<
8181
custom::GenericContext<T>,
8282
usize,
@@ -85,19 +85,19 @@ where
8585
&values[__linera_reserved_pos..__linera_reserved_pos_next],
8686
)?;
8787
__linera_reserved_pos = __linera_reserved_pos_next;
88-
let __linera_reserved_index = 1;
89-
let __linera_reserved_pos_next = __linera_reserved_pos
90-
+ CollectionView::<
91-
custom::GenericContext<T>,
92-
usize,
93-
RegisterView<custom::GenericContext<T>, usize>,
94-
>::NUM_INIT_KEYS;
88+
let __linera_reserved_index = 1u8;
9589
let __linera_reserved_base_key = context
9690
.base_key()
9791
.derive_tag_key(
9892
linera_views::views::MIN_VIEW_TAG,
9993
&__linera_reserved_index,
10094
)?;
95+
let __linera_reserved_pos_next = __linera_reserved_pos
96+
+ CollectionView::<
97+
custom::GenericContext<T>,
98+
usize,
99+
RegisterView<custom::GenericContext<T>, usize>,
100+
>::NUM_INIT_KEYS;
101101
let collection = CollectionView::<
102102
custom::GenericContext<T>,
103103
usize,

0 commit comments

Comments
 (0)