gun-eth 1.1.0 → 1.1.1

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.
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": {