wissenschaftliche Arbeitsabläufe, Groups benötigen häufig Zugriff auf einen gemeinsamen Datensatz, der perfekt synchronisiert bleibt und nicht geändert werden kannB. in verteilten maschinellen Lernumgebungen, in denen mehrere Groups auf genau denselben Funktionsumfang angewiesen sind.

In diesem Artikel werde ich einen durchgehen einfache, gebührenfreie Methode zum kryptografischen Hashing eines Datensatzes beliebiger Größe und zur unveränderlichen Speicherung seines Hashs in der Ethereum-Blockchainwodurch eine dauerhafte und überprüfbare Aufzeichnung der Integrität des Datensatzes erstellt wird.

Diese Methode kann auch einfach auf Modellgewichte, spezifische Transformationen, die konsistent angewendet werden müssen, Quellcode oder andere Daten, die unveränderlich und überprüfbar sein müssen, erweitert werden.

🤔Warum Integrität wichtig ist

Wenn Sie mit der Praxis der Datenwissenschaft zumindest einigermaßen vertraut sind, wissen Sie bereits, wie wichtig die Datenintegrität ist. Schon kleine Änderungen oder Fehler in den Eingabedaten können ein Projekt zum Scheitern bringen.

Moderne Modelle des maschinellen Lernens reagieren äußerst empfindlich auf ihre Trainingsdaten. Fehlende Normalisierungsschritte, eine geänderte CSV-Datei, gemischte Zeilen, beschädigte Options oder Nichtübereinstimmungen zwischen Trainings- und Validierungsdatensätzen können zu dramatisch unterschiedlichen Ergebnissen führen.

Integritätsfehler sind schwer zu erkennen und führen oft zum Scheitern.

Modelle scheinen immer noch regular zu funktionieren oder zu trainieren, aber die Metriken können sich langsam verschlechtern, es kommt zu Abweichungen oder Experimente können nicht mehr reproduziert werden. Integrität ist doppelt wichtig, wenn das Group verteilt ist, möglicherweise über verschiedene Organisationen hinweg, und an verschiedenen Versionen desselben Issues arbeiten muss.

🔐Einen kryptografischen Hash als „Quelle der Wahrheit“ verwenden

Ein kryptografischer Hash bietet uns einen einfachen und sehr nützlichen Mechanismus zur Überprüfung der Datenintegrität.

Eine kurze Einführung in kryptografische Hashes

Eine Hash-Funktion nimmt eine beliebige Menge an Eingabedaten (Bytes) und erzeugt deterministisch eine Ausgabe fester Länge, die als Hash oder Digest bezeichnet wird. Wie Sie wahrscheinlich bereits wissen, sind kryptografische Hashes in der Informatik von grundlegender Bedeutung.

Der Schlüssel ist Determinismus:

Gleiche Daten ein → gleicher Hash-Out

Schon ein einziges geändertes Byte in den Eingabedaten erzeugt einen völlig anderen Hash.

Aufgrund dieser Eigenschaft fungieren Hashes als eindeutige Fingerabdrücke für Daten und sind äußerst nützlich zur Überprüfung der Integrität. Es gibt viele Arten von Hash-Funktionen, und einige sind für diese Aufgabe nützlicher, wie ich beschreibe.

Wie trifft dies auf Datensätze zu?

Aufgrund des Determinismus der Hash-Funktion ist dies möglich, sobald sie auf einen Datensatz angewendet wird Testen Sie schnell und zuverlässig, ob der Datensatz mit unseren Erwartungen übereinstimmt.

Das ist außerordentlich wertvoll mit große Datensätze, die von verwendet werden Mehrere Groups, mehrere Unternehmen, von einer Model zur nächsten wechseln. Group 1 der Forschungsgruppe Alpha erstellt die Options 1-10, Group 2 der Forschungsgruppe Zeta erstellt die Options 10–100, System X verbraucht Model Y usw.

Wir müssen die Daten nicht mehr hinterfragen, Berechnen Sie einfach die Hash-Funktion über den Datensatz und vergleichen Sie sie mit dem an einem Referenzpunkt berechneten Hash. Wenn es übereinstimmt, OK. Wenn nicht, hat sich etwas geändert.

Hashing ist äußerst effizient. Wenn wir eine Hash-Funktion über einen 10-MB- oder 10-TB-Datensatz ausführen, erhalten wir schnell eine kleine Zeichenfolge mit fester Größe, die geteilt, gespeichert oder veröffentlicht werden kann.

🧐 Warum Ethereum als unveränderlichen Speicher nutzen?

Dies ist der wirklich nützliche Teil dieses Artikels.

Ethereum wiederum ist, wie Sie bereits wissen, eine Blockchain. Das gibt uns:

  1. Unveränderlichkeit: Eine Transaktion kann niemals geändert werden
  2. Verteilte Verfügbarkeit: immer zugänglich ohne zentrale Autorität
  3. Dauerhaft: Einmal geschrieben, ist es dauerhaft zugänglich

Aber Ethereum ist für Transaktionen gedacht? Müssen wir für diesen speziellen Zweck nicht einen komplizierten Good Contract schreiben?

Das könntest du tatsächlich. Aber das ist nicht nötig.

Das Schlaue daran ist, dies ungewöhnlich zu nutzen enter information Feld in einem Ethereum Transaktionmanchmal auch als „Anrufdaten“ bezeichnet.

Aber Ethereum-Transaktionen kosten echtes Geld (Benzin, Gebühren usw.)?

Auch wahr. Bei Ethereum wird Ihnen für jedes Byte in den Eingabedaten „Fuel“ berechnet. Im Mainnet könnte uns dies bei einem Preis von 2.000 US-Greenback professional ETH zwischen 0,04 und 0,10 US-Greenback professional Hash kosten. Dies beinhaltet nicht das Fuel, das für eine tatsächliche Übertragung durch einen Blockvalidator erforderlich ist, was je nach aktueller Auslastung des Netzwerks sehr hoch sein kann.

Machen wir es cleverer. 🦊

Indem alles in das „Testnetz“ verlagert wird, über das normalerweise jede Blockchain verfügt, Wir können dies völlig kostenlos machen.

Sepolia (das ETH-Testnetz) wird selten verwendet, es sei denn, Sie sind Entwickler von Good Contracts. Sepolia ETH ist kostenlos und öffentlich über Taps verfügbar.

Das heisst Wir können im öffentlich zugänglichen Testnetz (Sepolia für Ethereum genannt) kostenlos eine unendliche Anzahl von Transaktionen erstellen!

Solange unsere Eingabedaten eine angemessene Größe haben, Sepolia bietet eine Möglichkeit, die Blockchain für die unbegrenzte Datenspeicherung zu nutzenmit größtenteils den gleichen Eigenschaften wie das Mainnet*

* Sepolia-Blockchains sind nicht dauerhaft, aber meist mehrere Jahre lang vertrauenswürdig. Wenn Sie absolute Dauerhaftigkeit benötigen, müssen Sie diese über das Mainnet bezahlen.

Denken Sie daran, dass wir die tatsächlichen Daten nicht in der Kette speichern. Nur der Fingerabdruck.

⚙️Der Prozess

Erstens müssen wir eine Möglichkeit finden, Transaktionen auf Ethereum zuverlässig zu erstellen.

Auch wenn dies komplex erscheint, ist es in Wirklichkeit äußerst einfach. Wir benötigen keine zusätzliche Software program oder Pockets-Technologie. Eine Brieftasche ist nichts anderes als ein Schlüssel, gepaart mit einem Geheimnis, mit dem sie signiert wird.

Um eine Ethereum-Transaktion zu erstellen, erstellen wir ein Python-Objekt mit den erforderlichen Schlüsseln und dem erforderlichen Format, kodieren es mit unserem Schlüssel und senden es an das Netzwerk. Ein Validator holt dann unsere Transaktion aus dem „Mempool“ und fügt sie in einen Block ein.

Solange wir alle erforderlichen Felder einschließen und es ausgecheckt wird, ist es nun innerhalb von ca. 12 Sekunden ein dauerhafter Teil der Blockchain.

Schritt 1: Erstellen Sie den Schlüssel und das Geheimnis mit web3.py mit ein paar Zeilen Code

from eth_account import Account 

account = Account.create() 

print("Deal with:", account.tackle) 
print("Personal Key:", account.key.hex())

Schritt 2: Holen Sie sich ETH auf Sepolia. Geben Sie Ihre Adresse ein Hier und warte 12 Sekunden. Danke Google!

Schritt 3: Hashen Sie den Datensatz

Wie bereits erwähnt, gibt es einige Hashes, die für diesen Prozess besser geeignet sind. Wir könnten einen SHA256-Hash verwenden, aber Blake2b ist tatsächlich besser für den Durchsatz. Eigentlich funktioniert jede Hashing-Funktion.

Verwenden Sie diese Funktion, um die Daten zu hashen.
import hashlib
from pathlib import Path

def hash_dataset(dataset, algorithm="blake2b", chunk_size=1024 * 1024):
    h = hashlib.new(algorithm)

    def replace(obj):
        if isinstance(obj, (str, Path)) and Path(obj).exists():
            with open(obj, "rb") as f:
                whereas chunk := f.learn(chunk_size):
                    h.replace(chunk)
        elif isinstance(obj, bytes):
            h.replace(obj)
        elif isinstance(obj, str):
            h.replace(obj.encode("utf-8"))
        elif isinstance(obj, dict):
            for ok in sorted(obj.keys()):
                replace(ok)
                replace(obj(ok))
        
        elif isinstance(obj, (record, tuple)):
            for merchandise in obj:
                replace(merchandise)
                
        elif isinstance(obj, set):
            strive:
                for merchandise in sorted(obj):
                    replace(merchandise)
            besides TypeError:
                for merchandise in sorted(obj, key=str):
                    replace(merchandise)
                    
        elif hasattr(obj, "__iter__"):
            for merchandise in obj:
                replace(merchandise)
        else:
            h.replace(repr(obj).encode("utf-8"))

    replace(dataset)
    return h.hexdigest()


digest = hash_dataset("hugedataset.parquet", algorithm="blake2b")

Schritt 4: Schreiben, signieren und veröffentlichen Sie eine Transaktion mit dem Hash unseres Datensatzes.

Mit der web3.py Mit der Bibliothek können wir unsere Transaktion als Python-Dikt strukturieren und sie dann im Netzwerk veröffentlichen.

Wir benötigen einen Anbieter, der unsere Transaktion überträgt (wir haben keinen Knoten). Hier verwenden wir Infuraaber es gibt auch andere, wie Alchimie

Beachten Sie nur, dass wir dem in unserem Datensatz berechneten Hash ein Nullbit „0x“ hinzufügen. Wir müssen es entfernen, wenn wir unseren Hash validieren.

from web3 import Web3 
w3 = Web3(Web3.HTTPProvider("https://sepolia.infura.io/v3/YOUR_KEY")) 
dataset_hash = "0x" + digest
 
account = w3.eth.account.from_key("YOUR_PRIVATE_KEY") 

tx = { 
	"to": account.tackle, # self-send (no contract required) 
	"worth": 0, # no ETH switch 
	"fuel": 50_000, 
	"maxFeePerGas": w3.to_wei("20", "gwei"), 
	"maxPriorityFeePerGas": w3.to_wei("2", "gwei"),
	"nonce": w3.eth.get_transaction_count(account.tackle), 
	"chainId": 11155111, # Sepolia testnet 
	"information": dataset_hash 
}

Unterschreiben Sie es und schicken Sie es ab. Hier warten wir, bis die Transaktion abgeschlossen ist.

signed_tx = account.sign_transaction(tx)

tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
print("Broadcast tx hash:", tx_hash.hex())

# Look forward to mining / inclusion in a block
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)

print("Transaction mined in block:", tx_receipt("blockNumber"))
print("Standing:", tx_receipt("standing"))

Behalten Sie unbedingt die Transaktions-ID bei.

Schritt 5: Erstellen Sie einen Metadatensatz, der zusammen mit unserem Datensatz gespeichert wird

Hier erstellen wir einfache Metadaten, die in einer Datenbank (DynamoDB, MongoDB) oder direkt neben unserem Datenobjekt (S3, Google Cloud Storage) gespeichert werden können.

Die Metadaten könnten etwa so aussehen:

{
  "dataset_id": "feature_set_v42",
  "dataset_uri": "s3://ml-bucket/options/v42.parquet",
  "dataset_hash": "0x9f3c...ab21",
  "tx_hash": "0x7c1a...e91d",
  "timestamp_unix": 1730000000,
  "hash_algorithm": "blake2b",
  "creator": "0xabc123...",
  "notes": "normalized options"
}

Schritt 6: Überprüfen Sie beim Lesen des Datensatzes, ob der Hash mit dem Unique-Hash übereinstimmt, der neben unseren Daten gespeichert ist

Der letzte Schritt des Prozesses kombiniert drei Aktionen:

  1. Rufen Sie die Ethereum-Transaktion ab
  2. Extrahieren Sie den Datensatz-Hash aus den Anrufdaten
  3. Vergleichen Sie es mit einem lokal neu berechneten Hash
from web3 import Web3

w3 = Web3(Web3.HTTPProvider("https://sepolia.infura.io/v3/YOUR_KEY"))

def verify_dataset(dataset_path, tx_hash):
    tx = w3.eth.get_transaction(tx_hash)

    raw_input = tx("enter")
    onchain_hash = raw_input.hex() if hasattr(raw_input, 'hex') else str(raw_input).decrease()

    computed_hash = "0x" + hash_dataset(dataset_path).decrease()

    if computed_hash != onchain_hash:
        elevate ValueError(f"Integrity FAILED: Native {computed_hash} != On-chain {onchain_hash}")
    
    print("Integrity examine PASSED. Dataset matches the blockchain report.")
    return True

Das ist es!

Ein wichtiger Hinweisdas hindert niemanden daran, unser Metadatenobjekt neu zu schreiben. Es gibt jedoch viele Möglichkeiten, die interne Änderung eines kleinen Teils der Metadaten zu verhindern, z. B. Audit-Datenbanken oder S3-Objektsperre.

Einpacken

Letztendlich ist die Verwendung eines kryptografischen Hashs zur Überprüfung der Datensatzintegrität ein einfacher Ansatz für ein schweres Drawback.

Einige natürliche Erweiterungen hierfür umfassen die Verwendung dieser Methode zur Überprüfung von Modellgewichten oder sogar das Hashing von Quellcodeteilen, um sicherzustellen, dass die Vorverarbeitung related ist.

Ganz gleich, ob Sie über verteilte Open-Supply-Groups hinweg zusammenarbeiten, reproduzierbare Forschung aufbauen oder einfach nur einen Audit-Path zur Compliance erstellen, die Blockchain ist ein netter, unparteiischer Notar für Ihre Daten. Sie müssen der Infrastruktur nicht vertrauen; Sie müssen nur der Mathematik vertrauen.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert