From 978a43cec26a515aac2e8b2ee2354598afea1dfc Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Wed, 15 Sep 2021 15:56:43 +0300 Subject: [PATCH] nns: migrate data from the old version The old contract was compiled in a such way that `Update` used all flags except `AllowCall`. Because of this it is impossible to calculate the key of any record as it requires `Crypto` native contract. Thus we iterate over all records and transform them into the serialized representation (`std.Serialize` doesn't work either). The `Name` field in the resulting structure is empty but this is not a big deal, `getRecord` continues to work. Signed-off-by: Evgenii Stratonikov --- nns/nns_contract.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/nns/nns_contract.go b/nns/nns_contract.go index 0206b95..6e9094b 100644 --- a/nns/nns_contract.go +++ b/nns/nns_contract.go @@ -82,6 +82,19 @@ func Update(nef []byte, manifest string) { // _deploy initializes defaults (total supply and registration price) on contract deploy. func _deploy(data interface{}, isUpdate bool) { if isUpdate { + ctx := storage.GetContext() + it := storage.Find(ctx, []byte{prefixRecord}, storage.None) + for iterator.Next(it) { + val := iterator.Value(it).([]interface{}) + key := val[0].(string) + oldRec := val[1].(string) + newRec := []byte{0x41, 3} // struct with 3 fields + newRec = append(newRec, 0x28, 0) // empty name + newRec = append(newRec, 0x21, 1, byte(TXT)) // 1-byte integer + newRec = append(newRec, 0x28, byte(len(oldRec))) // 1-byte len (40) + newRec = append(newRec, oldRec...) + storage.Put(ctx, key, newRec) + } return } ctx := storage.GetContext()