gun-eth 1.1.3 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- package/index.js +140 -27
- package/package.json +1 -1
package/index.js
CHANGED
@@ -108,7 +108,7 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
|
|
108
108
|
|
109
109
|
const gun = this;
|
110
110
|
|
111
|
-
//
|
111
|
+
// Seleziona l'indirizzo basato sulla catena
|
112
112
|
if (chain === "optimismSepolia") {
|
113
113
|
SHINE_CONTRACT_ADDRESS = SHINE_OPTIMISM_SEPOLIA;
|
114
114
|
} else {
|
@@ -150,7 +150,11 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
|
|
150
150
|
SHINE_ABI,
|
151
151
|
signer
|
152
152
|
);
|
153
|
-
|
153
|
+
const [isValid, timestamp, updater] = await contract.verifyData(
|
154
|
+
ethers.toUtf8Bytes(nodeId),
|
155
|
+
contentHash
|
156
|
+
);
|
157
|
+
return isValid;
|
154
158
|
};
|
155
159
|
|
156
160
|
// Funzione per ottenere l'ultimo record on-chain
|
@@ -161,7 +165,10 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
|
|
161
165
|
SHINE_ABI,
|
162
166
|
signer
|
163
167
|
);
|
164
|
-
|
168
|
+
const [contentHash, timestamp, updater] = await contract.getLatestRecord(
|
169
|
+
ethers.toUtf8Bytes(nodeId)
|
170
|
+
);
|
171
|
+
return { contentHash, timestamp, updater };
|
165
172
|
};
|
166
173
|
|
167
174
|
// Processo SHINE
|
@@ -172,27 +179,31 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
|
|
172
179
|
const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
|
173
180
|
|
174
181
|
// Ottieni l'ultimo record on-chain
|
175
|
-
const
|
176
|
-
|
182
|
+
const latestRecord = await getLatestRecord(nodeId);
|
183
|
+
console.log("Ultimo record on-chain:", latestRecord);
|
177
184
|
|
178
|
-
|
179
|
-
|
180
|
-
if (
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
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
|
+
});
|
194
205
|
} else {
|
195
|
-
// Il dato non
|
206
|
+
// Il dato non è verificato on-chain, procedi alla scrittura
|
196
207
|
if (!existingData) {
|
197
208
|
gun.get(nodeId).put(dataToVerify);
|
198
209
|
}
|
@@ -200,16 +211,13 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
|
|
200
211
|
await writeOnChain(nodeId, contentHash);
|
201
212
|
|
202
213
|
// Verifica dopo la scrittura
|
203
|
-
const
|
204
|
-
await getLatestRecord(nodeId);
|
214
|
+
const verifiedAfterWrite = await verifyOnChain(nodeId, contentHash);
|
205
215
|
|
206
|
-
if (
|
216
|
+
if (verifiedAfterWrite) {
|
207
217
|
if (callback)
|
208
218
|
callback({
|
209
219
|
ok: true,
|
210
220
|
message: "Data written and verified on GunDB and blockchain",
|
211
|
-
updater: newUpdater,
|
212
|
-
timestamp: newTimestamp.toString(),
|
213
221
|
});
|
214
222
|
} else {
|
215
223
|
if (callback)
|
@@ -221,5 +229,110 @@ Gun.chain.shine = function (chain, nodeId, data, callback) {
|
|
221
229
|
}
|
222
230
|
});
|
223
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
|
+
|
224
286
|
return gun;
|
225
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 verifyOnChain(nodeIds[i], contentHash);
|
318
|
+
results.push({
|
319
|
+
nodeId: nodeIds[i],
|
320
|
+
isVerified: isVerified,
|
321
|
+
});
|
322
|
+
}
|
323
|
+
|
324
|
+
return results;
|
325
|
+
};
|
326
|
+
|
327
|
+
// Aggiungi questa funzione per la verifica singola
|
328
|
+
Gun.chain.verifyOnly = async function (nodeId, data) {
|
329
|
+
try {
|
330
|
+
const dataString = JSON.stringify(data);
|
331
|
+
const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
|
332
|
+
const isVerified = await verifyOnChain(nodeId, contentHash);
|
333
|
+
return isVerified;
|
334
|
+
} catch (error) {
|
335
|
+
console.error("Errore durante la verifica:", error);
|
336
|
+
return null;
|
337
|
+
}
|
338
|
+
};
|