@@ -14,26 +14,31 @@ const (
1414)
1515
1616type MemoryAccount struct {
17- Vm ed25519.PublicKey
18- Name string
19- Bump uint8
20- Layout MemoryLayout
17+ Vm ed25519.PublicKey
18+ Name string
19+ Bump uint8
20+ Version MemoryVersion
21+ AccountSize uint16
22+ NumAccounts uint32
2123}
2224
2325type MemoryAccountWithData struct {
24- Vm ed25519.PublicKey
25- Name string
26- Bump uint8
27- Layout MemoryLayout
28- Data SimpleMemoryAllocator // todo: support other implementations
26+ Vm ed25519.PublicKey
27+ Name string
28+ Bump uint8
29+ Version MemoryVersion
30+ AccountSize uint16
31+ NumAccounts uint32
32+ Data SliceAllocator // todo: support other implementations
2933}
3034
3135const MemoryAccountSize = (8 + // discriminator
3236 32 + // vm
3337 MaxMemoryAccountNameLength + // name
3438 1 + // bump
35- 6 + // padding
36- 1 ) // layout
39+ 1 + // version
40+ 2 + // account_size
41+ 4 ) // num_accounts
3742
3843var MemoryAccountDiscriminator = []byte {byte (AccountTypeMemory ), 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 }
3944
@@ -53,77 +58,81 @@ func (obj *MemoryAccount) Unmarshal(data []byte) error {
5358 getKey (data , & obj .Vm , & offset )
5459 getFixedString (data , & obj .Name , MaxMemoryAccountNameLength , & offset )
5560 getUint8 (data , & obj .Bump , & offset )
56- offset += 6 // padding
57- getMemoryLayout (data , & obj .Layout , & offset )
61+ getMemoryVersion (data , & obj .Version , & offset )
62+
63+ switch obj .Version {
64+ case MemoryVersionV0 :
65+ var layout MemoryLayout
66+ offset += 5 // padding
67+ getMemoryLayout (data , & layout , & offset )
68+
69+ switch layout {
70+ case MemoryLayoutTimelock :
71+ obj .AccountSize = uint16 (GetVirtualAccountSizeInMemory (VirtualAccountTypeTimelock ))
72+ case MemoryLayoutNonce :
73+ obj .AccountSize = uint16 (GetVirtualAccountSizeInMemory (VirtualAccountTypeDurableNonce ))
74+ case MemoryLayoutRelay :
75+ obj .AccountSize = uint16 (GetVirtualAccountSizeInMemory (VirtualAccountTypeRelay ))
76+ default :
77+ return errors .New ("unsupported memory layout" )
78+ }
79+ obj .NumAccounts = MemoryV0NumAccounts
80+
81+ case MemoryVersionV1 :
82+ getUint16 (data , & obj .AccountSize , & offset )
83+ getUint32 (data , & obj .NumAccounts , & offset )
84+
85+ default :
86+ return errors .New ("invalid memory account version" )
87+ }
5888
5989 return nil
6090}
6191
6292func (obj * MemoryAccount ) String () string {
6393 return fmt .Sprintf (
64- "MemoryAccount{vm=%s,bump=%d,name=%s,layout =%d}" ,
94+ "MemoryAccount{vm=%s,bump=%d,name=%s,version=%d,num_accounts=%d,account_size =%d}" ,
6595 base58 .Encode (obj .Vm ),
6696 obj .Bump ,
6797 obj .Name ,
68- obj .Layout ,
98+ obj .Version ,
99+ obj .NumAccounts ,
100+ obj .AccountSize ,
69101 )
70102}
71103
72104func (obj * MemoryAccountWithData ) Unmarshal (data []byte ) error {
73- if len (data ) < MemoryAccountSize {
74- return ErrInvalidAccountData
105+ var memoryAccount MemoryAccount
106+ if err := memoryAccount .Unmarshal (data ); err != nil {
107+ return err
75108 }
76109
77- var offset int
110+ obj .Vm = memoryAccount .Vm
111+ obj .Name = memoryAccount .Name
112+ obj .Bump = memoryAccount .Bump
113+ obj .Version = memoryAccount .Version
114+ obj .AccountSize = memoryAccount .AccountSize
115+ obj .NumAccounts = memoryAccount .NumAccounts
78116
79- var discriminator []byte
80- getDiscriminator (data , & discriminator , & offset )
81- if ! bytes .Equal (discriminator , MemoryAccountDiscriminator ) {
117+ if len (data ) < MemoryAccountSize + GetSliceAllocatorSize (int (obj .NumAccounts ), int (obj .AccountSize )) {
82118 return ErrInvalidAccountData
83119 }
84120
85- getKey (data , & obj .Vm , & offset )
86- getFixedString (data , & obj .Name , MaxMemoryAccountNameLength , & offset )
87- getUint8 (data , & obj .Bump , & offset )
88- offset += 6 // padding
89- getMemoryLayout (data , & obj .Layout , & offset )
90-
91- switch obj .Layout {
92- case MemoryLayoutTimelock :
93- capacity := CompactStateItems
94- itemSize := int (GetVirtualAccountSizeInMemory (VirtualAccountTypeTimelock ))
95- if len (data ) < MemoryAccountSize + GetSimpleMemoryAllocatorSize (capacity , itemSize ) {
96- return ErrInvalidAccountData
97- }
98- getSimpleMemoryAllocator (data , & obj .Data , capacity , itemSize , & offset )
99- case MemoryLayoutNonce :
100- capacity := CompactStateItems
101- itemSize := int (GetVirtualAccountSizeInMemory (VirtualAccountTypeDurableNonce ))
102- if len (data ) < MemoryAccountSize + GetSimpleMemoryAllocatorSize (capacity , itemSize ) {
103- return ErrInvalidAccountData
104- }
105- getSimpleMemoryAllocator (data , & obj .Data , capacity , itemSize , & offset )
106- case MemoryLayoutRelay :
107- capacity := CompactStateItems
108- itemSize := int (GetVirtualAccountSizeInMemory (VirtualAccountTypeRelay ))
109- if len (data ) < MemoryAccountSize + GetSimpleMemoryAllocatorSize (capacity , itemSize ) {
110- return ErrInvalidAccountData
111- }
112- getSimpleMemoryAllocator (data , & obj .Data , capacity , itemSize , & offset )
113- default :
114- return errors .New ("unsupported memory layout" )
115- }
121+ offset := MemoryAccountSize
122+ getSliceAllocator (data , & obj .Data , int (obj .NumAccounts ), int (obj .AccountSize ), & offset )
116123
117124 return nil
118125}
119126
120127func (obj * MemoryAccountWithData ) String () string {
121128 return fmt .Sprintf (
122- "MemoryAccountWithData{vm=%s,name=%s,bump=%d,layout =%d,data=%s}" ,
129+ "MemoryAccountWithData{vm=%s,name=%s,bump=%d,version=%d,num_accounts=%d,account_size =%d,data=%s}" ,
123130 base58 .Encode (obj .Vm ),
124131 obj .Name ,
125132 obj .Bump ,
126- obj .Layout ,
133+ obj .Version ,
134+ obj .NumAccounts ,
135+ obj .AccountSize ,
127136 obj .Data .String (),
128137 )
129138}
0 commit comments