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.
- package/index.js +139 -27
- 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
|
-
//
|
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
|
-
|
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
|
-
|
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
|
164
|
-
|
182
|
+
const latestRecord = await getLatestRecord(nodeId);
|
183
|
+
console.log("Ultimo record on-chain:", latestRecord);
|
165
184
|
|
166
|
-
|
167
|
-
|
168
|
-
if (
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
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
|
192
|
-
await getLatestRecord(nodeId);
|
214
|
+
const verifiedAfterWrite = await verifyOnChain(nodeId, contentHash);
|
193
215
|
|
194
|
-
if (
|
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
|
+
};
|