godprotocol 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Datatypes/Array.js +17 -41
- package/Datatypes/Number.js +8 -25
- package/Datatypes/String.js +8 -26
- package/Datatypes/Twain.js +23 -51
- package/Index.js +3 -2
- package/Objects/Account.js +20 -13
- package/Objects/Blockchain.js +33 -39
- package/Objects/Blockweb.js +6 -2
- package/Objects/Filesystem.js +0 -4
- package/Objects/Frame.js +13 -31
- package/Objects/Opcodes.js +17 -9
- package/Objects/Virtual_machine.js +36 -19
- package/Objects/file.js +2 -194
- package/Objects/folder.js +22 -31
- package/framer.js +1 -1
- package/index.d.ts +1 -1
- package/opcodes/add.js +2 -2
- package/package.json +2 -5
- package/utils/create_server.js +1 -0
- package/utils/functions.js +8 -0
- package/utils/hash.js +16 -13
package/Datatypes/Array.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { hash, load } from "../utils/hash";
|
|
2
3
|
|
|
3
4
|
class Arr {
|
|
4
5
|
constructor(object, account) {
|
|
@@ -6,51 +7,26 @@ class Arr {
|
|
|
6
7
|
this.account = account;
|
|
7
8
|
}
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
let sequence = [
|
|
15
|
-
`link ${initiator.path}/Opcodes/${this.account}`,
|
|
16
|
-
`link ${initiator.path}/Datatypes/Array`,
|
|
17
|
-
"timestep value",
|
|
18
|
-
];
|
|
19
|
-
this.object.map((o, i) => {
|
|
20
|
-
store(o, this.account, initiator);
|
|
21
|
-
sequence.push(`write {pending_children:-${i + 1}}`);
|
|
10
|
+
load = () => {
|
|
11
|
+
let obj = [];
|
|
12
|
+
this.object.map((o) => {
|
|
13
|
+
let blk = this.account.vm.web.blocks[o];
|
|
14
|
+
obj.push(load(blk.read_metadata()));
|
|
22
15
|
});
|
|
23
|
-
|
|
24
|
-
...[
|
|
25
|
-
"mine",
|
|
26
|
-
"pop_link",
|
|
27
|
-
"history -1",
|
|
28
|
-
"timestep output",
|
|
29
|
-
"write {pending_children:-1}",
|
|
30
|
-
"mine",
|
|
31
|
-
"pop_link",
|
|
32
|
-
]
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
initiator.load(sequence);
|
|
36
|
-
|
|
37
|
-
return this.object;
|
|
16
|
+
return obj;
|
|
38
17
|
};
|
|
39
18
|
|
|
40
|
-
|
|
41
|
-
|
|
19
|
+
store = () => {
|
|
20
|
+
let curr_hash = hash("[]");
|
|
21
|
+
this.object.map((o) => {
|
|
22
|
+
hash(curr_hash + hash(o));
|
|
23
|
+
});
|
|
24
|
+
this.path = `${this.account.path}/Datatypes/Array`;
|
|
25
|
+
curr_hash = hash(curr_hash);
|
|
42
26
|
|
|
43
|
-
|
|
44
|
-
for (let a = 0; a < this.object.length; a++) {
|
|
45
|
-
let item = this.object[a];
|
|
46
|
-
arr.push(this.store(item));
|
|
47
|
-
}
|
|
48
|
-
let addr = `${this.account.path}/Datatypes/Array/${hash(
|
|
49
|
-
JSON.stringify(arr)
|
|
50
|
-
)}`;
|
|
51
|
-
fs_buffer({ addr, data: arr });
|
|
27
|
+
fs.writeFileSync(`${this.path}/${curr_hash}`, JSON.stringify(this.object));
|
|
52
28
|
|
|
53
|
-
return
|
|
29
|
+
return this;
|
|
54
30
|
};
|
|
55
31
|
}
|
|
56
32
|
|
package/Datatypes/Number.js
CHANGED
|
@@ -1,37 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "fs";
|
|
2
2
|
|
|
3
3
|
class Num {
|
|
4
4
|
constructor(object, account) {
|
|
5
|
-
this.object = object;
|
|
5
|
+
this.object = Number(object.join(""));
|
|
6
6
|
this.account = account;
|
|
7
|
+
this.path = `${this.account.path}/Datatypes/Number/${this.object}`;
|
|
7
8
|
}
|
|
8
9
|
|
|
9
|
-
load = (
|
|
10
|
-
|
|
11
|
-
`link ${initiator.path}/Opcodes/${this.account}`,
|
|
12
|
-
`link ${initiator.path}/Datatypes/Number`,
|
|
13
|
-
"timestep value",
|
|
14
|
-
`write ${this.object}`,
|
|
15
|
-
"mine",
|
|
16
|
-
"pop_link",
|
|
17
|
-
"history -1",
|
|
18
|
-
"timestep output",
|
|
19
|
-
"write {pending_children:-1}",
|
|
20
|
-
"mine",
|
|
21
|
-
"pop_link",
|
|
22
|
-
]);
|
|
23
|
-
|
|
24
|
-
return this.object;
|
|
10
|
+
load = () => {
|
|
11
|
+
return this;
|
|
25
12
|
};
|
|
26
13
|
|
|
27
|
-
store = (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
let addr = `${this.account.path}/Datatypes/Number/${this.object}`;
|
|
31
|
-
|
|
32
|
-
fs_buffer({ addr, data: { type: "number", value: this.object } });
|
|
14
|
+
store = () => {
|
|
15
|
+
fs.writeFileSync(this.path, this.object.toString());
|
|
33
16
|
|
|
34
|
-
return
|
|
17
|
+
return this;
|
|
35
18
|
};
|
|
36
19
|
}
|
|
37
20
|
|
package/Datatypes/String.js
CHANGED
|
@@ -3,38 +3,20 @@ import { fs_buffer, hash } from "../utils/hash";
|
|
|
3
3
|
|
|
4
4
|
class Str {
|
|
5
5
|
constructor(object, account) {
|
|
6
|
-
this.object = object;
|
|
6
|
+
this.object = object.join("");
|
|
7
|
+
this.hash = hash(this.object);
|
|
7
8
|
this.account = account;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
load = (
|
|
11
|
-
|
|
12
|
-
`link ${initiator.path}/Opcodes/${this.account}`,
|
|
13
|
-
`link ${initiator.path}/Datatypes/String`,
|
|
14
|
-
"timestep value",
|
|
15
|
-
`write ${this.object}`,
|
|
16
|
-
"mine",
|
|
17
|
-
"pop_link",
|
|
18
|
-
"history -1",
|
|
19
|
-
"timestep output",
|
|
20
|
-
"write {pending_children:-1}",
|
|
21
|
-
"mine",
|
|
22
|
-
"pop_link",
|
|
23
|
-
]);
|
|
24
|
-
|
|
25
|
-
return this.object;
|
|
11
|
+
load = () => {
|
|
12
|
+
return this;
|
|
26
13
|
};
|
|
27
14
|
|
|
28
|
-
store = (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
let addr = `${this.account.path}/Datatypes/String/${hash(
|
|
32
|
-
this.object || "[blank]"
|
|
33
|
-
)}`;
|
|
34
|
-
|
|
35
|
-
fs_buffer({ addr, data: { type: "string", value: this.object } });
|
|
15
|
+
store = () => {
|
|
16
|
+
this.path = `${this.account.path}/Datatypes/String/${this.hash}`;
|
|
17
|
+
fs.writeFileSync(this.path, this.object);
|
|
36
18
|
|
|
37
|
-
return
|
|
19
|
+
return this;
|
|
38
20
|
};
|
|
39
21
|
}
|
|
40
22
|
|
package/Datatypes/Twain.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { hash } from "../utils/hash";
|
|
3
|
+
import Arr from "./Array";
|
|
2
4
|
|
|
3
5
|
class Twain {
|
|
4
6
|
constructor(object, account) {
|
|
@@ -6,60 +8,30 @@ class Twain {
|
|
|
6
8
|
this.account = account;
|
|
7
9
|
}
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
sequence.push(`timestep prop`);
|
|
21
|
-
let prop_addr = store(prop, this.account, initiator);
|
|
22
|
-
sequence.push(`write {pending_children:-1}`);
|
|
23
|
-
sequence.push(`timestep value`);
|
|
24
|
-
let value_addr = store(value, this.account, initiator);
|
|
25
|
-
sequence.push(`write {pending_children:-1}`);
|
|
26
|
-
obj[prop_addr] = value_addr;
|
|
27
|
-
}
|
|
28
|
-
sequence.push(
|
|
29
|
-
...[
|
|
30
|
-
"mine",
|
|
31
|
-
"pop_link",
|
|
32
|
-
"history -1",
|
|
33
|
-
"timestep output",
|
|
34
|
-
"write {pending_children:-1}",
|
|
35
|
-
"mine",
|
|
36
|
-
"pop_link",
|
|
37
|
-
]
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
initiator.load(sequence);
|
|
41
|
-
|
|
42
|
-
return this.object;
|
|
11
|
+
load = () => {
|
|
12
|
+
let obj = {};
|
|
13
|
+
this.object.map((o) => {
|
|
14
|
+
let blk = this.account.vm.web.blocks[o];
|
|
15
|
+
let pair = load(blk.read_metadata());
|
|
16
|
+
if (!(pair instanceof Arr))
|
|
17
|
+
return console.log("Something aint right in Twain.load");
|
|
18
|
+
|
|
19
|
+
obj[pair.object[0]] = obj[pair.object[1]];
|
|
20
|
+
});
|
|
21
|
+
return obj;
|
|
43
22
|
};
|
|
44
23
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
let value_addr = this.store(value);
|
|
53
|
-
obj[prop_addr] = value_addr;
|
|
54
|
-
}
|
|
55
|
-
let addr = `${this.account.path}/Datatypes/Twain/${hash(
|
|
56
|
-
JSON.stringify(obj)
|
|
57
|
-
)}`;
|
|
58
|
-
this.address = addr;
|
|
24
|
+
store = () => {
|
|
25
|
+
let curr_hash = hash("{}");
|
|
26
|
+
this.object.map((o) => {
|
|
27
|
+
hash(curr_hash + hash(o));
|
|
28
|
+
});
|
|
29
|
+
this.path = `${this.account.path}/Datatypes/Twain`;
|
|
30
|
+
curr_hash = hash(curr_hash);
|
|
59
31
|
|
|
60
|
-
|
|
32
|
+
fs.writeFileSync(`${this.path}/${curr_hash}`, this.stringify());
|
|
61
33
|
|
|
62
|
-
return
|
|
34
|
+
return this;
|
|
63
35
|
};
|
|
64
36
|
|
|
65
37
|
stringify = () => {
|
package/Index.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import http from "http";
|
|
2
|
-
|
|
3
1
|
import Account from "./Objects/Account";
|
|
4
2
|
import framer from "./framer";
|
|
5
3
|
import opcodes from "./opcodes";
|
|
@@ -24,6 +22,9 @@ framer(initiator);
|
|
|
24
22
|
|
|
25
23
|
opcodes(initiator);
|
|
26
24
|
|
|
25
|
+
let instructions = ["cursor value", "write 7"];
|
|
26
|
+
initiator.load({ instructions: ["add"] });
|
|
27
|
+
|
|
27
28
|
create_server(initiator);
|
|
28
29
|
|
|
29
30
|
Socket_server();
|
package/Objects/Account.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Chain } from "./Blockchain";
|
|
2
2
|
import Virtual_machine from "./Virtual_machine";
|
|
3
3
|
import fs from "fs";
|
|
4
4
|
import Emitter from "./Emitter";
|
|
5
5
|
import Folder from "./folder";
|
|
6
6
|
import Frame from "./Frame";
|
|
7
7
|
import File from "./file";
|
|
8
|
+
import { hash } from "../utils/hash";
|
|
8
9
|
|
|
9
10
|
let emitter = new Emitter();
|
|
10
11
|
|
|
@@ -23,15 +24,17 @@ class Account {
|
|
|
23
24
|
});
|
|
24
25
|
this.account = this;
|
|
25
26
|
|
|
26
|
-
this.chain = new
|
|
27
|
+
this.chain = new Chain(this);
|
|
27
28
|
this.vm = new Virtual_machine(this.chain);
|
|
28
29
|
this.accounts = new Object();
|
|
29
30
|
|
|
30
31
|
this.servers = new Array();
|
|
32
|
+
this.parents = new Array();
|
|
31
33
|
|
|
32
34
|
this.column = 0;
|
|
33
35
|
this.folders = new Array();
|
|
34
36
|
this.files = new Array();
|
|
37
|
+
this.content_buffer = new Array();
|
|
35
38
|
}
|
|
36
39
|
|
|
37
40
|
add_server = (server) => {
|
|
@@ -46,26 +49,27 @@ class Account {
|
|
|
46
49
|
this.column = value;
|
|
47
50
|
};
|
|
48
51
|
|
|
49
|
-
|
|
50
|
-
let
|
|
51
|
-
|
|
52
|
-
let file = this.files.find((f) => f.name === par);
|
|
52
|
+
file = (name) => {
|
|
53
|
+
let file = this.files.find((f) => f.name === name);
|
|
53
54
|
|
|
54
55
|
if (!file) {
|
|
55
|
-
file = new File(
|
|
56
|
+
file = new File(name, this);
|
|
56
57
|
this.files.push(file);
|
|
57
|
-
this.active_file = file;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
return file;
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
folder = (name) => {
|
|
64
|
-
let
|
|
65
|
-
folder
|
|
66
|
-
|
|
63
|
+
folder = (name, context) => {
|
|
64
|
+
let name_hash = hash(name + context.hash);
|
|
65
|
+
let folder = this.folders.find((f) => f.hash === name_hash);
|
|
66
|
+
if (!folder) {
|
|
67
|
+
folder = new Folder(name, this, name_hash);
|
|
68
|
+
folder.account = this.account;
|
|
67
69
|
|
|
68
|
-
|
|
70
|
+
this.folders.push(folder);
|
|
71
|
+
}
|
|
72
|
+
folder.context = context.hash;
|
|
69
73
|
|
|
70
74
|
return folder;
|
|
71
75
|
};
|
|
@@ -122,6 +126,9 @@ class Account {
|
|
|
122
126
|
}
|
|
123
127
|
!account.servers.includes(server) && account.servers.push(server);
|
|
124
128
|
|
|
129
|
+
!account.parents.find((p) => p.name === this.name) &&
|
|
130
|
+
account.parents.push(this);
|
|
131
|
+
|
|
125
132
|
return account;
|
|
126
133
|
};
|
|
127
134
|
|
package/Objects/Blockchain.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
+
import fs from "fs";
|
|
1
2
|
import Explorer from "./Explorer";
|
|
2
3
|
import Twain from "../Datatypes/Twain";
|
|
3
|
-
import {
|
|
4
|
+
import { hash } from "../utils/hash";
|
|
4
5
|
|
|
5
6
|
class Block {
|
|
6
|
-
constructor(
|
|
7
|
-
this.index =
|
|
7
|
+
constructor(chain) {
|
|
8
|
+
this.index = chain.blocks.length;
|
|
8
9
|
this.timestamp = Date.now();
|
|
9
|
-
this.data =
|
|
10
|
-
this.previous_hash = previous_hash;
|
|
10
|
+
this.data = chain.txs;
|
|
11
11
|
this.chain = chain;
|
|
12
12
|
this.parents = new Array();
|
|
13
13
|
this.children = new Array();
|
|
14
|
-
this.
|
|
14
|
+
this.hash = hash(hash(JSON.stringify(this.data)) + this.chain.hash);
|
|
15
|
+
this.path = `${this.chain.path}/${this.hash}`;
|
|
15
16
|
|
|
16
17
|
this.column = 0;
|
|
17
18
|
}
|
|
@@ -29,30 +30,32 @@ class Block {
|
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
calculate_hash() {
|
|
32
|
-
return
|
|
33
|
+
return this.hash;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
read_metadata = (path) => {
|
|
37
|
+
let res = "";
|
|
38
|
+
try {
|
|
39
|
+
res = JSON.parse(fs.readFileSync(path, { encoding: "utf-8" }));
|
|
40
|
+
} catch (e) {
|
|
41
|
+
console.log(e.message);
|
|
42
|
+
}
|
|
43
|
+
return res;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
stringify = (str) => {
|
|
36
47
|
let obj = {
|
|
37
48
|
index: this.index,
|
|
38
49
|
hash: this.hash,
|
|
39
50
|
previous_hash: this.previous_hash,
|
|
40
|
-
chain: this.chain.
|
|
51
|
+
chain: this.chain.hash,
|
|
41
52
|
};
|
|
42
|
-
if (not_twained) {
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
let twain = new Twain(obj, this.chain.parent.account);
|
|
46
|
-
twain.load();
|
|
47
53
|
|
|
48
|
-
return
|
|
49
|
-
type: "twain",
|
|
50
|
-
path: twain.address,
|
|
51
|
-
};
|
|
54
|
+
return str ? JSON.stringify(obj) : obj;
|
|
52
55
|
};
|
|
53
56
|
}
|
|
54
57
|
|
|
55
|
-
class
|
|
58
|
+
class Chain extends Explorer {
|
|
56
59
|
constructor(parent, context) {
|
|
57
60
|
super();
|
|
58
61
|
|
|
@@ -87,15 +90,15 @@ class Blockchain extends Explorer {
|
|
|
87
90
|
return { type: "twain", path: twain.address };
|
|
88
91
|
};
|
|
89
92
|
|
|
90
|
-
store = (block) => {
|
|
91
|
-
|
|
93
|
+
store = (block, vm) => {
|
|
94
|
+
let metadata = this.parent.content_buffer;
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
let file = this.parent.file(block.hash);
|
|
97
|
+
file.content = metadata;
|
|
98
|
+
file.store(this.parent.account);
|
|
99
|
+
block.metadata = file.data_path;
|
|
97
100
|
|
|
98
|
-
|
|
101
|
+
vm.web.new_block(block);
|
|
99
102
|
};
|
|
100
103
|
|
|
101
104
|
handle_children = (block) => {
|
|
@@ -103,25 +106,16 @@ class Blockchain extends Explorer {
|
|
|
103
106
|
this.connections.push(block);
|
|
104
107
|
};
|
|
105
108
|
|
|
106
|
-
mine = () => {
|
|
107
|
-
let blk = new Block(this
|
|
109
|
+
mine = (vm) => {
|
|
110
|
+
let blk = new Block(this);
|
|
108
111
|
|
|
109
112
|
let latest_blk = this.get_latest_block();
|
|
110
113
|
blk.previous_hash = latest_blk && latest_blk.hash;
|
|
111
|
-
|
|
112
|
-
blk.calculate_hash();
|
|
113
|
-
|
|
114
|
-
let active_file = this.parent.get_active_file();
|
|
115
|
-
|
|
116
|
-
blk.metadata = { content: active_file.contents.length };
|
|
117
114
|
blk.timelapse = blk.timestamp - this.start_time;
|
|
118
115
|
|
|
119
|
-
blk.file = active_file;
|
|
120
|
-
|
|
121
116
|
this.blocks.push(blk);
|
|
122
117
|
|
|
123
|
-
this.store(blk);
|
|
124
|
-
active_file.reset_content();
|
|
118
|
+
this.store(blk, vm);
|
|
125
119
|
|
|
126
120
|
this.txs = new Array();
|
|
127
121
|
this.pending_children = new Array();
|
|
@@ -138,4 +132,4 @@ class Blockchain extends Explorer {
|
|
|
138
132
|
}
|
|
139
133
|
}
|
|
140
134
|
|
|
141
|
-
export {
|
|
135
|
+
export { Chain, Block };
|
package/Objects/Blockweb.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { Blockchain } from "./Blockchain";
|
|
2
|
-
|
|
3
1
|
class Blockweb {
|
|
4
2
|
constructor(vm) {
|
|
5
3
|
this.vm = vm;
|
|
6
4
|
this.chains = new Object();
|
|
5
|
+
this.blocks = new Object();
|
|
7
6
|
}
|
|
8
7
|
|
|
8
|
+
new_block = (block) => {
|
|
9
|
+
this.blocks[block.hash] = block;
|
|
10
|
+
this.chains[block.chain.hash] = block.chain;
|
|
11
|
+
};
|
|
12
|
+
|
|
9
13
|
explore = (query) => {
|
|
10
14
|
this.vm.get_context().chain.explore(query);
|
|
11
15
|
};
|
package/Objects/Filesystem.js
CHANGED
package/Objects/Frame.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { array_to_nested_objects } from "../utils/functions";
|
|
1
2
|
import { Buffs, fs_buffer } from "../utils/hash";
|
|
2
3
|
|
|
3
4
|
class Frame {
|
|
4
5
|
constructor(object, parent) {
|
|
5
6
|
this.parent = parent;
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
this.object = Array.isArray(object)
|
|
9
|
+
? array_to_nested_objects(object)
|
|
10
|
+
: object;
|
|
7
11
|
|
|
8
12
|
this.children = new Array();
|
|
9
13
|
this.instructions = new Array();
|
|
@@ -18,37 +22,15 @@ class Frame {
|
|
|
18
22
|
return frame;
|
|
19
23
|
};
|
|
20
24
|
|
|
21
|
-
load = (account) => {
|
|
22
|
-
account.load({ instructions: this.instructions });
|
|
23
|
-
|
|
24
|
-
setTimeout(() => {
|
|
25
|
-
while (Buffs.length) {
|
|
26
|
-
for (let b = 0; b < Buffs.length; b++) {
|
|
27
|
-
let buff = Buffs[b];
|
|
28
|
-
fs_buffer(buff.payload, b + 1);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}, 50);
|
|
32
|
-
};
|
|
33
|
-
|
|
34
25
|
to_instruction = () => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
this.
|
|
38
|
-
|
|
39
|
-
this.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
let val = this.object[prop];
|
|
44
|
-
this.instructions.push(`chain ${prop}`);
|
|
45
|
-
|
|
46
|
-
if (val) {
|
|
47
|
-
this.frame(val).to_instruction();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
this.instructions.push(`pop ${prop}`);
|
|
51
|
-
}
|
|
26
|
+
for (let prop in this.object) {
|
|
27
|
+
let val = this.object[prop];
|
|
28
|
+
this.instructions.push(`chain ${prop}`);
|
|
29
|
+
|
|
30
|
+
val && this.frame(val).to_instruction();
|
|
31
|
+
|
|
32
|
+
this.instructions.push(`pop ${prop}`);
|
|
33
|
+
}
|
|
52
34
|
};
|
|
53
35
|
}
|
|
54
36
|
|
package/Objects/Opcodes.js
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Arr from "../Datatypes/Array";
|
|
2
|
+
import Num from "../Datatypes/Number";
|
|
3
|
+
import Str from "../Datatypes/String";
|
|
4
|
+
import Twain from "../Datatypes/Twain";
|
|
2
5
|
|
|
3
6
|
class Opcodes {
|
|
7
|
+
opcodes = new Object();
|
|
8
|
+
|
|
4
9
|
set = (name, callable) => {
|
|
5
|
-
this[name] = callable;
|
|
10
|
+
this.opcodes[name] = callable;
|
|
6
11
|
};
|
|
7
12
|
|
|
8
13
|
prepare_operation = (opcode, context) => {
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
.filter((blk) => blk.chain.parent.path === path)
|
|
13
|
-
.slice(-1)[0];
|
|
14
|
+
let circ = this.opcodes[opcode];
|
|
15
|
+
circ(context.parent.content_buffer, context);
|
|
16
|
+
};
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
parse_content = (buffer) => {
|
|
19
|
+
let obj;
|
|
20
|
+
if (buffer.type === "twain") obj = new Twain(buffer.value).load();
|
|
21
|
+
else if (buffer.type === "array") obj = new Arr(buffer.value).load();
|
|
22
|
+
else if (buffer.type === "string") obj = new Str(buffer.value).load();
|
|
23
|
+
else if (buffer.type === "number") obj = new Num(buffer.value).load();
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
return obj;
|
|
18
26
|
};
|
|
19
27
|
}
|
|
20
28
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Block } from "./Blockchain";
|
|
2
2
|
import Blockweb from "./Blockweb";
|
|
3
|
+
import File_system from "./Filesystem";
|
|
3
4
|
import Frame from "./Frame";
|
|
4
|
-
import { emitter } from "./Account";
|
|
5
5
|
import Opcodes from "./Opcodes";
|
|
6
6
|
|
|
7
7
|
class Virtual_machine extends Opcodes {
|
|
@@ -10,9 +10,8 @@ class Virtual_machine extends Opcodes {
|
|
|
10
10
|
|
|
11
11
|
this.state = [chain];
|
|
12
12
|
this.web = new Blockweb(this);
|
|
13
|
+
this.fm = new File_system(this);
|
|
13
14
|
|
|
14
|
-
this.instruction_stack = new Array();
|
|
15
|
-
this.running = 0;
|
|
16
15
|
this.pointers = new Array();
|
|
17
16
|
}
|
|
18
17
|
|
|
@@ -25,15 +24,16 @@ class Virtual_machine extends Opcodes {
|
|
|
25
24
|
|
|
26
25
|
while (this.pointers.slice(-1)[0] < instructions.length && !this.err_) {
|
|
27
26
|
let ins = instructions[this.pointers.slice(-1)[0]];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
if (ins) {
|
|
28
|
+
let res = this.check_instruction(ins);
|
|
29
|
+
if (res) {
|
|
30
|
+
} else this.execute(ins);
|
|
31
|
+
}
|
|
32
32
|
|
|
33
33
|
this.pointers[this.pointers.length - 1] = this.pointers.slice(-1)[0] + 1;
|
|
34
34
|
}
|
|
35
35
|
this.pointers.pop();
|
|
36
|
-
this.get_context().mine();
|
|
36
|
+
this.get_context().mine(this);
|
|
37
37
|
};
|
|
38
38
|
|
|
39
39
|
check_instruction = (instruction) => {
|
|
@@ -50,40 +50,57 @@ class Virtual_machine extends Opcodes {
|
|
|
50
50
|
return true;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
+
readonly = (tag) => {
|
|
54
|
+
let tags = tag.split(":");
|
|
55
|
+
tags[0] = tags[0].slice(1);
|
|
56
|
+
tags[1] = tags[1].slice(0, -1);
|
|
57
|
+
|
|
58
|
+
console.log(tags);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
parse_arg = (arg) => {
|
|
62
|
+
let data;
|
|
63
|
+
if (!arg) return;
|
|
64
|
+
if (arg.startsWith("{")) {
|
|
65
|
+
data = this.readonly();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return data;
|
|
69
|
+
};
|
|
70
|
+
|
|
53
71
|
execute(instruction) {
|
|
54
72
|
let [opcode, args] = instruction.split(" ");
|
|
55
73
|
|
|
56
74
|
let context = this.get_context();
|
|
57
75
|
|
|
58
76
|
context.add_tx(instruction);
|
|
77
|
+
args = this.parse_arg(args);
|
|
78
|
+
|
|
59
79
|
switch (opcode) {
|
|
60
80
|
case "chain":
|
|
61
81
|
let folder = context.parent.folder(args, context);
|
|
62
82
|
this.state.push(folder.chain);
|
|
63
83
|
break;
|
|
64
84
|
case "link":
|
|
65
|
-
|
|
66
|
-
action: "parse",
|
|
67
|
-
aft: (res) => this.state.push(res.chain),
|
|
68
|
-
});
|
|
85
|
+
this.state.push(args);
|
|
69
86
|
break;
|
|
70
87
|
case "mine":
|
|
71
|
-
context.mine();
|
|
88
|
+
context.mine(this);
|
|
72
89
|
this.state.slice(-2)[0].handle_children(context.get_latest_block());
|
|
73
90
|
break;
|
|
74
91
|
case "pop_link":
|
|
75
92
|
this.state.pop();
|
|
76
93
|
break;
|
|
77
94
|
case "pop":
|
|
78
|
-
context.mine();
|
|
95
|
+
context.mine(this);
|
|
79
96
|
this.state.pop();
|
|
80
97
|
break;
|
|
98
|
+
case "run":
|
|
99
|
+
this.push(args.data);
|
|
100
|
+
break;
|
|
81
101
|
default:
|
|
82
|
-
if (["
|
|
83
|
-
|
|
84
|
-
} else {
|
|
85
|
-
this.prepare_operation(opcode, context);
|
|
86
|
-
}
|
|
102
|
+
if (["cursor", "write"].includes(opcode)) context[opcode](args);
|
|
103
|
+
else this.prepare_operation(opcode, context);
|
|
87
104
|
}
|
|
88
105
|
}
|
|
89
106
|
|
package/Objects/file.js
CHANGED
|
@@ -1,212 +1,20 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import Twain from "../Datatypes/Twain";
|
|
3
1
|
import { store } from "../utils/hash";
|
|
4
2
|
|
|
5
3
|
class File {
|
|
6
|
-
object_name = "File";
|
|
7
|
-
|
|
8
4
|
constructor(name, folder) {
|
|
9
5
|
this.name = name;
|
|
10
6
|
this.parent = folder;
|
|
11
7
|
|
|
12
8
|
this.path = `${this.parent.path}/${this.name}`;
|
|
13
9
|
|
|
14
|
-
this.contents = new Array();
|
|
15
10
|
this.content = null;
|
|
16
|
-
this.set_path();
|
|
17
11
|
|
|
18
12
|
this.frame_path = `${this.parent.account.path}/Objects/File`;
|
|
19
|
-
|
|
20
|
-
this.r = 0;
|
|
21
|
-
this.col = "0";
|
|
22
13
|
}
|
|
23
14
|
|
|
24
|
-
activate_content = (index) => {
|
|
25
|
-
let content = this.contents[Number(index)];
|
|
26
|
-
|
|
27
|
-
let obj = {};
|
|
28
|
-
for (let prop in content) {
|
|
29
|
-
let value = content[prop];
|
|
30
|
-
|
|
31
|
-
obj[prop] = this.parse_content(value[0]);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return obj;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
parse_content = (content) => {
|
|
38
|
-
if (content && content.includes && content.includes("/")) {
|
|
39
|
-
let res = this.parent.chain.connections.find((c, i) => {
|
|
40
|
-
return c.path === content;
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
let obj = this.datatypes(
|
|
44
|
-
res.file.activate_content(res.metadata.content),
|
|
45
|
-
res
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
return obj;
|
|
49
|
-
} else return content;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
datatypes = (obj, block) => {
|
|
53
|
-
if (
|
|
54
|
-
block.chain.parent.path === `${this.parent.account.path}/Datatypes/Number`
|
|
55
|
-
) {
|
|
56
|
-
return Number(obj.value);
|
|
57
|
-
} else if (
|
|
58
|
-
block.chain.parent.path === `${this.parent.account.path}/Datatypes/String`
|
|
59
|
-
) {
|
|
60
|
-
return obj.value.toString();
|
|
61
|
-
}
|
|
62
|
-
return obj;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
reset_content = () => {
|
|
66
|
-
if (this.content) {
|
|
67
|
-
if (this.r < 0) {
|
|
68
|
-
this.contents.splice(this.r, 1, this.content);
|
|
69
|
-
} else this.contents.push(this.content);
|
|
70
|
-
}
|
|
71
|
-
this.r = 0;
|
|
72
|
-
this.col = "0";
|
|
73
|
-
|
|
74
|
-
this.content = null;
|
|
75
|
-
|
|
76
|
-
this.parent.active_file = null;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
get = (opcode) => {
|
|
80
|
-
return this[opcode];
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
timestep = (col) => {
|
|
84
|
-
this.col = col;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
history = (r) => {
|
|
88
|
-
this.r = Number(r);
|
|
89
|
-
let content = this.contents.slice(r)[0];
|
|
90
|
-
this.content = content;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
fetch_arg = (path) => {
|
|
94
|
-
let block = this.chain.explore({ parents: `${this.frame_path}/${path}` });
|
|
95
|
-
return block.file.parse(true);
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
readonly = (prop, index, context) => {
|
|
99
|
-
let initiator = context.get_context(0);
|
|
100
|
-
if (
|
|
101
|
-
[
|
|
102
|
-
"timelapse",
|
|
103
|
-
"timestamp",
|
|
104
|
-
"data",
|
|
105
|
-
"hash",
|
|
106
|
-
"path",
|
|
107
|
-
"children",
|
|
108
|
-
"parents",
|
|
109
|
-
"chain",
|
|
110
|
-
].includes(prop)
|
|
111
|
-
) {
|
|
112
|
-
let blk = context.pending_children.slice(index || 0)[0];
|
|
113
|
-
store(blk[prop], "readonly", initiator);
|
|
114
|
-
} else if (
|
|
115
|
-
[
|
|
116
|
-
"parent",
|
|
117
|
-
"context",
|
|
118
|
-
"name",
|
|
119
|
-
"hash",
|
|
120
|
-
"path",
|
|
121
|
-
"connections",
|
|
122
|
-
"pending_children",
|
|
123
|
-
"blocks",
|
|
124
|
-
].includes(prop)
|
|
125
|
-
) {
|
|
126
|
-
let value = context[prop];
|
|
127
|
-
if (index && Array.isArray(value)) value.slice(index)[0];
|
|
128
|
-
store(value, "readonly", initiator);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return `${initiator.path}/Opcodes/readonly:${
|
|
132
|
-
initiator.pending_children.slice(-1)[0].index
|
|
133
|
-
}`;
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
write = (data, context) => {
|
|
137
|
-
if (data.startsWith("{") && data.endsWith("}")) {
|
|
138
|
-
let offset = data.split(":");
|
|
139
|
-
let prop = data[0].slice(1);
|
|
140
|
-
let index = Number(offset[1].slice(0, -1));
|
|
141
|
-
|
|
142
|
-
data = this.readonly(prop, index, context);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (!this.content) this.content = new Object();
|
|
146
|
-
|
|
147
|
-
let col = this.content[this.col];
|
|
148
|
-
if (!col) {
|
|
149
|
-
col = new Array();
|
|
150
|
-
|
|
151
|
-
this.content[this.col] = col;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (!col.includes(data)) col.unshift(data);
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
read = (history) => {
|
|
158
|
-
let res = this.content[this.row];
|
|
159
|
-
if (this.col) res = res[this.col];
|
|
160
|
-
|
|
161
|
-
return history != null ? res[history] : res;
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
run = (args, vm) => {
|
|
165
|
-
let block = vm.web.explore({ name: args });
|
|
166
|
-
|
|
167
|
-
block.map((blk) => vm.push(blk));
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
parse = (content) => {
|
|
171
|
-
content = content || this.fetch_arg(`parse/content`);
|
|
172
|
-
|
|
173
|
-
let obj = content && this.content;
|
|
174
|
-
if (!obj) {
|
|
175
|
-
obj = this.stringify();
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
obj = new Twain(obj);
|
|
179
|
-
|
|
180
|
-
fs.writeFileSync(`${this.frame_path}/parse/output`, obj.stringify());
|
|
181
|
-
|
|
182
|
-
return obj;
|
|
183
|
-
};
|
|
184
|
-
|
|
185
15
|
store = () => {
|
|
186
|
-
|
|
187
|
-
this.
|
|
188
|
-
|
|
189
|
-
this.contents.map((c) => (str += `${JSON.stringify(c)}\n`));
|
|
190
|
-
fs.writeFileSync(this.path, str);
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
set_path = () => {
|
|
194
|
-
if (!fs.existsSync(this.path)) {
|
|
195
|
-
fs.writeFileSync(this.path, "");
|
|
196
|
-
} else {
|
|
197
|
-
this.existed = true;
|
|
198
|
-
let content = fs.readFileSync(this.path, { encoding: "utf-8" });
|
|
199
|
-
try {
|
|
200
|
-
content = content.split("\n").map((c) => JSON.parse(c));
|
|
201
|
-
} catch (e) {
|
|
202
|
-
content = [];
|
|
203
|
-
}
|
|
204
|
-
if (!Array.isArray(content)) {
|
|
205
|
-
content = [content];
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
this.contents = content;
|
|
209
|
-
}
|
|
16
|
+
this.content_object = store(this.content);
|
|
17
|
+
this.data_path = this.content_object && this.content_object.path;
|
|
210
18
|
};
|
|
211
19
|
}
|
|
212
20
|
|
package/Objects/folder.js
CHANGED
|
@@ -1,50 +1,42 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import { emitter } from "./Account";
|
|
3
3
|
import File from "./file";
|
|
4
|
-
import {
|
|
4
|
+
import { Block, Chain } from "./Blockchain";
|
|
5
|
+
import { hash } from "../utils/hash";
|
|
5
6
|
|
|
6
7
|
class Folder {
|
|
7
8
|
object_name = "folder";
|
|
8
9
|
|
|
9
|
-
constructor(name, parent) {
|
|
10
|
+
constructor(name, parent, hash) {
|
|
10
11
|
this.name = name;
|
|
11
12
|
this.parent = parent;
|
|
12
|
-
this.
|
|
13
|
+
this.hash = hash;
|
|
14
|
+
this.path = `${parent.path}/${this.hash}`;
|
|
13
15
|
|
|
14
|
-
emitter.listen(this.path, (
|
|
15
|
-
let { aft, bfr } = payload;
|
|
16
|
-
|
|
17
|
-
bfr && bfr(this, payload);
|
|
18
|
-
|
|
19
|
-
aft && aft(this);
|
|
20
|
-
});
|
|
16
|
+
emitter.listen(this.path, (cb) => cb && cb(this));
|
|
21
17
|
|
|
22
18
|
this.active_file = null;
|
|
23
19
|
this.files = new Array();
|
|
24
20
|
this.folders = new Array();
|
|
25
|
-
this.chain = new
|
|
21
|
+
this.chain = new Chain(this);
|
|
22
|
+
|
|
23
|
+
this.curs = -1;
|
|
24
|
+
this.content_buffer = new Object();
|
|
26
25
|
|
|
27
26
|
this.set_path();
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
history = (r) => this.get_active_file().history(r);
|
|
33
|
-
|
|
34
|
-
write = (data) => this.get_active_file().write(data);
|
|
35
|
-
|
|
36
|
-
get_active_file = () => {
|
|
37
|
-
let par = this.context.hash;
|
|
29
|
+
cursor = (curs) => (this.curs = curs);
|
|
38
30
|
|
|
39
|
-
|
|
31
|
+
write = (data) => {
|
|
32
|
+
let v = this.content_buffer[this.curs];
|
|
40
33
|
|
|
41
|
-
if (!
|
|
42
|
-
|
|
43
|
-
this.
|
|
44
|
-
this.active_file = file;
|
|
34
|
+
if (!v) {
|
|
35
|
+
v = new Array();
|
|
36
|
+
this.content_buffer[this.curs] = v;
|
|
45
37
|
}
|
|
46
38
|
|
|
47
|
-
|
|
39
|
+
v.push(data instanceof Block ? data.hash : data);
|
|
48
40
|
};
|
|
49
41
|
|
|
50
42
|
file = (name) => {
|
|
@@ -53,9 +45,7 @@ class Folder {
|
|
|
53
45
|
if (!file) {
|
|
54
46
|
file = new File(name, this);
|
|
55
47
|
this.files.push(file);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
this.active_file = file;
|
|
48
|
+
}
|
|
59
49
|
|
|
60
50
|
return file;
|
|
61
51
|
};
|
|
@@ -76,14 +66,15 @@ class Folder {
|
|
|
76
66
|
};
|
|
77
67
|
|
|
78
68
|
folder = (name, context) => {
|
|
79
|
-
let
|
|
69
|
+
let name_hash = hash(name + context.hash);
|
|
70
|
+
let folder = this.folders.find((f) => f.hash === name_hash);
|
|
80
71
|
if (!folder) {
|
|
81
|
-
folder = new Folder(name, this);
|
|
72
|
+
folder = new Folder(name, this, name_hash);
|
|
82
73
|
folder.account = this.account;
|
|
83
74
|
|
|
84
75
|
this.folders.push(folder);
|
|
85
76
|
}
|
|
86
|
-
folder.context = context;
|
|
77
|
+
folder.context = context.hash;
|
|
87
78
|
|
|
88
79
|
return folder;
|
|
89
80
|
};
|
package/framer.js
CHANGED
package/index.d.ts
CHANGED
package/opcodes/add.js
CHANGED
|
@@ -2,9 +2,9 @@ import Num from "../Datatypes/Number";
|
|
|
2
2
|
import { initiator } from "../Index";
|
|
3
3
|
|
|
4
4
|
const add = (args) => {
|
|
5
|
-
|
|
5
|
+
console.log(args);
|
|
6
6
|
|
|
7
|
-
return
|
|
7
|
+
return;
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
const divide = (args) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godprotocol",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "A data mediator.",
|
|
5
5
|
"main": "Index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -31,12 +31,9 @@
|
|
|
31
31
|
"godprotocol"
|
|
32
32
|
],
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"body-parser": "^1.20.2",
|
|
35
34
|
"crypto": "^1.0.1",
|
|
36
35
|
"elliptic": "^6.5.5",
|
|
37
|
-
"express": "^4.19.2",
|
|
38
36
|
"fs": "^0.0.1-security",
|
|
39
|
-
"net": "^1.0.2"
|
|
40
|
-
"semitter": "^1.2.1"
|
|
37
|
+
"net": "^1.0.2"
|
|
41
38
|
}
|
|
42
39
|
}
|
package/utils/create_server.js
CHANGED
|
@@ -12,6 +12,7 @@ const create_server = (initiator) => {
|
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
req.on("end", () => {
|
|
15
|
+
data = JSON.parse(data);
|
|
15
16
|
if (req.url === "/create_account" && req.method === "POST") {
|
|
16
17
|
initiator.create_account(data);
|
|
17
18
|
res.writeHead(200, { "Content-Type": "application/json" });
|
package/utils/hash.js
CHANGED
|
@@ -6,7 +6,7 @@ import Twain from "../Datatypes/Twain";
|
|
|
6
6
|
const crypto = require("crypto");
|
|
7
7
|
|
|
8
8
|
const hash = (data) => {
|
|
9
|
-
let hash = crypto.createHash("
|
|
9
|
+
let hash = crypto.createHash("sha256");
|
|
10
10
|
|
|
11
11
|
hash.update(data);
|
|
12
12
|
|
|
@@ -27,21 +27,24 @@ const fs_buffer = (payload, buff_index) => {
|
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
const store = (obj
|
|
30
|
+
const store = (obj) => {
|
|
31
31
|
let addr;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
32
|
+
|
|
33
|
+
if (obj.type === "string") {
|
|
34
|
+
addr = new Str(obj.value.join("")).store();
|
|
35
|
+
} else if (obj.type === "number") {
|
|
36
|
+
addr = new Num(obj.value).store();
|
|
37
|
+
} else if (obj.type === "array") {
|
|
38
|
+
addr = new Arr(obj.value).store();
|
|
39
|
+
} else if (obj.type === "twain") {
|
|
40
|
+
addr = new Twain(obj.value).store();
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
return addr;
|
|
45
44
|
};
|
|
46
45
|
|
|
47
|
-
|
|
46
|
+
const load = (addr) => {
|
|
47
|
+
let obj;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { hash, fs_buffer, store, Buffs, load };
|