gun-eth 1.1.1 → 1.1.3

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 +19 -57
  2. package/SHINE.sol +9 -22
  3. package/index.js +72 -42
  4. package/package.json +1 -1
package/SHINE.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "address": "0x21f5C4f2a0898Aa3EaFfdcb644dFeF30e95cC359",
2
+ "address": "0x43D838b683F772F08f321E5FA265ad3e333BE9C2",
3
3
  "abi": [
4
4
  {
5
5
  "anonymous": false,
@@ -10,12 +10,6 @@
10
10
  "name": "nodeId",
11
11
  "type": "bytes"
12
12
  },
13
- {
14
- "indexed": true,
15
- "internalType": "bytes32",
16
- "name": "key",
17
- "type": "bytes32"
18
- },
19
13
  {
20
14
  "indexed": false,
21
15
  "internalType": "bytes32",
@@ -39,11 +33,6 @@
39
33
  "name": "nodeIds",
40
34
  "type": "bytes[]"
41
35
  },
42
- {
43
- "internalType": "bytes32[]",
44
- "name": "keys",
45
- "type": "bytes32[]"
46
- },
47
36
  {
48
37
  "internalType": "bytes32[]",
49
38
  "name": "contentHashes",
@@ -61,11 +50,6 @@
61
50
  "internalType": "bytes",
62
51
  "name": "nodeId",
63
52
  "type": "bytes"
64
- },
65
- {
66
- "internalType": "bytes32",
67
- "name": "key",
68
- "type": "bytes32"
69
53
  }
70
54
  ],
71
55
  "name": "getLatestRecord",
@@ -95,11 +79,6 @@
95
79
  "internalType": "bytes",
96
80
  "name": "",
97
81
  "type": "bytes"
98
- },
99
- {
100
- "internalType": "bytes32",
101
- "name": "",
102
- "type": "bytes32"
103
82
  }
104
83
  ],
105
84
  "name": "nodeData",
@@ -130,11 +109,6 @@
130
109
  "name": "nodeId",
131
110
  "type": "bytes"
132
111
  },
133
- {
134
- "internalType": "bytes32",
135
- "name": "key",
136
- "type": "bytes32"
137
- },
138
112
  {
139
113
  "internalType": "bytes32",
140
114
  "name": "contentHash",
@@ -153,11 +127,6 @@
153
127
  "name": "nodeId",
154
128
  "type": "bytes"
155
129
  },
156
- {
157
- "internalType": "bytes32",
158
- "name": "key",
159
- "type": "bytes32"
160
- },
161
130
  {
162
131
  "internalType": "bytes32",
163
132
  "name": "contentHash",
@@ -186,28 +155,28 @@
186
155
  "type": "function"
187
156
  }
188
157
  ],
189
- "transactionHash": "0x1443c497e2f29a9854ee5e1eeaf6a4b9749a02da8814538cc34517cbb9d0be7e",
158
+ "transactionHash": "0xc00b134812b2cb32d6a412fd1d1a4c9661777b0ee29ed0ff05b09c7c0b1f6f0d",
190
159
  "receipt": {
191
160
  "to": null,
192
161
  "from": "0x8aA5F726d9F868a21a8bd748E2f1E43bA31eb670",
193
- "contractAddress": "0x21f5C4f2a0898Aa3EaFfdcb644dFeF30e95cC359",
194
- "transactionIndex": 4,
195
- "gasUsed": "450179",
162
+ "contractAddress": "0x43D838b683F772F08f321E5FA265ad3e333BE9C2",
163
+ "transactionIndex": 2,
164
+ "gasUsed": "419514",
196
165
  "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
197
- "blockHash": "0xefa0944e3578d4275ec0321cb139c007b4d908b6852ebd376333899bd3b1d296",
198
- "transactionHash": "0x1443c497e2f29a9854ee5e1eeaf6a4b9749a02da8814538cc34517cbb9d0be7e",
166
+ "blockHash": "0xc8bd27a2f9bf4ec35e2c61c2c2e62b47b70aa10f587ea48d4802611c36116dd6",
167
+ "transactionHash": "0xc00b134812b2cb32d6a412fd1d1a4c9661777b0ee29ed0ff05b09c7c0b1f6f0d",
199
168
  "logs": [],
200
- "blockNumber": 17722535,
201
- "cumulativeGasUsed": "1569514",
169
+ "blockNumber": 17723163,
170
+ "cumulativeGasUsed": "551282",
202
171
  "status": 1,
203
172
  "byzantium": true
204
173
  },
205
174
  "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",
175
+ "numDeployments": 4,
176
+ "solcInputHash": "40cece70198a47ff2f958bd8d77d352d",
177
+ "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"},{\"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\":\"contentHashes\",\"type\":\"bytes32[]\"}],\"name\":\"batchUpdateData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"}],\"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\"}],\"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\":\"contentHash\",\"type\":\"bytes32\"}],\"name\":\"updateData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeId\",\"type\":\"bytes\"},{\"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 => DataRecord) public nodeData;\\r\\n\\r\\n\\tevent DataUpdated(\\r\\n\\t\\tbytes indexed nodeId,\\r\\n\\t\\tbytes32 contentHash,\\r\\n\\t\\taddress updater\\r\\n\\t);\\r\\n\\r\\n\\tfunction updateData(bytes memory nodeId, bytes32 contentHash) public {\\r\\n\\t\\tnodeData[nodeId] = DataRecord(contentHash, block.timestamp, msg.sender);\\r\\n\\t\\temit DataUpdated(nodeId, contentHash, msg.sender);\\r\\n\\t}\\r\\n\\r\\n\\tfunction verifyData(\\r\\n\\t\\tbytes memory nodeId,\\r\\n\\t\\tbytes32 contentHash\\r\\n\\t) public view returns (bool, uint256, address) {\\r\\n\\t\\tDataRecord memory record = nodeData[nodeId];\\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) public view returns (bytes32, uint256, address) {\\r\\n\\t\\tDataRecord memory record = nodeData[nodeId];\\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 contentHashes\\r\\n\\t) public {\\r\\n\\t\\trequire(\\r\\n\\t\\t\\tnodeIds.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], contentHashes[i]);\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\",\"keccak256\":\"0x1ed77b1882586a77f3e6d5bf176009c5f00b9d91f71cfd6153ca2d57ef30831d\",\"license\":\"MIT\"}},\"version\":1}",
178
+ "bytecode": "0x608060405234801561001057600080fd5b506106a0806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630d36830e1461005c5780630f07e48514610071578063d236feda14610084578063d54193d7146100c2578063d58a3de3146100f9575b600080fd5b61006f61006a3660046104a8565b61013c565b005b61006f61007f36600461057c565b6101e9565b61009761009236600461057c565b6102a2565b60408051931515845260208401929092526001600160a01b0316908201526060015b60405180910390f35b6100d56100d03660046105c1565b610302565b6040805193845260208401929092526001600160a01b0316908201526060016100b9565b6100d56101073660046105c1565b80516020818301810180516000825292820191909301209152805460018201546002909201549091906001600160a01b031683565b805182511461018a5760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604482015260640160405180910390fd5b60005b82518110156101e4576101d28382815181106101ab576101ab6105fe565b60200260200101518383815181106101c5576101c56105fe565b60200260200101516101e9565b806101dc81610614565b91505061018d565b505050565b604080516060810182528281524260208201523381830152905160009061021190859061063b565b908152604080516020928190038301812084518155928401516001840155920151600290910180546001600160a01b0319166001600160a01b0390921691909117905561025f90839061063b565b60408051918290038220838352336020840152917fac3d4f3cbf6818c9329b6b8c61e41d9dc52fc1cc580fff6af273be3ebc1d423f910160405180910390a25050565b6000806000806000866040516102b8919061063b565b9081526040805160209281900383018120606082018352805480835260018201549483018590526002909101546001600160a01b0316919092018190529614979096509350505050565b600080600080600085604051610318919061063b565b9081526040805160209281900383018120606082018352805480835260018201549483018590526002909101546001600160a01b0316919092018190529097919650945092505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156103a1576103a1610362565b604052919050565b600067ffffffffffffffff8211156103c3576103c3610362565b5060051b60200190565b600082601f8301126103de57600080fd5b813567ffffffffffffffff8111156103f8576103f8610362565b61040b601f8201601f1916602001610378565b81815284602083860101111561042057600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261044e57600080fd5b8135602061046361045e836103a9565b610378565b82815260059290921b8401810191818101908684111561048257600080fd5b8286015b8481101561049d5780358352918301918301610486565b509695505050505050565b600080604083850312156104bb57600080fd5b823567ffffffffffffffff808211156104d357600080fd5b818501915085601f8301126104e757600080fd5b813560206104f761045e836103a9565b82815260059290921b8401810191818101908984111561051657600080fd5b8286015b8481101561054e578035868111156105325760008081fd5b6105408c86838b01016103cd565b84525091830191830161051a565b509650508601359250508082111561056557600080fd5b506105728582860161043d565b9150509250929050565b6000806040838503121561058f57600080fd5b823567ffffffffffffffff8111156105a657600080fd5b6105b2858286016103cd565b95602094909401359450505050565b6000602082840312156105d357600080fd5b813567ffffffffffffffff8111156105ea57600080fd5b6105f6848285016103cd565b949350505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161063457634e487b7160e01b600052601160045260246000fd5b5060010190565b6000825160005b8181101561065c5760208186018101518583015201610642565b50600092019182525091905056fea2646970667358221220c3ea212644c861f0e892deb0129df945a7fa2af5971e51e4b97810c73fc547f764736f6c63430008110033",
179
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80630d36830e1461005c5780630f07e48514610071578063d236feda14610084578063d54193d7146100c2578063d58a3de3146100f9575b600080fd5b61006f61006a3660046104a8565b61013c565b005b61006f61007f36600461057c565b6101e9565b61009761009236600461057c565b6102a2565b60408051931515845260208401929092526001600160a01b0316908201526060015b60405180910390f35b6100d56100d03660046105c1565b610302565b6040805193845260208401929092526001600160a01b0316908201526060016100b9565b6100d56101073660046105c1565b80516020818301810180516000825292820191909301209152805460018201546002909201549091906001600160a01b031683565b805182511461018a5760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604482015260640160405180910390fd5b60005b82518110156101e4576101d28382815181106101ab576101ab6105fe565b60200260200101518383815181106101c5576101c56105fe565b60200260200101516101e9565b806101dc81610614565b91505061018d565b505050565b604080516060810182528281524260208201523381830152905160009061021190859061063b565b908152604080516020928190038301812084518155928401516001840155920151600290910180546001600160a01b0319166001600160a01b0390921691909117905561025f90839061063b565b60408051918290038220838352336020840152917fac3d4f3cbf6818c9329b6b8c61e41d9dc52fc1cc580fff6af273be3ebc1d423f910160405180910390a25050565b6000806000806000866040516102b8919061063b565b9081526040805160209281900383018120606082018352805480835260018201549483018590526002909101546001600160a01b0316919092018190529614979096509350505050565b600080600080600085604051610318919061063b565b9081526040805160209281900383018120606082018352805480835260018201549483018590526002909101546001600160a01b0316919092018190529097919650945092505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156103a1576103a1610362565b604052919050565b600067ffffffffffffffff8211156103c3576103c3610362565b5060051b60200190565b600082601f8301126103de57600080fd5b813567ffffffffffffffff8111156103f8576103f8610362565b61040b601f8201601f1916602001610378565b81815284602083860101111561042057600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261044e57600080fd5b8135602061046361045e836103a9565b610378565b82815260059290921b8401810191818101908684111561048257600080fd5b8286015b8481101561049d5780358352918301918301610486565b509695505050505050565b600080604083850312156104bb57600080fd5b823567ffffffffffffffff808211156104d357600080fd5b818501915085601f8301126104e757600080fd5b813560206104f761045e836103a9565b82815260059290921b8401810191818101908984111561051657600080fd5b8286015b8481101561054e578035868111156105325760008081fd5b6105408c86838b01016103cd565b84525091830191830161051a565b509650508601359250508082111561056557600080fd5b506105728582860161043d565b9150509250929050565b6000806040838503121561058f57600080fd5b823567ffffffffffffffff8111156105a657600080fd5b6105b2858286016103cd565b95602094909401359450505050565b6000602082840312156105d357600080fd5b813567ffffffffffffffff8111156105ea57600080fd5b6105f6848285016103cd565b949350505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161063457634e487b7160e01b600052601160045260246000fd5b5060010190565b6000825160005b8181101561065c5760208186018101518583015201610642565b50600092019182525091905056fea2646970667358221220c3ea212644c861f0e892deb0129df945a7fa2af5971e51e4b97810c73fc547f764736f6c63430008110033",
211
180
  "devdoc": {
212
181
  "kind": "dev",
213
182
  "methods": {},
@@ -221,12 +190,12 @@
221
190
  "storageLayout": {
222
191
  "storage": [
223
192
  {
224
- "astId": 15,
193
+ "astId": 13,
225
194
  "contract": "contracts/SHINE.sol:SHINE",
226
195
  "label": "nodeData",
227
196
  "offset": 0,
228
197
  "slot": "0",
229
- "type": "t_mapping(t_bytes_memory_ptr,t_mapping(t_bytes32,t_struct(DataRecord)8_storage))"
198
+ "type": "t_mapping(t_bytes_memory_ptr,t_struct(DataRecord)8_storage)"
230
199
  }
231
200
  ],
232
201
  "types": {
@@ -245,19 +214,12 @@
245
214
  "label": "bytes",
246
215
  "numberOfBytes": "32"
247
216
  },
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))": {
217
+ "t_mapping(t_bytes_memory_ptr,t_struct(DataRecord)8_storage)": {
256
218
  "encoding": "mapping",
257
219
  "key": "t_bytes_memory_ptr",
258
- "label": "mapping(bytes => mapping(bytes32 => struct SHINE.DataRecord))",
220
+ "label": "mapping(bytes => struct SHINE.DataRecord)",
259
221
  "numberOfBytes": "32",
260
- "value": "t_mapping(t_bytes32,t_struct(DataRecord)8_storage)"
222
+ "value": "t_struct(DataRecord)8_storage"
261
223
  },
262
224
  "t_struct(DataRecord)8_storage": {
263
225
  "encoding": "inplace",
package/SHINE.sol CHANGED
@@ -8,58 +8,45 @@ contract SHINE {
8
8
  address updater;
9
9
  }
10
10
 
11
- mapping(bytes => mapping(bytes32 => DataRecord)) public nodeData;
11
+ mapping(bytes => DataRecord) public nodeData;
12
12
 
13
13
  event DataUpdated(
14
14
  bytes indexed nodeId,
15
- bytes32 indexed key,
16
15
  bytes32 contentHash,
17
16
  address updater
18
17
  );
19
18
 
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);
19
+ function updateData(bytes memory nodeId, bytes32 contentHash) public {
20
+ nodeData[nodeId] = DataRecord(contentHash, block.timestamp, msg.sender);
21
+ emit DataUpdated(nodeId, contentHash, msg.sender);
31
22
  }
32
23
 
33
24
  function verifyData(
34
25
  bytes memory nodeId,
35
- bytes32 key,
36
26
  bytes32 contentHash
37
27
  ) public view returns (bool, uint256, address) {
38
- DataRecord memory record = nodeData[nodeId][key];
28
+ DataRecord memory record = nodeData[nodeId];
39
29
  bool isValid = record.contentHash == contentHash;
40
30
  return (isValid, record.timestamp, record.updater);
41
31
  }
42
32
 
43
33
  function getLatestRecord(
44
- bytes memory nodeId,
45
- bytes32 key
34
+ bytes memory nodeId
46
35
  ) public view returns (bytes32, uint256, address) {
47
- DataRecord memory record = nodeData[nodeId][key];
36
+ DataRecord memory record = nodeData[nodeId];
48
37
  return (record.contentHash, record.timestamp, record.updater);
49
38
  }
50
39
 
51
40
  function batchUpdateData(
52
41
  bytes[] memory nodeIds,
53
- bytes32[] memory keys,
54
42
  bytes32[] memory contentHashes
55
43
  ) public {
56
44
  require(
57
- nodeIds.length == keys.length &&
58
- keys.length == contentHashes.length,
45
+ nodeIds.length == contentHashes.length,
59
46
  "Arrays length mismatch"
60
47
  );
61
48
  for (uint i = 0; i < nodeIds.length; i++) {
62
- updateData(nodeIds[i], keys[i], contentHashes[i]);
49
+ updateData(nodeIds[i], contentHashes[i]);
63
50
  }
64
51
  }
65
52
  }
package/index.js CHANGED
@@ -93,7 +93,19 @@ Gun.chain.getAndDecryptPair = async function (address, signature) {
93
93
  }
94
94
  };
95
95
 
96
- Gun.chain.shine = function (chain, data, callback) {
96
+ Gun.chain.shine = function (chain, nodeId, data, callback) {
97
+ console.log("SHINE plugin called with:", { chain, nodeId, data });
98
+
99
+ if (typeof callback !== "function") {
100
+ console.error("Callback must be a function");
101
+ return this;
102
+ }
103
+
104
+ if (typeof data !== "object" || data === null) {
105
+ callback({ err: "Data must be a non-null object" });
106
+ return this;
107
+ }
108
+
97
109
  const gun = this;
98
110
 
99
111
  // select address based on chain
@@ -115,7 +127,7 @@ Gun.chain.shine = function (chain, data, callback) {
115
127
  };
116
128
 
117
129
  // Funzione per scrivere on-chain
118
- const writeOnChain = async (nodeId, key, contentHash) => {
130
+ const writeOnChain = async (nodeId, contentHash) => {
119
131
  const signer = await getSigner();
120
132
  const contract = new ethers.Contract(
121
133
  SHINE_CONTRACT_ADDRESS,
@@ -124,7 +136,6 @@ Gun.chain.shine = function (chain, data, callback) {
124
136
  );
125
137
  const tx = await contract.updateData(
126
138
  ethers.toUtf8Bytes(nodeId),
127
- key,
128
139
  contentHash
129
140
  );
130
141
  await tx.wait();
@@ -132,59 +143,78 @@ Gun.chain.shine = function (chain, data, callback) {
132
143
  };
133
144
 
134
145
  // Funzione per verificare on-chain
135
- const verifyOnChain = async (nodeId, key, contentHash) => {
146
+ const verifyOnChain = async (nodeId, contentHash) => {
136
147
  const signer = await getSigner();
137
148
  const contract = new ethers.Contract(
138
149
  SHINE_CONTRACT_ADDRESS,
139
150
  SHINE_ABI,
140
151
  signer
141
152
  );
142
- return await contract.verifyData(
143
- ethers.toUtf8Bytes(nodeId),
144
- key,
145
- contentHash
153
+ return await contract.verifyData(ethers.toUtf8Bytes(nodeId), contentHash);
154
+ };
155
+
156
+ // Funzione per ottenere l'ultimo record on-chain
157
+ const getLatestRecord = async (nodeId) => {
158
+ const signer = await getSigner();
159
+ const contract = new ethers.Contract(
160
+ SHINE_CONTRACT_ADDRESS,
161
+ SHINE_ABI,
162
+ signer
146
163
  );
164
+ return await contract.getLatestRecord(ethers.toUtf8Bytes(nodeId));
147
165
  };
148
166
 
149
167
  // Processo SHINE
150
- gun.put(data, async (ack) => {
151
- if (ack.err) {
152
- if (callback) callback({ err: ack.err });
153
- return;
154
- }
155
-
168
+ gun.get(nodeId).once(async (existingData) => {
156
169
  try {
157
- // Calcola l'hash del dato
158
- const dataString = JSON.stringify(data);
170
+ const dataToVerify = existingData || data;
171
+ const dataString = JSON.stringify(dataToVerify);
159
172
  const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
160
173
 
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
- });
174
+ // Ottieni l'ultimo record on-chain
175
+ const [lastContentHash, lastTimestamp, lastUpdater] =
176
+ await getLatestRecord(nodeId);
177
+
178
+ if (lastContentHash !== ethers.ZeroHash) {
179
+ // Il dato esiste on-chain
180
+ if (lastContentHash === contentHash) {
181
+ // Il dato on-chain corrisponde al dato in GunDB
182
+ if (callback)
183
+ callback({
184
+ ok: true,
185
+ message: "Data verified on GunDB and blockchain",
186
+ updater: lastUpdater,
187
+ timestamp: lastTimestamp.toString(),
188
+ });
189
+ } else {
190
+ // Il dato on-chain è diverso dal dato in GunDB
191
+ if (callback)
192
+ callback({ err: "Data mismatch between GunDB and blockchain" });
193
+ }
186
194
  } else {
187
- if (callback) callback({ err: "Data verification failed" });
195
+ // Il dato non esiste on-chain, procedi alla scrittura
196
+ if (!existingData) {
197
+ gun.get(nodeId).put(dataToVerify);
198
+ }
199
+
200
+ await writeOnChain(nodeId, contentHash);
201
+
202
+ // Verifica dopo la scrittura
203
+ const [newContentHash, newTimestamp, newUpdater] =
204
+ await getLatestRecord(nodeId);
205
+
206
+ if (newContentHash === contentHash) {
207
+ if (callback)
208
+ callback({
209
+ ok: true,
210
+ message: "Data written and verified on GunDB and blockchain",
211
+ updater: newUpdater,
212
+ timestamp: newTimestamp.toString(),
213
+ });
214
+ } else {
215
+ if (callback)
216
+ callback({ err: "Data verification failed after writing" });
217
+ }
188
218
  }
189
219
  } catch (error) {
190
220
  if (callback) callback({ err: error.message });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gun-eth",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "A GunDB plugin for Ethereum, and Web3",
5
5
  "main": "index.js",
6
6
  "scripts": {