gun-eth 1.1.2 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/index.js +139 -27
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -94,9 +94,21 @@ Gun.chain.getAndDecryptPair = async function (address, signature) {
94
94
  };
95
95
 
96
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
- // select address based on chain
111
+ // Seleziona l'indirizzo basato sulla catena
100
112
  if (chain === "optimismSepolia") {
101
113
  SHINE_CONTRACT_ADDRESS = SHINE_OPTIMISM_SEPOLIA;
102
114
  } else {
@@ -138,7 +150,11 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
138
150
  SHINE_ABI,
139
151
  signer
140
152
  );
141
- return await contract.verifyData(ethers.toUtf8Bytes(nodeId), contentHash);
153
+ const [isValid, timestamp, updater] = await contract.verifyData(
154
+ ethers.toUtf8Bytes(nodeId),
155
+ contentHash
156
+ );
157
+ return isValid;
142
158
  };
143
159
 
144
160
  // Funzione per ottenere l'ultimo record on-chain
@@ -149,7 +165,10 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
149
165
  SHINE_ABI,
150
166
  signer
151
167
  );
152
- return await contract.getLatestRecord(ethers.toUtf8Bytes(nodeId));
168
+ const [contentHash, timestamp, updater] = await contract.getLatestRecord(
169
+ ethers.toUtf8Bytes(nodeId)
170
+ );
171
+ return { contentHash, timestamp, updater };
153
172
  };
154
173
 
155
174
  // Processo SHINE
@@ -160,27 +179,31 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
160
179
  const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
161
180
 
162
181
  // Ottieni l'ultimo record on-chain
163
- const [lastContentHash, lastTimestamp, lastUpdater] =
164
- await getLatestRecord(nodeId);
182
+ const latestRecord = await getLatestRecord(nodeId);
183
+ console.log("Ultimo record on-chain:", latestRecord);
165
184
 
166
- if (lastContentHash !== ethers.ZeroHash) {
167
- // Il dato esiste on-chain
168
- if (lastContentHash === contentHash) {
169
- // Il dato on-chain corrisponde al dato in GunDB
170
- if (callback)
171
- callback({
172
- ok: true,
173
- message: "Data verified on GunDB and blockchain",
174
- updater: lastUpdater,
175
- timestamp: lastTimestamp.toString(),
176
- });
177
- } else {
178
- // Il dato on-chain è diverso dal dato in GunDB
179
- if (callback)
180
- callback({ err: "Data mismatch between GunDB and blockchain" });
181
- }
185
+ // Verifica se il contenuto corrisponde all'ultimo record on-chain
186
+ if (latestRecord.contentHash === contentHash) {
187
+ if (callback)
188
+ callback({
189
+ ok: true,
190
+ message: "Data already up-to-date on blockchain",
191
+ });
192
+ return;
193
+ }
194
+
195
+ // Verifica on-chain prima di procedere
196
+ const isVerified = await verifyOnChain(nodeId, contentHash);
197
+
198
+ if (isVerified) {
199
+ // Il dato è già verificato on-chain
200
+ if (callback)
201
+ callback({
202
+ ok: true,
203
+ message: "Data already verified on blockchain",
204
+ });
182
205
  } else {
183
- // Il dato non esiste on-chain, procedi alla scrittura
206
+ // Il dato non è verificato on-chain, procedi alla scrittura
184
207
  if (!existingData) {
185
208
  gun.get(nodeId).put(dataToVerify);
186
209
  }
@@ -188,16 +211,13 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
188
211
  await writeOnChain(nodeId, contentHash);
189
212
 
190
213
  // Verifica dopo la scrittura
191
- const [newContentHash, newTimestamp, newUpdater] =
192
- await getLatestRecord(nodeId);
214
+ const verifiedAfterWrite = await verifyOnChain(nodeId, contentHash);
193
215
 
194
- if (newContentHash === contentHash) {
216
+ if (verifiedAfterWrite) {
195
217
  if (callback)
196
218
  callback({
197
219
  ok: true,
198
220
  message: "Data written and verified on GunDB and blockchain",
199
- updater: newUpdater,
200
- timestamp: newTimestamp.toString(),
201
221
  });
202
222
  } else {
203
223
  if (callback)
@@ -209,5 +229,97 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
209
229
  }
210
230
  });
211
231
 
232
+ // Aggiungi questa funzione all'interno di shine
233
+ gun.batchShine = async function (nodeIds, dataArray) {
234
+ if (nodeIds.length !== dataArray.length) {
235
+ throw new Error(
236
+ "Il numero di nodeIds deve corrispondere al numero di elementi dati"
237
+ );
238
+ }
239
+
240
+ const contentHashes = [];
241
+ for (let i = 0; i < nodeIds.length; i++) {
242
+ const dataString = JSON.stringify(dataArray[i]);
243
+ const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
244
+ contentHashes.push(contentHash);
245
+ gun.get(nodeIds[i]).put(dataArray[i]);
246
+ }
247
+
248
+ try {
249
+ const tx = await batchWriteOnChain(nodeIds, contentHashes);
250
+ console.log("Batch update completato:", tx.hash);
251
+ return tx;
252
+ } catch (error) {
253
+ console.error("Errore durante il batch update:", error);
254
+ throw error;
255
+ }
256
+ };
257
+
258
+ // Aggiungi un listener per l'evento DataUpdated
259
+ const provider = new ethers.BrowserProvider(window.ethereum);
260
+ const contract = new ethers.Contract(
261
+ SHINE_CONTRACT_ADDRESS,
262
+ SHINE_ABI,
263
+ provider
264
+ );
265
+ contract.on("DataUpdated", (nodeId, contentHash, updater) => {
266
+ console.log("Evento DataUpdated ricevuto:", {
267
+ nodeId: ethers.toUtf8String(nodeId),
268
+ contentHash,
269
+ updater,
270
+ });
271
+ // Qui puoi aggiungere la logica per gestire l'evento, ad esempio aggiornare l'interfaccia utente
272
+ });
273
+
274
+ // Aggiungi questa funzione all'interno di shine
275
+ gun.getLatestRecordFromChain = async function (nodeId) {
276
+ try {
277
+ const latestRecord = await getLatestRecord(nodeId);
278
+ console.log("Ultimo record on-chain per", nodeId, ":", latestRecord);
279
+ return latestRecord;
280
+ } catch (error) {
281
+ console.error("Errore nel recupero dell'ultimo record:", error);
282
+ throw error;
283
+ }
284
+ };
285
+
212
286
  return gun;
213
287
  };
288
+
289
+ // Aggiungi questa funzione dopo writeOnChain
290
+ const batchWriteOnChain = async (nodeIds, contentHashes) => {
291
+ const signer = await getSigner();
292
+ const contract = new ethers.Contract(
293
+ SHINE_CONTRACT_ADDRESS,
294
+ SHINE_ABI,
295
+ signer
296
+ );
297
+ const tx = await contract.batchUpdateData(
298
+ nodeIds.map((id) => ethers.toUtf8Bytes(id)),
299
+ contentHashes
300
+ );
301
+ await tx.wait();
302
+ return tx;
303
+ };
304
+
305
+ // Aggiungi questa funzione per verificare i dati batch
306
+ Gun.chain.batchVerify = async function (nodeIds, dataArray) {
307
+ if (nodeIds.length !== dataArray.length) {
308
+ throw new Error(
309
+ "Il numero di nodeIds deve corrispondere al numero di elementi dati"
310
+ );
311
+ }
312
+
313
+ const results = [];
314
+ for (let i = 0; i < nodeIds.length; i++) {
315
+ const dataString = JSON.stringify(dataArray[i]);
316
+ const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
317
+ const isVerified = await this.verifyOnChain(nodeIds[i], contentHash);
318
+ results.push({
319
+ nodeId: nodeIds[i],
320
+ isVerified: isVerified,
321
+ });
322
+ }
323
+
324
+ return results;
325
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gun-eth",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "A GunDB plugin for Ethereum, and Web3",
5
5
  "main": "index.js",
6
6
  "scripts": {