Add metadata v10/11, blake2_128concat hasher (#1691)
* v11, blake2_128concat * MetadataAll * Add storage hasher v4 and v10 * Make lint pass * Add correct interfaces * Fix lint * Update metadata definitions * Update v10 metadata * Update packages/types/src/interfaces/utility/definitions.ts * Update v11 * Add HACK * Skip v9 tests (part of HACK) * Correct function names Co-authored-by: Amaury Martiny <amaury.martiny@protonmail.com>
This commit is contained in:
committed by
Amaury Martiny
co-authored by
Amaury Martiny
parent
131055c1d5
commit
82828d8e09
@@ -23,6 +23,17 @@ export default class Metadata extends MetadataVersioned {
|
||||
// we adjust with the magic number and a manual version and re-try. As soon as
|
||||
// we remove support for V0, we will just do a new here
|
||||
private static decodeMetadata (registry: Registry, _value: Uint8Array | string = new Uint8Array()): MetadataVersioned {
|
||||
/**
|
||||
* HACK 01.02.2020
|
||||
* There was a fk-up in the metadata upgrade process: Kusama's metadata got
|
||||
* updated to a non-backward-compatible way, but the metadata version
|
||||
* stayed at v9. Then v10 was merged in Substrate but not Kusama. Here,
|
||||
* we're just saying that if it's a v9 metadata, decode as v10.
|
||||
*/
|
||||
if (isHex(_value) && _value.startsWith('0x6d65746109')) {
|
||||
return Metadata.decodeMetadata(registry, _value.replace('0x6d65746109', '0x6d6574610a'));
|
||||
}
|
||||
|
||||
const value = isHex(_value)
|
||||
? hexToU8a(_value)
|
||||
: _value;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import { MetadataAll, MetadataLatest, MetadataV0, MetadataV1, MetadataV2, MetadataV3, MetadataV4, MetadataV5, MetadataV6, MetadataV7, MetadataV8, MetadataV9, MetadataV10 } from '@polkadot/types/interfaces/metadata';
|
||||
import { MetadataAll, MetadataLatest, MetadataV0, MetadataV1, MetadataV2, MetadataV3, MetadataV4, MetadataV5, MetadataV6, MetadataV7, MetadataV8, MetadataV9, MetadataV10, MetadataV11 } from '@polkadot/types/interfaces/metadata';
|
||||
import { Registry } from '@polkadot/types/types';
|
||||
|
||||
import { createType } from '@polkadot/types/codec/create/createType';
|
||||
@@ -20,11 +20,12 @@ import v6ToV7 from './v6/toV7';
|
||||
import v7ToV8 from './v7/toV8';
|
||||
import v8ToV9 from './v8/toV9';
|
||||
import v9ToV10 from './v9/toV10';
|
||||
import v10ToV11 from './v10/toV11';
|
||||
import { getUniqTypes, toCallsOnly } from './util';
|
||||
|
||||
type MetaMapped = MetadataV0 | MetadataV1 | MetadataV2 | MetadataV3 | MetadataV4 | MetadataV5 | MetadataV6 | MetadataV7 | MetadataV8 | MetadataV9 | MetadataV10;
|
||||
type MetaVersions = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
|
||||
type MetaAsX = 'asV0' | 'asV1' | 'asV2' | 'asV3' | 'asV4' | 'asV5' | 'asV6' | 'asV7' | 'asV8' | 'asV9' | 'asV10';
|
||||
type MetaMapped = MetadataV0 | MetadataV1 | MetadataV2 | MetadataV3 | MetadataV4 | MetadataV5 | MetadataV6 | MetadataV7 | MetadataV8 | MetadataV9 | MetadataV10 | MetadataV11;
|
||||
type MetaVersions = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
|
||||
type MetaAsX = 'asV0' | 'asV1' | 'asV2' | 'asV3' | 'asV4' | 'asV5' | 'asV6' | 'asV7' | 'asV8' | 'asV9' | 'asV10' | 'asV11';
|
||||
|
||||
/**
|
||||
* @name MetadataVersioned
|
||||
@@ -153,11 +154,18 @@ export default class MetadataVersioned extends Struct {
|
||||
return this.getVersion(10, v9ToV10);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the wrapped values as a V10 object
|
||||
*/
|
||||
public get asV11 (): MetadataV11 {
|
||||
return this.getVersion(11, v10ToV11);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Returns the wrapped values as a latest version object
|
||||
*/
|
||||
public get asLatest (): MetadataLatest {
|
||||
return this.asV10;
|
||||
return this.asV11;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,52 @@
|
||||
// Copyright 2017-2019 @polkadot/metadata authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import { MetadataV10, MetadataV11, ModuleMetadataV10, ModuleMetadataV11, StorageEntryTypeV10 } from '@polkadot/types/interfaces/metadata';
|
||||
import { Registry } from '@polkadot/types/types';
|
||||
|
||||
import { createType } from '@polkadot/types';
|
||||
|
||||
// migrate a storage entry type - only map types are different (with a kind enum)
|
||||
// all return the actual value for the enum, followed by the numeric index
|
||||
function createStorageType (registry: Registry, entryType: StorageEntryTypeV10): [any, number] {
|
||||
if (entryType.isPlain) {
|
||||
return [entryType.asPlain, 0];
|
||||
} else if (entryType.isDoubleMap) {
|
||||
return [entryType.asDoubleMap, 2];
|
||||
}
|
||||
|
||||
const map = entryType.asMap;
|
||||
|
||||
// map needs a migration, removing linked and adding an explicit kind
|
||||
return [{
|
||||
...map,
|
||||
kind: createType(registry, 'MapKindV11', null, map.linked.isTrue ? 1 : 0)
|
||||
}, 1];
|
||||
}
|
||||
|
||||
function convertModule (registry: Registry, mod: ModuleMetadataV10): ModuleMetadataV11 {
|
||||
const storage = mod.storage.unwrapOr(null);
|
||||
|
||||
return createType(registry, 'ModuleMetadataV11', {
|
||||
...mod,
|
||||
storage: storage
|
||||
? {
|
||||
...storage,
|
||||
items: storage.items.map((item): any => ({
|
||||
...item,
|
||||
type: createType(registry, 'StorageEntryTypeV11', ...createStorageType(registry, item.type))
|
||||
}))
|
||||
}
|
||||
: null
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert from MetadataV10 to MetadataV11
|
||||
*/
|
||||
export default function toV11 (registry: Registry, { modules }: MetadataV10): MetadataV11 {
|
||||
return createType(registry, 'MetadataV11', {
|
||||
modules: modules.map((mod): ModuleMetadataV11 => convertModule(registry, mod))
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// Copyright 2017-2019 @polkadot/metadata authors & contributors
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import { TypeRegistry } from '@polkadot/types';
|
||||
|
||||
import substrateJson from './static-substrate.json';
|
||||
import substrateData from './static';
|
||||
import { decodeLatestSubstrate, defaultValues, toLatest } from '../util/testUtil';
|
||||
|
||||
describe('MetadataV11 (substrate)', (): void => {
|
||||
const registry = new TypeRegistry();
|
||||
|
||||
decodeLatestSubstrate(registry, 11, substrateData, substrateJson);
|
||||
|
||||
toLatest(registry, 11, substrateData);
|
||||
|
||||
defaultValues(registry, substrateData);
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -5,7 +5,6 @@
|
||||
import { MetadataV3, MetadataV4, ModuleMetadataV4, StorageFunctionMetadataV3, StorageFunctionMetadataV4 } from '@polkadot/types/interfaces/metadata';
|
||||
import { Registry } from '@polkadot/types/types';
|
||||
|
||||
import StorageHasher from '@polkadot/types/primitive/StorageHasher';
|
||||
import { createType, Option } from '@polkadot/types/codec';
|
||||
|
||||
/**
|
||||
@@ -21,13 +20,13 @@ function toV4StorageFunction (registry: Registry, storageFn: StorageFunctionMeta
|
||||
? [type.asPlain, 0]
|
||||
: type.isMap
|
||||
? [createType(registry, 'MapTypeV4', {
|
||||
hasher: new StorageHasher(registry, 'Twox128'),
|
||||
hasher: createType(registry, 'StorageHasherV4', 'Twox128'),
|
||||
key: type.asMap.key,
|
||||
value: type.asMap.value,
|
||||
linked: type.asMap.linked
|
||||
}), 1]
|
||||
: [createType(registry, 'DoubleMapTypeV4', {
|
||||
hasher: new StorageHasher(registry, 'Twox128'),
|
||||
hasher: createType(registry, 'StorageHasherV4', 'Twox128'),
|
||||
key1: type.asDoubleMap.key1,
|
||||
key2: type.asDoubleMap.key2,
|
||||
value: type.asDoubleMap.value,
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import { MetadataV4, MetadataV5, ModuleMetadataV5, StorageFunctionMetadataV4, StorageFunctionMetadataV5 } from '@polkadot/types/interfaces/metadata';
|
||||
import { MetadataV4, MetadataV5, ModuleMetadataV5, StorageFunctionMetadataV4, StorageFunctionMetadataV5, StorageHasherV5 } from '@polkadot/types/interfaces/metadata';
|
||||
import { Registry } from '@polkadot/types/types';
|
||||
|
||||
import { assert } from '@polkadot/util';
|
||||
|
||||
import { createType, Option } from '@polkadot/types/codec';
|
||||
import StorageHasher from '@polkadot/types/primitive/StorageHasher';
|
||||
import Text from '@polkadot/types/primitive/Text';
|
||||
|
||||
const hasherMap: Map<string, string> = new Map([
|
||||
@@ -19,12 +18,12 @@ const hasherMap: Map<string, string> = new Map([
|
||||
['twox_64_concat', 'Twox64Concat']
|
||||
]);
|
||||
|
||||
function toStorageHasher (registry: Registry, text: Text): StorageHasher {
|
||||
function toStorageHasher (registry: Registry, text: Text): StorageHasherV5 {
|
||||
const mapped = hasherMap.get(text.toString());
|
||||
|
||||
assert(mapped, `Invalid Storage hasher: ${text.toString()}`);
|
||||
|
||||
return new StorageHasher(registry, mapped);
|
||||
return createType(registry, 'StorageHasherV5', mapped);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,7 @@ import substrateJson from './static-substrate.json';
|
||||
import substrateData from './static';
|
||||
import { decodeLatestSubstrate, defaultValues, toLatest } from '../util/testUtil';
|
||||
|
||||
describe('MetadataV9 (substrate)', (): void => {
|
||||
describe.skip('MetadataV9 (substrate)', (): void => {
|
||||
const registry = new TypeRegistry();
|
||||
|
||||
decodeLatestSubstrate(registry, 9, substrateData, substrateJson);
|
||||
|
||||
@@ -2,27 +2,40 @@
|
||||
// This software may be modified and distributed under the terms
|
||||
// of the Apache-2.0 license. See the LICENSE file for details.
|
||||
|
||||
import { MetadataV9, MetadataV10, ModuleMetadataV9, ModuleMetadataV10, StorageEntryTypeV9 } from '@polkadot/types/interfaces/metadata';
|
||||
import { MetadataV9, MetadataV10, ModuleMetadataV9, ModuleMetadataV10, StorageEntryMetadataV9, StorageEntryTypeV9, StorageHasherV9 } from '@polkadot/types/interfaces/metadata';
|
||||
import { Registry } from '@polkadot/types/types';
|
||||
|
||||
import { createType } from '@polkadot/types';
|
||||
import { createType, StorageHasherV10 } from '@polkadot/types';
|
||||
|
||||
// migrate a storage entry type - only map types are different (with a kind enum)
|
||||
// all return the actual value for the enum, followed by the numeric index
|
||||
function createStorageType (registry: Registry, entryType: StorageEntryTypeV9): [any, number] {
|
||||
if (entryType.isPlain) {
|
||||
return [entryType.asPlain, 0];
|
||||
} else if (entryType.isDoubleMap) {
|
||||
return [entryType.asDoubleMap, 2];
|
||||
// migrate a storage hasher type
|
||||
// see https://github.com/paritytech/substrate/pull/4462
|
||||
function createStorageHasher (registry: Registry, hasher: StorageHasherV9): StorageHasherV10 {
|
||||
// Blake2_128_Concat has been added at index 2, so we increment all the
|
||||
// indexes greater than 2
|
||||
if (hasher.toNumber() >= 2) {
|
||||
return createType(registry, 'StorageHasherV10', hasher.toNumber() + 1);
|
||||
}
|
||||
|
||||
const map = entryType.asMap;
|
||||
return createType(registry, 'StorageHasherV10', hasher);
|
||||
}
|
||||
|
||||
// map needs a migration, removing linked and adding an explicit kind
|
||||
return [{
|
||||
...map,
|
||||
kind: createType(registry, 'MapKindV10', null, map.linked.isTrue ? 1 : 0)
|
||||
}, 1];
|
||||
function createStorageType (registry: Registry, entryType: StorageEntryTypeV9): [any, number] {
|
||||
if (entryType.isMap) {
|
||||
return [{
|
||||
...entryType.asMap,
|
||||
hasher: createStorageHasher(registry, entryType.asMap.hasher)
|
||||
}, 1];
|
||||
}
|
||||
|
||||
if (entryType.isDoubleMap) {
|
||||
return [{
|
||||
...entryType.asDoubleMap,
|
||||
hasher: createStorageHasher(registry, entryType.asDoubleMap.hasher),
|
||||
key2Hasher: createStorageHasher(registry, entryType.asDoubleMap.key2Hasher)
|
||||
}, 2];
|
||||
}
|
||||
|
||||
return [entryType.asPlain, 0];
|
||||
}
|
||||
|
||||
function convertModule (registry: Registry, mod: ModuleMetadataV9): ModuleMetadataV10 {
|
||||
@@ -33,7 +46,7 @@ function convertModule (registry: Registry, mod: ModuleMetadataV9): ModuleMetada
|
||||
storage: storage
|
||||
? {
|
||||
...storage,
|
||||
items: storage.items.map((item): any => ({
|
||||
items: storage.items.map((item: StorageEntryMetadataV9): any => ({
|
||||
...item,
|
||||
type: createType(registry, 'StorageEntryTypeV10', ...createStorageType(registry, item.type))
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user