gun-eth 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. package/SHINE.json +300 -0
  2. package/SHINE.sol +48 -31
  3. package/index.js +32 -149
  4. package/package.json +1 -1
package/SHINE.json ADDED
@@ -0,0 +1,300 @@
1
+ {
2
+ "address": "0x21f5C4f2a0898Aa3EaFfdcb644dFeF30e95cC359",
3
+ "abi": [
4
+ {
5
+ "anonymous": false,
6
+ "inputs": [
7
+ {
8
+ "indexed": true,
9
+ "internalType": "bytes",
10
+ "name": "nodeId",
11
+ "type": "bytes"
12
+ },
13
+ {
14
+ "indexed": true,
15
+ "internalType": "bytes32",
16
+ "name": "key",
17
+ "type": "bytes32"
18
+ },
19
+ {
20
+ "indexed": false,
21
+ "internalType": "bytes32",
22
+ "name": "contentHash",
23
+ "type": "bytes32"
24
+ },
25
+ {
26
+ "indexed": false,
27
+ "internalType": "address",
28
+ "name": "updater",
29
+ "type": "address"
30
+ }
31
+ ],
32
+ "name": "DataUpdated",
33
+ "type": "event"
34
+ },
35
+ {
36
+ "inputs": [
37
+ {
38
+ "internalType": "bytes[]",
39
+ "name": "nodeIds",
40
+ "type": "bytes[]"
41
+ },
42
+ {
43
+ "internalType": "bytes32[]",
44
+ "name": "keys",
45
+ "type": "bytes32[]"
46
+ },
47
+ {
48
+ "internalType": "bytes32[]",
49
+ "name": "contentHashes",
50
+ "type": "bytes32[]"
51
+ }
52
+ ],
53
+ "name": "batchUpdateData",
54
+ "outputs": [],
55
+ "stateMutability": "nonpayable",
56
+ "type": "function"
57
+ },
58
+ {
59
+ "inputs": [
60
+ {
61
+ "internalType": "bytes",
62
+ "name": "nodeId",
63
+ "type": "bytes"
64
+ },
65
+ {
66
+ "internalType": "bytes32",
67
+ "name": "key",
68
+ "type": "bytes32"
69
+ }
70
+ ],
71
+ "name": "getLatestRecord",
72
+ "outputs": [
73
+ {
74
+ "internalType": "bytes32",
75
+ "name": "",
76
+ "type": "bytes32"
77
+ },
78
+ {
79
+ "internalType": "uint256",
80
+ "name": "",
81
+ "type": "uint256"
82
+ },
83
+ {
84
+ "internalType": "address",
85
+ "name": "",
86
+ "type": "address"
87
+ }
88
+ ],
89
+ "stateMutability": "view",
90
+ "type": "function"
91
+ },
92
+ {
93
+ "inputs": [
94
+ {
95
+ "internalType": "bytes",
96
+ "name": "",
97
+ "type": "bytes"
98
+ },
99
+ {
100
+ "internalType": "bytes32",
101
+ "name": "",
102
+ "type": "bytes32"
103
+ }
104
+ ],
105
+ "name": "nodeData",
106
+ "outputs": [
107
+ {
108
+ "internalType": "bytes32",
109
+ "name": "contentHash",
110
+ "type": "bytes32"
111
+ },
112
+ {
113
+ "internalType": "uint256",
114
+ "name": "timestamp",
115
+ "type": "uint256"
116
+ },
117
+ {
118
+ "internalType": "address",
119
+ "name": "updater",
120
+ "type": "address"
121
+ }
122
+ ],
123
+ "stateMutability": "view",
124
+ "type": "function"
125
+ },
126
+ {
127
+ "inputs": [
128
+ {
129
+ "internalType": "bytes",
130
+ "name": "nodeId",
131
+ "type": "bytes"
132
+ },
133
+ {
134
+ "internalType": "bytes32",
135
+ "name": "key",
136
+ "type": "bytes32"
137
+ },
138
+ {
139
+ "internalType": "bytes32",
140
+ "name": "contentHash",
141
+ "type": "bytes32"
142
+ }
143
+ ],
144
+ "name": "updateData",
145
+ "outputs": [],
146
+ "stateMutability": "nonpayable",
147
+ "type": "function"
148
+ },
149
+ {
150
+ "inputs": [
151
+ {
152
+ "internalType": "bytes",
153
+ "name": "nodeId",
154
+ "type": "bytes"
155
+ },
156
+ {
157
+ "internalType": "bytes32",
158
+ "name": "key",
159
+ "type": "bytes32"
160
+ },
161
+ {
162
+ "internalType": "bytes32",
163
+ "name": "contentHash",
164
+ "type": "bytes32"
165
+ }
166
+ ],
167
+ "name": "verifyData",
168
+ "outputs": [
169
+ {
170
+ "internalType": "bool",
171
+ "name": "",
172
+ "type": "bool"
173
+ },
174
+ {
175
+ "internalType": "uint256",
176
+ "name": "",
177
+ "type": "uint256"
178
+ },
179
+ {
180
+ "internalType": "address",
181
+ "name": "",
182
+ "type": "address"
183
+ }
184
+ ],
185
+ "stateMutability": "view",
186
+ "type": "function"
187
+ }
188
+ ],
189
+ "transactionHash": "0x1443c497e2f29a9854ee5e1eeaf6a4b9749a02da8814538cc34517cbb9d0be7e",
190
+ "receipt": {
191
+ "to": null,
192
+ "from": "0x8aA5F726d9F868a21a8bd748E2f1E43bA31eb670",
193
+ "contractAddress": "0x21f5C4f2a0898Aa3EaFfdcb644dFeF30e95cC359",
194
+ "transactionIndex": 4,
195
+ "gasUsed": "450179",
196
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
197
+ "blockHash": "0xefa0944e3578d4275ec0321cb139c007b4d908b6852ebd376333899bd3b1d296",
198
+ "transactionHash": "0x1443c497e2f29a9854ee5e1eeaf6a4b9749a02da8814538cc34517cbb9d0be7e",
199
+ "logs": [],
200
+ "blockNumber": 17722535,
201
+ "cumulativeGasUsed": "1569514",
202
+ "status": 1,
203
+ "byzantium": true
204
+ },
205
+ "args": [],
206
+ "numDeployments": 3,
207
+ "solcInputHash": "e7a76cb3f8f61c89b3e2cabe29f25758",
208
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"contentHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"}],\"name\":\"DataUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"nodeIds\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"keys\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"contentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"batchUpdateData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"getLatestRecord\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nodeData\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"contentHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"updater\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"contentHash\",\"type\":\"bytes32\"}],\"name\":\"updateData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"contentHash\",\"type\":\"bytes32\"}],\"name\":\"verifyData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/SHINE.sol\":\"SHINE\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/SHINE.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.0;\\r\\n\\r\\ncontract SHINE {\\r\\n\\tstruct DataRecord {\\r\\n\\t\\tbytes32 contentHash;\\r\\n\\t\\tuint256 timestamp;\\r\\n\\t\\taddress updater;\\r\\n\\t}\\r\\n\\r\\n\\tmapping(bytes => mapping(bytes32 => DataRecord)) public nodeData;\\r\\n\\r\\n\\tevent DataUpdated(\\r\\n\\t\\tbytes indexed nodeId,\\r\\n\\t\\tbytes32 indexed key,\\r\\n\\t\\tbytes32 contentHash,\\r\\n\\t\\taddress updater\\r\\n\\t);\\r\\n\\r\\n\\tfunction updateData(\\r\\n\\t\\tbytes memory nodeId,\\r\\n\\t\\tbytes32 key,\\r\\n\\t\\tbytes32 contentHash\\r\\n\\t) public {\\r\\n\\t\\tnodeData[nodeId][key] = DataRecord(\\r\\n\\t\\t\\tcontentHash,\\r\\n\\t\\t\\tblock.timestamp,\\r\\n\\t\\t\\tmsg.sender\\r\\n\\t\\t);\\r\\n\\t\\temit DataUpdated(nodeId, key, contentHash, msg.sender);\\r\\n\\t}\\r\\n\\r\\n\\tfunction verifyData(\\r\\n\\t\\tbytes memory nodeId,\\r\\n\\t\\tbytes32 key,\\r\\n\\t\\tbytes32 contentHash\\r\\n\\t) public view returns (bool, uint256, address) {\\r\\n\\t\\tDataRecord memory record = nodeData[nodeId][key];\\r\\n\\t\\tbool isValid = record.contentHash == contentHash;\\r\\n\\t\\treturn (isValid, record.timestamp, record.updater);\\r\\n\\t}\\r\\n\\r\\n\\tfunction getLatestRecord(\\r\\n\\t\\tbytes memory nodeId,\\r\\n\\t\\tbytes32 key\\r\\n\\t) public view returns (bytes32, uint256, address) {\\r\\n\\t\\tDataRecord memory record = nodeData[nodeId][key];\\r\\n\\t\\treturn (record.contentHash, record.timestamp, record.updater);\\r\\n\\t}\\r\\n\\r\\n\\tfunction batchUpdateData(\\r\\n\\t\\tbytes[] memory nodeIds,\\r\\n\\t\\tbytes32[] memory keys,\\r\\n\\t\\tbytes32[] memory contentHashes\\r\\n\\t) public {\\r\\n\\t\\trequire(\\r\\n\\t\\t\\tnodeIds.length == keys.length &&\\r\\n\\t\\t\\t\\tkeys.length == contentHashes.length,\\r\\n\\t\\t\\t\\\"Arrays length mismatch\\\"\\r\\n\\t\\t);\\r\\n\\t\\tfor (uint i = 0; i < nodeIds.length; i++) {\\r\\n\\t\\t\\tupdateData(nodeIds[i], keys[i], contentHashes[i]);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\",\"keccak256\":\"0xfd8eaa9c1661afb4543233422e06478eef0a247b1910695f2e0357f92642b8d5\",\"license\":\"MIT\"}},\"version\":1}",
209
+ "bytecode": "0x608060405234801561001057600080fd5b5061072e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80631dabc0611461005c5780632f707e6d146100715780637248a88d146100eb578063b8ca21ec146100fe578063e6039af314610111575b600080fd5b61006f61006a366004610472565b61014a565b005b6100c261007f3660046104c0565b815160208184018101805160008083529383019583019590952094905292909252815260409020805460018201546002909201549091906001600160a01b031683565b6040805193845260208401929092526001600160a01b0316908201526060015b60405180910390f35b6100c26100f93660046104c0565b610211565b61006f61010c366004610594565b61027a565b61012461011f366004610472565b61034f565b60408051931515845260208401929092526001600160a01b0316908201526060016100e2565b604080516060810182528281524260208201523381830152905160009061017290869061068c565b9081526040805160209281900383018120600087815290845282902084518155928401516001840155920151600290910180546001600160a01b0319166001600160a01b0390921691909117905582906101cd90859061068c565b60408051918290038220848352336020840152917fc351bb5aebb2727af44600cc5ecd675ba56fe055624fab7916e602f59ce8d620910160405180910390a3505050565b600080600080600086604051610227919061068c565b90815260408051602092819003830181206000988952835296819020606088018252805480895260018201549389018490526002909101546001600160a01b031697909101879052979096509350505050565b8151835114801561028c575080518251145b6102d55760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604482015260640160405180910390fd5b60005b8351811015610349576103378482815181106102f6576102f66106bb565b6020026020010151848381518110610310576103106106bb565b602002602001015184848151811061032a5761032a6106bb565b602002602001015161014a565b80610341816106d1565b9150506102d8565b50505050565b600080600080600087604051610365919061068c565b90815260408051602092819003830181206000998a528352978190206060890182528054808a526001820154938a018490526002909101546001600160a01b031698909101889052959095149794965050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156103fa576103fa6103bb565b604052919050565b600082601f83011261041357600080fd5b813567ffffffffffffffff81111561042d5761042d6103bb565b610440601f8201601f19166020016103d1565b81815284602083860101111561045557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561048757600080fd5b833567ffffffffffffffff81111561049e57600080fd5b6104aa86828701610402565b9660208601359650604090950135949350505050565b600080604083850312156104d357600080fd5b823567ffffffffffffffff8111156104ea57600080fd5b6104f685828601610402565b95602094909401359450505050565b600067ffffffffffffffff82111561051f5761051f6103bb565b5060051b60200190565b600082601f83011261053a57600080fd5b8135602061054f61054a83610505565b6103d1565b82815260059290921b8401810191818101908684111561056e57600080fd5b8286015b848110156105895780358352918301918301610572565b509695505050505050565b6000806000606084860312156105a957600080fd5b833567ffffffffffffffff808211156105c157600080fd5b818601915086601f8301126105d557600080fd5b813560206105e561054a83610505565b82815260059290921b8401810191818101908a84111561060457600080fd5b8286015b8481101561063c578035868111156106205760008081fd5b61062e8d86838b0101610402565b845250918301918301610608565b509750508701359250508082111561065357600080fd5b61065f87838801610529565b9350604086013591508082111561067557600080fd5b5061068286828701610529565b9150509250925092565b6000825160005b818110156106ad5760208186018101518583015201610693565b506000920191825250919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016106f157634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220d03f124930aab649f69a63261935e3b1264f0c18e4dd77b81ea19feb30808ee964736f6c63430008110033",
210
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80631dabc0611461005c5780632f707e6d146100715780637248a88d146100eb578063b8ca21ec146100fe578063e6039af314610111575b600080fd5b61006f61006a366004610472565b61014a565b005b6100c261007f3660046104c0565b815160208184018101805160008083529383019583019590952094905292909252815260409020805460018201546002909201549091906001600160a01b031683565b6040805193845260208401929092526001600160a01b0316908201526060015b60405180910390f35b6100c26100f93660046104c0565b610211565b61006f61010c366004610594565b61027a565b61012461011f366004610472565b61034f565b60408051931515845260208401929092526001600160a01b0316908201526060016100e2565b604080516060810182528281524260208201523381830152905160009061017290869061068c565b9081526040805160209281900383018120600087815290845282902084518155928401516001840155920151600290910180546001600160a01b0319166001600160a01b0390921691909117905582906101cd90859061068c565b60408051918290038220848352336020840152917fc351bb5aebb2727af44600cc5ecd675ba56fe055624fab7916e602f59ce8d620910160405180910390a3505050565b600080600080600086604051610227919061068c565b90815260408051602092819003830181206000988952835296819020606088018252805480895260018201549389018490526002909101546001600160a01b031697909101879052979096509350505050565b8151835114801561028c575080518251145b6102d55760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604482015260640160405180910390fd5b60005b8351811015610349576103378482815181106102f6576102f66106bb565b6020026020010151848381518110610310576103106106bb565b602002602001015184848151811061032a5761032a6106bb565b602002602001015161014a565b80610341816106d1565b9150506102d8565b50505050565b600080600080600087604051610365919061068c565b90815260408051602092819003830181206000998a528352978190206060890182528054808a526001820154938a018490526002909101546001600160a01b031698909101889052959095149794965050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156103fa576103fa6103bb565b604052919050565b600082601f83011261041357600080fd5b813567ffffffffffffffff81111561042d5761042d6103bb565b610440601f8201601f19166020016103d1565b81815284602083860101111561045557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561048757600080fd5b833567ffffffffffffffff81111561049e57600080fd5b6104aa86828701610402565b9660208601359650604090950135949350505050565b600080604083850312156104d357600080fd5b823567ffffffffffffffff8111156104ea57600080fd5b6104f685828601610402565b95602094909401359450505050565b600067ffffffffffffffff82111561051f5761051f6103bb565b5060051b60200190565b600082601f83011261053a57600080fd5b8135602061054f61054a83610505565b6103d1565b82815260059290921b8401810191818101908684111561056e57600080fd5b8286015b848110156105895780358352918301918301610572565b509695505050505050565b6000806000606084860312156105a957600080fd5b833567ffffffffffffffff808211156105c157600080fd5b818601915086601f8301126105d557600080fd5b813560206105e561054a83610505565b82815260059290921b8401810191818101908a84111561060457600080fd5b8286015b8481101561063c578035868111156106205760008081fd5b61062e8d86838b0101610402565b845250918301918301610608565b509750508701359250508082111561065357600080fd5b61065f87838801610529565b9350604086013591508082111561067557600080fd5b5061068286828701610529565b9150509250925092565b6000825160005b818110156106ad5760208186018101518583015201610693565b506000920191825250919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016106f157634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220d03f124930aab649f69a63261935e3b1264f0c18e4dd77b81ea19feb30808ee964736f6c63430008110033",
211
+ "devdoc": {
212
+ "kind": "dev",
213
+ "methods": {},
214
+ "version": 1
215
+ },
216
+ "userdoc": {
217
+ "kind": "user",
218
+ "methods": {},
219
+ "version": 1
220
+ },
221
+ "storageLayout": {
222
+ "storage": [
223
+ {
224
+ "astId": 15,
225
+ "contract": "contracts/SHINE.sol:SHINE",
226
+ "label": "nodeData",
227
+ "offset": 0,
228
+ "slot": "0",
229
+ "type": "t_mapping(t_bytes_memory_ptr,t_mapping(t_bytes32,t_struct(DataRecord)8_storage))"
230
+ }
231
+ ],
232
+ "types": {
233
+ "t_address": {
234
+ "encoding": "inplace",
235
+ "label": "address",
236
+ "numberOfBytes": "20"
237
+ },
238
+ "t_bytes32": {
239
+ "encoding": "inplace",
240
+ "label": "bytes32",
241
+ "numberOfBytes": "32"
242
+ },
243
+ "t_bytes_memory_ptr": {
244
+ "encoding": "bytes",
245
+ "label": "bytes",
246
+ "numberOfBytes": "32"
247
+ },
248
+ "t_mapping(t_bytes32,t_struct(DataRecord)8_storage)": {
249
+ "encoding": "mapping",
250
+ "key": "t_bytes32",
251
+ "label": "mapping(bytes32 => struct SHINE.DataRecord)",
252
+ "numberOfBytes": "32",
253
+ "value": "t_struct(DataRecord)8_storage"
254
+ },
255
+ "t_mapping(t_bytes_memory_ptr,t_mapping(t_bytes32,t_struct(DataRecord)8_storage))": {
256
+ "encoding": "mapping",
257
+ "key": "t_bytes_memory_ptr",
258
+ "label": "mapping(bytes => mapping(bytes32 => struct SHINE.DataRecord))",
259
+ "numberOfBytes": "32",
260
+ "value": "t_mapping(t_bytes32,t_struct(DataRecord)8_storage)"
261
+ },
262
+ "t_struct(DataRecord)8_storage": {
263
+ "encoding": "inplace",
264
+ "label": "struct SHINE.DataRecord",
265
+ "members": [
266
+ {
267
+ "astId": 3,
268
+ "contract": "contracts/SHINE.sol:SHINE",
269
+ "label": "contentHash",
270
+ "offset": 0,
271
+ "slot": "0",
272
+ "type": "t_bytes32"
273
+ },
274
+ {
275
+ "astId": 5,
276
+ "contract": "contracts/SHINE.sol:SHINE",
277
+ "label": "timestamp",
278
+ "offset": 0,
279
+ "slot": "1",
280
+ "type": "t_uint256"
281
+ },
282
+ {
283
+ "astId": 7,
284
+ "contract": "contracts/SHINE.sol:SHINE",
285
+ "label": "updater",
286
+ "offset": 0,
287
+ "slot": "2",
288
+ "type": "t_address"
289
+ }
290
+ ],
291
+ "numberOfBytes": "96"
292
+ },
293
+ "t_uint256": {
294
+ "encoding": "inplace",
295
+ "label": "uint256",
296
+ "numberOfBytes": "32"
297
+ }
298
+ }
299
+ }
300
+ }
package/SHINE.sol CHANGED
@@ -2,47 +2,64 @@
2
2
  pragma solidity ^0.8.0;
3
3
 
4
4
  contract SHINE {
5
- struct DataInfo {
6
- bool exists;
7
- address storer;
8
- bytes nodeId;
5
+ struct DataRecord {
6
+ bytes32 contentHash;
7
+ uint256 timestamp;
8
+ address updater;
9
9
  }
10
10
 
11
- mapping(bytes32 => DataInfo) public dataHashes;
11
+ mapping(bytes => mapping(bytes32 => DataRecord)) public nodeData;
12
12
 
13
- event DataHashStored(
14
- bytes32 indexed dataHash,
15
- address indexed storer,
16
- bytes nodeId
13
+ event DataUpdated(
14
+ bytes indexed nodeId,
15
+ bytes32 indexed key,
16
+ bytes32 contentHash,
17
+ address updater
17
18
  );
18
19
 
19
- function storeDataHash(
20
- bytes32 dataHash,
21
- bytes memory nodeId
22
- ) public returns (bytes memory, bytes32) {
23
- require(!dataHashes[dataHash].exists, "Hash already stored");
24
- dataHashes[dataHash] = DataInfo(true, msg.sender, nodeId);
25
- emit DataHashStored(dataHash, msg.sender, nodeId);
26
- return (nodeId, dataHash);
20
+ function updateData(
21
+ bytes memory nodeId,
22
+ bytes32 key,
23
+ bytes32 contentHash
24
+ ) public {
25
+ nodeData[nodeId][key] = DataRecord(
26
+ contentHash,
27
+ block.timestamp,
28
+ msg.sender
29
+ );
30
+ emit DataUpdated(nodeId, key, contentHash, msg.sender);
31
+ }
32
+
33
+ function verifyData(
34
+ bytes memory nodeId,
35
+ bytes32 key,
36
+ bytes32 contentHash
37
+ ) public view returns (bool, uint256, address) {
38
+ DataRecord memory record = nodeData[nodeId][key];
39
+ bool isValid = record.contentHash == contentHash;
40
+ return (isValid, record.timestamp, record.updater);
27
41
  }
28
42
 
29
- function verifyDataHash(
30
- bytes32 dataHash
31
- ) public view returns (bool exists, address storer, bytes memory nodeId) {
32
- DataInfo memory info = dataHashes[dataHash];
33
- return (info.exists, info.storer, info.nodeId);
43
+ function getLatestRecord(
44
+ bytes memory nodeId,
45
+ bytes32 key
46
+ ) public view returns (bytes32, uint256, address) {
47
+ DataRecord memory record = nodeData[nodeId][key];
48
+ return (record.contentHash, record.timestamp, record.updater);
34
49
  }
35
50
 
36
- function batchStoreDataHashes(
37
- bytes32[] memory hashes,
38
- bytes[] memory nodeIds
51
+ function batchUpdateData(
52
+ bytes[] memory nodeIds,
53
+ bytes32[] memory keys,
54
+ bytes32[] memory contentHashes
39
55
  ) public {
40
- require(hashes.length == nodeIds.length, "Arrays length mismatch");
41
- for (uint i = 0; i < hashes.length; i++) {
42
- if (!dataHashes[hashes[i]].exists) {
43
- dataHashes[hashes[i]] = DataInfo(true, msg.sender, nodeIds[i]);
44
- emit DataHashStored(hashes[i], msg.sender, nodeIds[i]);
45
- }
56
+ require(
57
+ nodeIds.length == keys.length &&
58
+ keys.length == contentHashes.length,
59
+ "Arrays length mismatch"
60
+ );
61
+ for (uint i = 0; i < nodeIds.length; i++) {
62
+ updateData(nodeIds[i], keys[i], contentHashes[i]);
46
63
  }
47
64
  }
48
65
  }
package/index.js CHANGED
@@ -2,6 +2,12 @@ const Gun = require("gun/gun");
2
2
  const SEA = require("gun/sea");
3
3
  const ethers = require("ethers");
4
4
 
5
+ const SHINE = require("./SHINE.json");
6
+ const SHINE_ABI = SHINE.abi;
7
+ const SHINE_OPTIMISM_SEPOLIA = SHINE.address;
8
+
9
+ let SHINE_CONTRACT_ADDRESS;
10
+
5
11
  // Aggiungi il metodo alla catena di Gun
6
12
  Gun.chain.verifySignature = async function (message, signature) {
7
13
  try {
@@ -87,147 +93,8 @@ Gun.chain.getAndDecryptPair = async function (address, signature) {
87
93
  }
88
94
  };
89
95
 
90
- const SHINE_ABI = [
91
- {
92
- anonymous: false,
93
- inputs: [
94
- {
95
- indexed: true,
96
- internalType: "bytes32",
97
- name: "dataHash",
98
- type: "bytes32",
99
- },
100
- {
101
- indexed: true,
102
- internalType: "address",
103
- name: "storer",
104
- type: "address",
105
- },
106
- {
107
- indexed: false,
108
- internalType: "bytes",
109
- name: "nodeId",
110
- type: "bytes",
111
- },
112
- ],
113
- name: "DataHashStored",
114
- type: "event",
115
- },
116
- {
117
- inputs: [
118
- {
119
- internalType: "bytes32[]",
120
- name: "hashes",
121
- type: "bytes32[]",
122
- },
123
- {
124
- internalType: "bytes[]",
125
- name: "nodeIds",
126
- type: "bytes[]",
127
- },
128
- ],
129
- name: "batchStoreDataHashes",
130
- outputs: [],
131
- stateMutability: "nonpayable",
132
- type: "function",
133
- },
134
- {
135
- inputs: [
136
- {
137
- internalType: "bytes32",
138
- name: "",
139
- type: "bytes32",
140
- },
141
- ],
142
- name: "dataHashes",
143
- outputs: [
144
- {
145
- internalType: "bool",
146
- name: "exists",
147
- type: "bool",
148
- },
149
- {
150
- internalType: "address",
151
- name: "storer",
152
- type: "address",
153
- },
154
- {
155
- internalType: "bytes",
156
- name: "nodeId",
157
- type: "bytes",
158
- },
159
- ],
160
- stateMutability: "view",
161
- type: "function",
162
- },
163
- {
164
- inputs: [
165
- {
166
- internalType: "bytes32",
167
- name: "dataHash",
168
- type: "bytes32",
169
- },
170
- {
171
- internalType: "bytes",
172
- name: "nodeId",
173
- type: "bytes",
174
- },
175
- ],
176
- name: "storeDataHash",
177
- outputs: [
178
- {
179
- internalType: "bytes",
180
- name: "",
181
- type: "bytes",
182
- },
183
- {
184
- internalType: "bytes32",
185
- name: "",
186
- type: "bytes32",
187
- },
188
- ],
189
- stateMutability: "nonpayable",
190
- type: "function",
191
- },
192
- {
193
- inputs: [
194
- {
195
- internalType: "bytes32",
196
- name: "dataHash",
197
- type: "bytes32",
198
- },
199
- ],
200
- name: "verifyDataHash",
201
- outputs: [
202
- {
203
- internalType: "bool",
204
- name: "exists",
205
- type: "bool",
206
- },
207
- {
208
- internalType: "address",
209
- name: "storer",
210
- type: "address",
211
- },
212
- {
213
- internalType: "bytes",
214
- name: "nodeId",
215
- type: "bytes",
216
- },
217
- ],
218
- stateMutability: "view",
219
- type: "function",
220
- },
221
- ];
222
-
223
- // Indirizzo del contratto SHINE deployato
224
- const SHINE_OPTIMISM_SEPOLIA = "0xb78E3E846FAf57Db15FfF17d8200a7736A7EDfBF"; // Inserisci qui l'indirizzo del contratto deployato
225
-
226
- let SHINE_CONTRACT_ADDRESS;
227
-
228
96
  Gun.chain.shine = function (chain, data, callback) {
229
97
  const gun = this;
230
- const sea = Gun.SEA;
231
98
 
232
99
  // select address based on chain
233
100
  if (chain === "optimismSepolia") {
@@ -248,26 +115,35 @@ Gun.chain.shine = function (chain, data, callback) {
248
115
  };
249
116
 
250
117
  // Funzione per scrivere on-chain
251
- const writeOnChain = async (hash, nodeId) => {
118
+ const writeOnChain = async (nodeId, key, contentHash) => {
252
119
  const signer = await getSigner();
253
120
  const contract = new ethers.Contract(
254
121
  SHINE_CONTRACT_ADDRESS,
255
122
  SHINE_ABI,
256
123
  signer
257
124
  );
258
- const tx = await contract.storeDataHash(hash, ethers.toUtf8Bytes(nodeId));
125
+ const tx = await contract.updateData(
126
+ ethers.toUtf8Bytes(nodeId),
127
+ key,
128
+ contentHash
129
+ );
259
130
  await tx.wait();
131
+ return tx;
260
132
  };
261
133
 
262
134
  // Funzione per verificare on-chain
263
- const verifyOnChain = async (hash) => {
135
+ const verifyOnChain = async (nodeId, key, contentHash) => {
264
136
  const signer = await getSigner();
265
137
  const contract = new ethers.Contract(
266
138
  SHINE_CONTRACT_ADDRESS,
267
139
  SHINE_ABI,
268
140
  signer
269
141
  );
270
- return await contract.verifyDataHash(hash);
142
+ return await contract.verifyData(
143
+ ethers.toUtf8Bytes(nodeId),
144
+ key,
145
+ contentHash
146
+ );
271
147
  };
272
148
 
273
149
  // Processo SHINE
@@ -280,25 +156,32 @@ Gun.chain.shine = function (chain, data, callback) {
280
156
  try {
281
157
  // Calcola l'hash del dato
282
158
  const dataString = JSON.stringify(data);
283
- const dataHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
159
+ const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
284
160
 
285
161
  // Ottieni l'ID del nodo corrente
286
162
  const nodeId = gun.back("opt.pid") || "unknown";
287
163
 
164
+ // Genera una chiave unica per questo dato
165
+ const key = ethers.keccak256(ethers.toUtf8Bytes(ack.get));
166
+
288
167
  // Scrivi on-chain
289
- await writeOnChain(dataHash, nodeId);
168
+ const writeTx = await writeOnChain(nodeId, key, contentHash);
290
169
 
291
170
  // Verifica GunDB e chain
292
171
  const gunData = await gun.get(ack.get).then();
293
- const [exists, storer, storedNodeId] = await verifyOnChain(dataHash);
172
+ const [isValid, timestamp, updater] = await verifyOnChain(
173
+ nodeId,
174
+ key,
175
+ contentHash
176
+ );
294
177
 
295
- if (JSON.stringify(gunData) === dataString && exists) {
178
+ if (JSON.stringify(gunData) === dataString && isValid) {
296
179
  if (callback)
297
180
  callback({
298
181
  ok: true,
299
182
  message: "Data verified on GunDB and blockchain",
300
- storer: storer,
301
- nodeId: ethers.toUtf8String(storedNodeId),
183
+ updater: updater,
184
+ timestamp: timestamp.toString(),
302
185
  });
303
186
  } else {
304
187
  if (callback) callback({ err: "Data verification failed" });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gun-eth",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "A GunDB plugin for Ethereum, and Web3",
5
5
  "main": "index.js",
6
6
  "scripts": {