gun-eth 1.1.1 → 1.1.3

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