166-Solana的String存储

首先我们来存一个简单的东西

比如一个age和一个name

#[repr(C)]
#[derive(Clone, BorshSerialize, BorshDeserialize, Debug)]
pub struct MonsterFeatureConfig {
    pub age: u8,
    pub name: String,
}

我们现在要存这个东西

很简单

就是一个u8的age

和一个string的name

那么我们需要多大的空间呢

u8的话是1

string的话是4+长度

比如我们要存“hello”

那么就是4加上这个字符串的长度5===9

所以我们这边的空间就给1+9===10

假设我们要存"helloworld"

字符串长度为10,再加上数据结构需要的空间4

10+4===14

如果是

age:u8

name:String

那么空间就是1+14===15

那么现在我们稍微复杂一点

#[repr(C)]
#[derive(Clone, BorshSerialize, BorshDeserialize, Debug)]
pub struct MonsterFeatureConfig {
    pub age: u8,
    pub name1: String,
    pub name2: String,
}

如果是这样的2个string的属性

假设我们空间给了

1+(4+10)*2

也就是说,单个string给了14,那么string长度可以存放10

但是如果第一个string没有到10,那么第二个string的空间是紧跟着第一个string的

也就是说2个string的存储是连续的

并不会空出多余的空间

比如这样

Object {
  "data": Object {
    "data": Array [
      2,
      5,
      0,
      0,
      0,
      97,
      98,
      99,
      100,
      101,
      5,
      0,
      0,
      0,
      97,
      98,
      99,
      100,
      101,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
    ],
    "type": "Buffer",
  },
  "executable": false,
  "lamports": 1092720,

所以一个方案就是把剩余的空间补齐

    feature_config.age=2;
    feature_config.name1 = String::from("abcde");
    feature_config.name2 = String::from("abcde");
    if feature_config.name1.len()<10 {
        feature_config.name1 +=&String::from("     ");
    }
    if feature_config.name2.len()<10 {
        feature_config.name2 +=&String::from("     ");
    }

最后deserialize出来之后

    console.log('=========================')
    console.log(feature_config)
    console.log(feature_config.name1);
    console.log(feature_config.name2);
    console.log(feature_config.name1.length)
    console.log(feature_config.name2.length)
    console.log(feature_config.name1.trim());
    console.log(feature_config.name2.trim());
    console.log(feature_config.name1.trim().length);
    console.log(feature_config.name2.trim().length);

我们就是

Object {
  "data": Object {
    "data": Array [
      2,
      10,
      0,
      0,
      0,
      97,
      98,
      99,
      100,
      101,
      32,
      32,
      32,
      32,
      32,
      10,
      0,
      0,
      0,
      97,
      98,
      99,
      100,
      101,
      32,
      32,
      32,
      32,
      32,
    ],
    "type": "Buffer",
  },
  "executable": false,
  "lamports": 1092720,

这样的

FeatureConfigAccount {
  "age": 2,
  "name1": "abcde     ",
  "name2": "abcde     ",
}
abcde
abcde
10
10
abcde
abcde
5
5

说实话还是挺恶心的

你可能感兴趣的:(javascript,solana)