forked from TrueCloudLab/frostfs-contract
[#88] container: Migrate container and eACL structures
In v0.8.0: - containers were stored as stable marshaled binary, In v0.9.0: - containers are stored the same way as eACL, - eACL structure has new `token []byte field`. Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
6daaa0c6d2
commit
79b4f2cc64
1 changed files with 31 additions and 2 deletions
|
@ -64,7 +64,10 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func _deploy(data interface{}, isUpdate bool) {
|
func _deploy(data interface{}, isUpdate bool) {
|
||||||
|
ctx := storage.GetContext()
|
||||||
|
|
||||||
if isUpdate {
|
if isUpdate {
|
||||||
|
migrateContainerAndEACLStructures(ctx) // from v0.8.0 to v0.9.0
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,8 +78,6 @@ func _deploy(data interface{}, isUpdate bool) {
|
||||||
addrBalance := args[3].(interop.Hash160)
|
addrBalance := args[3].(interop.Hash160)
|
||||||
addrID := args[4].(interop.Hash160)
|
addrID := args[4].(interop.Hash160)
|
||||||
|
|
||||||
ctx := storage.GetContext()
|
|
||||||
|
|
||||||
if !common.HasUpdateAccess(ctx) {
|
if !common.HasUpdateAccess(ctx) {
|
||||||
panic("only owner can reinitialize contract")
|
panic("only owner can reinitialize contract")
|
||||||
}
|
}
|
||||||
|
@ -100,6 +101,34 @@ func _deploy(data interface{}, isUpdate bool) {
|
||||||
runtime.Log("container contract initialized")
|
runtime.Log("container contract initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func migrateContainerAndEACLStructures(ctx storage.Context) {
|
||||||
|
eACLKeyLength := containerIDSize + len(eACLPrefix)
|
||||||
|
|
||||||
|
it := storage.Find(ctx, []byte{}, storage.None)
|
||||||
|
for iterator.Next(it) {
|
||||||
|
pair := iterator.Value(it).([]interface{})
|
||||||
|
key := pair[0].([]byte)
|
||||||
|
|
||||||
|
switch len(key) {
|
||||||
|
case containerIDSize: // migrate containers
|
||||||
|
val := pair[1].([]byte)
|
||||||
|
newContainer := Container{value: val}
|
||||||
|
|
||||||
|
common.SetSerialized(ctx, key, newContainer)
|
||||||
|
case eACLKeyLength: // migrate eACLs
|
||||||
|
val := pair[1].([]byte)
|
||||||
|
eacl := std.Deserialize(val).(ExtendedACL)
|
||||||
|
newEACL := ExtendedACL{
|
||||||
|
value: eacl.value,
|
||||||
|
sig: eacl.sig,
|
||||||
|
pub: eacl.pub,
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SetSerialized(ctx, key, newEACL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Migrate(script []byte, manifest []byte, data interface{}) bool {
|
func Migrate(script []byte, manifest []byte, data interface{}) bool {
|
||||||
ctx := storage.GetReadOnlyContext()
|
ctx := storage.GetReadOnlyContext()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue