Open
Description
Motivation
Suppose we have rust structure:
#[derive(BorshSerialize, BorshDeserialize)]
struct A {
f1: T1,
f2: T2
}
Suppose we have serialized into some data (e.g. on disk in rocksdb, in contract state, or circulating in network). Then we want to upgrade this structure by adding another field:
#[derive(BorshSerialize, BorshDeserialize)]
struct A {
f1: T1,
f2: T2,
f3: T3
}
It would be extremely convenient for upgradability if we could deserialize old data using new Rust type.
Proposal
We can introduce #[borsh_optional]
decorator that can be used like this:
#[derive(BorshSerialize, BorshDeserialize)]
struct A {
f1: T1,
f2: T2,
#[borsh_optional]
f3: Option<T3>
}
Then when we deserialize old data with this structure f3
will be None
, but when we deserialize new data using this structure it will be Some
.
It will only work if optional fields are included at the back:
#[derive(BorshSerialize, BorshDeserialize)]
struct A {
f1: T1,
f2: T2,
#[borsh_optional]
f3: Option<T3>,
#[borsh_optional]
f4: Option<T4>,
#[borsh_optional]
f5: Option<T5>
}
And the compilation should fail if the following situations:
#[derive(BorshSerialize, BorshDeserialize)]
struct A {
f1: T1,
f2: T2,
#[borsh_optional]
f3: Option<T3>,
f4: Option<T4>,
#[borsh_optional]
f5: Option<T5>
}
CC @mfornet Since it might be relevant to near/NEPs#95
Metadata
Assignees
Labels
No labels