Skip to content

Commit cf3c84f

Browse files
authored
Merge pull request #38 from ChainSafe/P0/#37
Use phase0, altair forks to fetch types instead of presets
2 parents d544305 + bc9f9b8 commit cf3c84f

File tree

10 files changed

+112
-98
lines changed

10 files changed

+112
-98
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
![ETH2_Spec_Version 0.11.2](https://img.shields.io/badge/ETH2_Spec_Version-0.11.2-2e86c1.svg)
1+
![ETH2_Spec_Version v1.1.0-alpha.7](https://img.shields.io/badge/ETH2_Spec_Version-v1.1.0.alpha.7-2e86c1.svg)

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
"build": "cross-env NODE_ENV=production webpack --color --progress",
1212
"start": "serve dist",
1313
"lint": "eslint --ext .tsx src/",
14-
"lint-fix": "eslint --ext .tsx src/ --fix"
14+
"lint:fix": "eslint --ext .tsx src/ --fix"
1515
},
1616
"dependencies": {
1717
"@babel/runtime": "^7.5.5",
18-
"@chainsafe/lodestar-config": "^0.9.0",
19-
"@chainsafe/lodestar-types": "^0.9.0",
20-
"@chainsafe/ssz": "^0.6.7",
18+
"@chainsafe/lodestar-config": "^0.25.0",
19+
"@chainsafe/lodestar-types": "^0.25.0",
20+
"@chainsafe/ssz": "^0.8.11",
2121
"@types/bn.js": "^4.11.5",
2222
"@types/deep-equal": "^1.0.1",
2323
"@types/file-saver": "^2.0.1",

src/components/Input.tsx

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import * as React from "react";
2-
import {presets, typeNames, PresetName} from "../util/types";
2+
import {
3+
ForkName, typeNames, forks} from "../util/types";
34
import {Type, toHexString} from "@chainsafe/ssz";
45
import {ChangeEvent} from "react";
56
import {inputTypes} from "../util/input_types";
67
import {withAlert} from "react-alert";
78
import worker from "workerize-loader!./worker"; // eslint-disable-line import/no-unresolved
89

910
type Props<T> = {
10-
onProcess: (presetName: PresetName, name: string, input: string | T, type: Type<T>, inputType: string) => void;
11+
onProcess: (forkName: ForkName,
12+
name: string, input: string | T, type: Type<T>, inputType: string) => void;
1113
serializeModeOn: boolean;
1214
sszType: Type<T>;
1315
serialized: Uint8Array | undefined;
@@ -17,31 +19,35 @@ type Props<T> = {
1719
};
1820

1921
type State = {
20-
presetName: PresetName;
22+
forkName: ForkName;
2123
sszTypeName: string;
2224
input: string;
2325
serializeInputType: string;
2426
deserializeInputType: string;
2527
value: object | string;
2628
};
2729

30+
function getRandomType(types: Record<string, Type<unknown>>): string {
31+
const names = typeNames(types);
32+
return names[Math.floor(Math.random() * names.length)];
33+
}
34+
2835
const workerInstance = worker();
2936

30-
const DEFAULT_PRESET = "mainnet";
37+
const DEFAULT_FORK = "phase0";
3138

3239
class Input<T> extends React.Component<Props<T>, State> {
3340

3441
constructor(props: Props<T>) {
3542
super(props);
36-
const types = presets[DEFAULT_PRESET];
37-
const names = typeNames(types);
38-
const initialType = names[Math.floor(Math.random() * names.length)];
43+
const types = forks[DEFAULT_FORK];
44+
const initialType = getRandomType(types);
3945
const sszType = types[initialType];
4046

4147
this.props.setOverlay(true, `Generating random ${initialType} value...`);
4248
workerInstance.createRandomValueWorker({
4349
sszTypeName: initialType,
44-
presetName: DEFAULT_PRESET
50+
forkName: DEFAULT_FORK
4551
})
4652
.then((value: object | string) => {
4753
const input = inputTypes.yaml.dump(value, sszType);
@@ -51,7 +57,7 @@ class Input<T> extends React.Component<Props<T>, State> {
5157
.catch((error: { message: string }) => this.handleError(error));
5258

5359
this.state = {
54-
presetName: DEFAULT_PRESET,
60+
forkName: DEFAULT_FORK,
5561
input: "",
5662
sszTypeName: initialType,
5763
serializeInputType: "yaml",
@@ -103,8 +109,8 @@ class Input<T> extends React.Component<Props<T>, State> {
103109
names(): string[] {
104110
return typeNames(this.types());
105111
}
106-
types<T>(): Record<string, Type<T>> {
107-
return presets[this.state.presetName];
112+
types<T>(): Record<string, Type<unknown>> {
113+
return forks[this.state.forkName];
108114
}
109115

110116
getInputType(): string {
@@ -119,11 +125,18 @@ class Input<T> extends React.Component<Props<T>, State> {
119125
}
120126

121127
resetWith(inputType: string, sszTypeName: string): void {
122-
const sszType = this.types()[sszTypeName];
123-
const {presetName} = this.state;
128+
const types = this.types();
129+
let sszType = types[sszTypeName];
130+
131+
// get a new ssz type if it's not in our fork
132+
if (!sszType) {
133+
sszTypeName = getRandomType(types);
134+
sszType = types[sszTypeName];
135+
}
136+
const {forkName} = this.state;
124137

125138
this.props.setOverlay(true, `Generating random ${sszTypeName} value...`);
126-
workerInstance.createRandomValueWorker({sszTypeName, presetName})
139+
workerInstance.createRandomValueWorker({sszTypeName, forkName})
127140
.then((value: object | string) => {
128141
const input = inputTypes[inputType].dump(value, sszType);
129142
if (this.props.serializeModeOn) {
@@ -145,8 +158,8 @@ class Input<T> extends React.Component<Props<T>, State> {
145158
.catch((error: { message: string }) => this.handleError(error));
146159
}
147160

148-
setPreset(e: ChangeEvent<HTMLSelectElement>): void {
149-
this.setState({presetName: e.target.value as PresetName}, () => {
161+
setFork(e: ChangeEvent<HTMLSelectElement>): void {
162+
this.setState({forkName: e.target.value as ForkName}, () => {
150163
this.resetWith(this.getInputType(), this.state.sszTypeName);
151164
});
152165
}
@@ -171,10 +184,11 @@ class Input<T> extends React.Component<Props<T>, State> {
171184
}
172185

173186
doProcess(): void {
174-
const {presetName, sszTypeName} = this.state;
187+
const {
188+
sszTypeName, forkName} = this.state;
175189
try {
176190
this.props.onProcess(
177-
presetName,
191+
forkName,
178192
sszTypeName,
179193
this.parsedInput(),
180194
this.types()[sszTypeName],
@@ -212,8 +226,10 @@ class Input<T> extends React.Component<Props<T>, State> {
212226
processFileContents(e.target.result);
213227
}
214228
};
215-
reader.onerror = (e) => {
216-
handleError(e);
229+
reader.onerror = (e: unknown) => {
230+
if (e instanceof Error) {
231+
handleError(e);
232+
}
217233
};
218234
}
219235
}
@@ -238,16 +254,16 @@ class Input<T> extends React.Component<Props<T>, State> {
238254
<div className='field has-addons'>
239255
<div className='control'>
240256
<a className='button is-static'>
241-
Preset
257+
Fork
242258
</a>
243259
</div>
244260
<div className='control'>
245261
<div className='select'>
246262
<select
247-
value={this.state.presetName}
248-
onChange={this.setPreset.bind(this)}>
263+
value={this.state.forkName}
264+
onChange={this.setFork.bind(this)}>
249265
{
250-
Object.keys(presets).map(
266+
Object.keys(forks).map(
251267
(name) => <option key={name} value={name}>{name}</option>)
252268
}
253269
</select>

src/components/Serialize.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@ import * as React from "react";
22
import {Type} from "@chainsafe/ssz";
33
import Output from "./Output";
44
import Input from "./Input";
5-
import {PresetName} from "../util/types";
65
import LoadingOverlay from "react-loading-overlay";
76
import BounceLoader from "react-spinners/BounceLoader";
87
import worker from "workerize-loader!./worker"; // eslint-disable-line import/no-unresolved
8+
import {ForkName} from "../util/types";
99

1010
type Props = {
1111
serializeModeOn: boolean;
1212
};
1313

1414
type State<T> = {
15-
presetName: PresetName | undefined;
1615
name: string;
1716
input: T;
1817
sszType: Type<T> | undefined;
@@ -31,7 +30,7 @@ export default class Serialize<T> extends React.Component<Props, State<T>> {
3130
constructor(props: Props) {
3231
super(props);
3332
this.state = {
34-
presetName: undefined,
33+
forkName: undefined,
3534
name: "",
3635
input: undefined,
3736
deserialized: undefined,
@@ -51,11 +50,15 @@ export default class Serialize<T> extends React.Component<Props, State<T>> {
5150
});
5251
}
5352

54-
process<T>(presetName: PresetName, name: string, input: T, type: Type<T>): void {
53+
process<T>(
54+
forkName: ForkName,
55+
name: string, input: T, type: Type<T>): void {
5556

5657
let error;
5758
this.setOverlay(true, this.props.serializeModeOn ? "Serializing..." : "Deserializing...");
58-
workerInstance.serialize({sszTypeName: name, presetName: presetName, input})
59+
workerInstance.serialize({sszTypeName: name,
60+
forkName,
61+
input})
5962
.then((result: { root: Uint8Array | undefined; serialized: Uint8Array | undefined }) => {
6063
this.setState({
6164
hashTreeRoot: result.root,
@@ -70,7 +73,7 @@ export default class Serialize<T> extends React.Component<Props, State<T>> {
7073

7174
const deserialized = input;
7275

73-
this.setState({presetName, name, input, sszType: type, error, deserialized});
76+
this.setState({forkName, name, input, sszType: type, error, deserialized});
7477
}
7578

7679
render(): JSX.Element {

src/components/TreeView.tsx

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ import * as React from "react";
55
import EyzyTree from "eyzy-tree";
66
import {Node as SSZNode, getChildNodes, getRootNode, isBottomType} from "../util/partials";
77
import {
8-
BitVectorType,
9-
ByteVectorType,
108
Type,
11-
UintType,
129
isBooleanType,
1310
isUintType,
1411
isBitListType,
@@ -17,15 +14,9 @@ import {
1714
isVectorType,
1815
isListType,
1916
isContainerType,
20-
VectorType,
21-
ListType,
2217
} from "@chainsafe/ssz";
2318
import BN from "bn.js";
24-
import {presets, PresetName} from "../util/types";
25-
26-
// const getTypeName = (typ: FullSSZType, types: Record<string, AnySSZType>): string => typeNames[typ.type](typ, types);
27-
28-
// type TypeNameRecords = Record<Type, (t: FullSSZType, types: Record<string, AnySSZType>) => string>
19+
import { ForkName, forks } from "../util/types";
2920

3021
function getTypeName<T>(type: Type<T>, types: Record<string, Type<T>>, name: string): string | undefined {
3122
if(isBooleanType(type)) return "bool";
@@ -34,8 +25,8 @@ function getTypeName<T>(type: Type<T>, types: Record<string, Type<T>>, name: str
3425
else if(isBitVectorType(type)) return `BitVector[${type.length}]`;
3526
else if(isBitListType(type)) return "Bytes";
3627
else if(isByteVectorType(type)) return `BytesN[${type.length}]`;
37-
else if(isVectorType(type)) return "Vector"; //[${getTypeName(type.elementType, types, 'rescursive placeholder')}, ${(type as VectorType).length}]`;
38-
else if(isListType(type)) return "List"; //[${getTypeName(type.elementType, types, 'rescursive placeholder')}]`;
28+
else if(isVectorType(type)) return "Vector";
29+
else if(isListType(type)) return "List";
3930
else if(isContainerType(type)) return `${name}(Container)`;
4031
else return "N/A";
4132
}
@@ -68,10 +59,10 @@ type NodeProps<T> = {
6859
};
6960

7061
type Props<T> = {
71-
presetName: PresetName;
62+
forkName: ForkName;
7263
input: any;
7364
sszTypeName: string;
74-
sszType: Type<T>; // @TODO: is this correct?
65+
sszType: Type<T>;
7566
name: string | undefined;
7667
};
7768

@@ -168,8 +159,10 @@ export default class TreeView<T> extends React.Component<Props<T>, State<T>> {
168159
}
169160

170161
render() {
171-
const {presetName, sszTypeName} = this.props;
172-
const types = presets[presetName];
162+
const {
163+
forkName,
164+
sszTypeName} = this.props;
165+
const types = forks[forkName];
173166
const {rootNode, selectedNode} = this.state;
174167
return (
175168
<div className='container'>

src/components/worker.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {presets} from "../util/types";
1+
// import {presets} from "../util/types";
2+
import {forks} from "../util/types";
23
import {
34
BasicType,
45
CompositeType,
@@ -34,7 +35,7 @@ function randomBooleanArray(length: number): Array<boolean> {
3435
return Array.from({length}, () => randomBoolean());
3536
}
3637

37-
function randomByteVector(length): Uint8Array {
38+
function randomByteVector(length: number): Uint8Array {
3839
const array = new Uint8Array(length);
3940
self.crypto.getRandomValues(array);
4041
return array;
@@ -77,19 +78,19 @@ boolean | number | bigint | Uint8Array | Array<boolean> | object | undefined {
7778
}
7879
}
7980

80-
function getSSZType(data: {sszTypeName: string; presetName: string; input: object}):
81+
function getSSZType(data: {sszTypeName: string; forkName: string; input: object}):
8182
BasicType<unknown> | CompositeType<object> {
82-
return presets[data.presetName][data.sszTypeName];
83+
return forks[data.forkName][data.sszTypeName];
8384
}
8485

85-
export function createRandomValueWorker(data: {sszTypeName: string; presetName: string; input: object}):
86+
export function createRandomValueWorker(data: {sszTypeName: string; forkName: string; input: object}):
8687
boolean | number | bigint | Uint8Array | Array<boolean> | object | undefined {
8788
const sszType = getSSZType(data);
8889
const value = createRandomValue(sszType);
8990
return value;
9091
}
9192

92-
export function serialize<T>(data: {sszTypeName: string; presetName: string; input: object}): object {
93+
export function serialize<T>(data: {sszTypeName: string; forkName: string; input: object}): object {
9394
const type = getSSZType(data);
9495
const serialized = type.serialize(data.input);
9596
const root = type.hashTreeRoot(data.input);

src/types/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
* @module types
33
*/
44

5-
export * from "@chainsafe/lodestar-types/lib/ssz/presets/mainnet"
5+
export * from "@chainsafe/lodestar-types"

src/util/partials.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {ListType, Type, isBooleanType, isUintType, isBitListType, isBitVectorType, isContainerType, isVectorType, isByteVectorType, isListType} from "@chainsafe/ssz";
2-
import BN from "bn.js";
32

43
// binary string
54
type GenIndex = string

src/util/types.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import deepEqual from "deep-equal";
21
import {Type} from "@chainsafe/ssz";
3-
import {types as mainnetTypes} from "@chainsafe/lodestar-types/lib/ssz/presets/mainnet";
4-
import {types as minimalTypes} from "@chainsafe/lodestar-types/lib/ssz/presets/minimal";
2+
import {ssz} from "@chainsafe/lodestar-types";
53

6-
export const presets = {
7-
mainnet: mainnetTypes as unknown as Record<string, Type<any>>,
8-
minimal: minimalTypes as unknown as Record<string, Type<any>>,
9-
} as const;
4+
const {phase0, altair, allForks, ...primitive} = ssz;
105

11-
export type PresetName = keyof typeof presets;
6+
export const forks = {
7+
phase0: {...phase0, ...primitive} as Record<string, Type<unknown>>,
8+
altair: {...phase0, ...altair, ...primitive} as Record<string, Type<unknown>>,
9+
}
10+
11+
export type ForkName = keyof typeof forks;
1212

1313
export function typeNames<T>(types: Record<string, Type<T>>): string[] {
1414
return Object.keys(types).sort();

0 commit comments

Comments
 (0)