gun-eth 1.0.1 → 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 +65 -0
  3. package/index.js +107 -0
  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 ADDED
@@ -0,0 +1,65 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ contract SHINE {
5
+ struct DataRecord {
6
+ bytes32 contentHash;
7
+ uint256 timestamp;
8
+ address updater;
9
+ }
10
+
11
+ mapping(bytes => mapping(bytes32 => DataRecord)) public nodeData;
12
+
13
+ event DataUpdated(
14
+ bytes indexed nodeId,
15
+ bytes32 indexed key,
16
+ bytes32 contentHash,
17
+ address updater
18
+ );
19
+
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);
41
+ }
42
+
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);
49
+ }
50
+
51
+ function batchUpdateData(
52
+ bytes[] memory nodeIds,
53
+ bytes32[] memory keys,
54
+ bytes32[] memory contentHashes
55
+ ) public {
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]);
63
+ }
64
+ }
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 {
@@ -86,3 +92,104 @@ Gun.chain.getAndDecryptPair = async function (address, signature) {
86
92
  return null;
87
93
  }
88
94
  };
95
+
96
+ Gun.chain.shine = function (chain, data, callback) {
97
+ const gun = this;
98
+
99
+ // select address based on chain
100
+ if (chain === "optimismSepolia") {
101
+ SHINE_CONTRACT_ADDRESS = SHINE_OPTIMISM_SEPOLIA;
102
+ } else {
103
+ throw new Error("Chain not supported");
104
+ }
105
+
106
+ // Funzione per ottenere il signer
107
+ const getSigner = async () => {
108
+ if (typeof window.ethereum !== "undefined") {
109
+ await window.ethereum.request({ method: "eth_requestAccounts" });
110
+ const provider = new ethers.BrowserProvider(window.ethereum);
111
+ return provider.getSigner();
112
+ } else {
113
+ throw new Error("Ethereum provider not found");
114
+ }
115
+ };
116
+
117
+ // Funzione per scrivere on-chain
118
+ const writeOnChain = async (nodeId, key, contentHash) => {
119
+ const signer = await getSigner();
120
+ const contract = new ethers.Contract(
121
+ SHINE_CONTRACT_ADDRESS,
122
+ SHINE_ABI,
123
+ signer
124
+ );
125
+ const tx = await contract.updateData(
126
+ ethers.toUtf8Bytes(nodeId),
127
+ key,
128
+ contentHash
129
+ );
130
+ await tx.wait();
131
+ return tx;
132
+ };
133
+
134
+ // Funzione per verificare on-chain
135
+ const verifyOnChain = async (nodeId, key, contentHash) => {
136
+ const signer = await getSigner();
137
+ const contract = new ethers.Contract(
138
+ SHINE_CONTRACT_ADDRESS,
139
+ SHINE_ABI,
140
+ signer
141
+ );
142
+ return await contract.verifyData(
143
+ ethers.toUtf8Bytes(nodeId),
144
+ key,
145
+ contentHash
146
+ );
147
+ };
148
+
149
+ // Processo SHINE
150
+ gun.put(data, async (ack) => {
151
+ if (ack.err) {
152
+ if (callback) callback({ err: ack.err });
153
+ return;
154
+ }
155
+
156
+ try {
157
+ // Calcola l'hash del dato
158
+ const dataString = JSON.stringify(data);
159
+ const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
160
+
161
+ // Ottieni l'ID del nodo corrente
162
+ const nodeId = gun.back("opt.pid") || "unknown";
163
+
164
+ // Genera una chiave unica per questo dato
165
+ const key = ethers.keccak256(ethers.toUtf8Bytes(ack.get));
166
+
167
+ // Scrivi on-chain
168
+ const writeTx = await writeOnChain(nodeId, key, contentHash);
169
+
170
+ // Verifica GunDB e chain
171
+ const gunData = await gun.get(ack.get).then();
172
+ const [isValid, timestamp, updater] = await verifyOnChain(
173
+ nodeId,
174
+ key,
175
+ contentHash
176
+ );
177
+
178
+ if (JSON.stringify(gunData) === dataString && isValid) {
179
+ if (callback)
180
+ callback({
181
+ ok: true,
182
+ message: "Data verified on GunDB and blockchain",
183
+ updater: updater,
184
+ timestamp: timestamp.toString(),
185
+ });
186
+ } else {
187
+ if (callback) callback({ err: "Data verification failed" });
188
+ }
189
+ } catch (error) {
190
+ if (callback) callback({ err: error.message });
191
+ }
192
+ });
193
+
194
+ return gun;
195
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gun-eth",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "description": "A GunDB plugin for Ethereum, and Web3",
5
5
  "main": "index.js",
6
6
  "scripts": {