Skip to content

Commit 53a72e7

Browse files
committed
Initial ewasm parsing
1 parent 69f2dee commit 53a72e7

25 files changed

+706
-43
lines changed

package-lock.json

Lines changed: 66 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,13 @@
6666
},
6767
"dependencies": {
6868
"@types/express": "^4.16.0",
69+
"@webassemblyjs/leb128": "^1.8.5",
70+
"@webassemblyjs/wasm-parser": "^1.8.5",
6971
"async-polling": "^0.2.1",
7072
"bn.js": "^4.11.8",
7173
"body-parser": "^1.18.3",
7274
"brace": "^0.11.1",
75+
"command-exists": "^1.2.8",
7376
"copyfiles": "^2.1.0",
7477
"d3": "^5.7.0",
7578
"d3-graphviz": "^2.6.0",
@@ -90,7 +93,9 @@
9093
"reflect-metadata": "^0.1.12",
9194
"solc": "^0.5.8",
9295
"terser": "3.14.1",
96+
"tmp": "^0.1.0",
9397
"tsoa": "2.3.81",
98+
"wabt": "^1.0.12",
9499
"web3": "1.0.0-beta.37",
95100
"winston": "^2.2.0"
96101
},
@@ -120,6 +125,7 @@
120125
"sass-resources-loader": "^2.0.0",
121126
"style-loader": "^0.23.1",
122127
"ts-jest": "^22.4.6",
128+
"ts-node": "^8.5.4",
123129
"tslint-config-prettier": "^1.14.0",
124130
"typescript": "^3.1.3",
125131
"webpack": "^4.25.1",

src/api/bytecode/EVMDisassembler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Disassembler } from './Disassembler'
22
import { Operation } from './Operation'
3-
import { Opcodes } from './Opcodes'
3+
import { EVMOpcodes } from './EVMOpcodes'
44
import { injectable, inject } from 'inversify'
55
import { Opcode } from './Opcode'
66
import { DisassembledContract } from './DisassembledContract'
@@ -106,7 +106,7 @@ export class EVMDisassembler implements Disassembler {
106106

107107
for (let i = 0; i < operations.length; i++) {
108108
const code = operations[i]
109-
const opcode: Opcode = Opcodes.opcodes[parseInt(code, 16)] || Opcodes.opcodes[-1]
109+
const opcode: Opcode = EVMOpcodes.opcodes[parseInt(code, 16)] || EVMOpcodes.opcodes[-1]
110110
if (this.isPush(opcode)) {
111111
const parameters = opcode.parameters
112112
const argument = `${operations.slice(i + 1, i + parameters + 1).join('')}`

src/api/bytecode/Opcodes.ts renamed to src/api/bytecode/EVMOpcodes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Opcode } from './Opcode'
22

3-
export class Opcodes {
3+
export class EVMOpcodes {
44
static opcodes = {}
55

66
static populate() {
@@ -161,4 +161,4 @@ export class Opcodes {
161161
}
162162
}
163163

164-
Opcodes.populate()
164+
EVMOpcodes.populate()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
export class BytesReader {
2+
3+
private pointer: number
4+
private buffer: Buffer
5+
6+
constructor(buffer: Buffer) {
7+
this.buffer = buffer
8+
this.pointer = 0
9+
}
10+
11+
readBytes(bytesNumber: number): Buffer {
12+
const result = this.buffer.slice(this.pointer, bytesNumber + this.pointer)
13+
this.pointer += bytesNumber
14+
return result
15+
}
16+
17+
readBytesToHex(bytesNumber: number): string {
18+
const result = this.readBytes(bytesNumber)
19+
return result.toString('hex')
20+
}
21+
22+
readBytesToNumber(bytesNumber: number): number {
23+
const result = this.readBytesToHex(bytesNumber)
24+
return parseInt(result, 16)
25+
}
26+
27+
readBytesToUtf8String(bytesNumber: number): string {
28+
const result = this.readBytes(bytesNumber)
29+
return result.toString('utf8')
30+
}
31+
32+
readVarUint32(): number {
33+
var result = 0
34+
var shift = 0
35+
while (true) {
36+
var byte = parseInt(this.readBytesToHex(1), 16)
37+
result |= (byte & 0x7F) << shift
38+
shift += 7
39+
if ((byte & 0x80) === 0){
40+
break
41+
}
42+
}
43+
return result
44+
}
45+
46+
private readVarInt32(): number {
47+
var result = 0
48+
var shift = 0
49+
while (true) {
50+
var byte = parseInt(this.readBytesToHex(1), 16)
51+
result |= (byte & 0x7F) << shift
52+
shift += 7
53+
if ((byte & 0x80) === 0) {
54+
break;
55+
}
56+
}
57+
if (shift >= 32) {
58+
return result
59+
}
60+
var ashift = (32 - shift)
61+
return (result << ashift) >> ashift
62+
}
63+
64+
getPointer(): number {
65+
return this.pointer
66+
}
67+
68+
finished(): boolean {
69+
return this.pointer >= this.buffer.length
70+
}
71+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { WasmExternalKind } from "./wasmTypes";
2+
3+
export interface ExportEntry {
4+
name: string
5+
kind: WasmExternalKind
6+
index: number
7+
}

src/api/bytecode/ewasm/FuncType.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { WasmValueType } from "./wasmTypes";
2+
3+
export interface FuncType {
4+
index: number
5+
params: WasmValueType[]
6+
results: WasmValueType[]
7+
}

0 commit comments

Comments
 (0)