Закажи экспресс-аудит своего дела онлайн всего за 199 ₽
и получи рекомендации по улучшению - Жми сюда !

Обеспечение целостности данных с помощью криптографического хеширования и блокчейна Ethereum.

Применение примитивов блокчейна для версионирования, отслеживания происхождения и обеспечения целостности наборов данных.

Делиться

a81f7bcefbbe3f2801657ef2768804cd
Изображение предоставлено fabio через Unsplash.

Во многих рабочих процессах в области анализа данных командам часто необходим доступ к общему набору данных, который остается идеально синхронизированным и не может быть изменен , например, в распределенных средах машинного обучения, где несколько команд используют один и тот же набор признаков.

В этой статье я расскажу о простом и бесплатном методе криптографического хеширования набора данных любого размера и неизменяемого хранения его хеша в блокчейне Ethereum , создавая постоянную и проверяемую запись о целостности набора данных.

Этот метод также можно легко расширить на веса моделей, специфические преобразования, которые необходимо применять согласованным образом, исходный код или другие данные, которые должны быть неизменяемыми и проверяемыми.

🤔Почему важна честность

Если вы хотя бы немного знакомы с наукой о данных как с практикой, вы уже знаете о важности целостности данных. Даже небольшие изменения или ошибки во входных данных могут привести к краху проекта.

Современные модели машинного обучения чрезвычайно чувствительны к своим обучающим данным. Отсутствие этапов нормализации, измененный CSV-файл, перемешанные строки, поврежденные признаки или несоответствия между обучающим и проверочным наборами данных могут привести к совершенно разным результатам.

Нарушения целостности системы трудно обнаружить, и они часто приводят к сбоям в работе.

Модели могут по-прежнему казаться нормально функционирующими или обучаться, но показатели могут постепенно ухудшаться, накапливаться отклонения, или эксперименты могут стать невоспроизводимыми. Целостность данных вдвойне важна, когда команда распределена, возможно, по разным организациям, и ей необходимо работать над разными версиями одной и той же проблемы.

🔐Использование криптографического хеша в качестве «источника истины»

Криптографический хеш предоставляет нам простой и очень полезный механизм для проверки целостности данных.

Краткое введение в криптографические хеши

Хэш-функция принимает любое количество входных данных (байтов) и детерминированно выдает результат фиксированной длины, известный как хэш или дайджест. Криптографические хеши являются основополагающими в информатике, как вы, вероятно, уже знаете.

Ключевым моментом является детерминизм:

Одни и те же данные на входе → одинаковый результат хеширования

Даже изменение всего одного байта во входных данных приводит к совершенно другому хешу.

Благодаря этому свойству хеши выступают в качестве уникальных отпечатков пальцев для данных и чрезвычайно полезны для проверки целостности. Существует множество разновидностей хеш-функций, и некоторые из них более полезны для этой задачи, как я опишу далее.

Как это применимо к наборам данных?

Благодаря детерминированности хеш-функции, после ее применения к набору данных мы можем быстро и надежно проверить, соответствует ли этот набор данных нашим ожиданиям.

Это особенно ценно при работе с большими наборами данных, используемыми несколькими командами, несколькими компаниями, при переходе от одной версии к другой. Команда 1 в исследовательской группе Alpha создает признаки 1-10, команда 2 в исследовательской группе Zeta создает признаки 10-100, система X использует версию Y и т. д.

Нам больше не нужно подвергать сомнению данные, достаточно просто вычислить хеш-функцию для набора данных и сравнить ее с хешем, вычисленным в контрольной точке. Если совпадает, значит, все в порядке. Если нет, значит, что-то изменилось.

Хэширование чрезвычайно эффективно. Применение хэш-функции к набору данных размером 10 МБ или 10 ТБ быстро позволяет получить небольшую строку фиксированного размера, которую можно передавать, хранить или публиковать.

🧐 Почему стоит использовать Ethereum в качестве неизменяемого хранилища?

Это действительно полезная часть данной статьи.

Как вы уже знаете, Ethereum — это блокчейн. Это дает нам следующее:

  1. Неизменяемость : транзакция никогда не может быть изменена.
  2. Распределенная доступность : постоянная доступность без централизованного управления.
  3. Постоянный : однажды написанный текст становится постоянно доступным.

Но ведь Ethereum предназначен для транзакций? Разве для этой специализированной цели не нужно написать сложный смарт-контракт?

В принципе, можно. Но в этом нет необходимости.

Хитрость заключается в использовании этого редко применяемого поля input data в транзакции Ethereum, которое иногда называют «данными вызова».

Но ведь транзакции в Ethereum стоят реальных денег (газ, комиссии и т. д.) ?

Это тоже правда. В сети Ethereum за каждый байт входных данных взимается «газ». В основной сети, при цене 2000 долларов за ETH, это может обойтись нам от 0,04 до 0,10 долларов за хеш. Это не включает газ, необходимый для фактической передачи данных валидатором блока, который может быть значительным в зависимости от текущей нагрузки сети.

Давайте сделаем это умнее. 🦊

Перенеся все операции в «тестовую сеть», которая обычно есть у каждого блокчейна, мы можем сделать это совершенно бесплатным .

Сеполия (тестовая сеть ETH) используется редко, за исключением разработчиков смарт-контрактов. Сеполия ETH бесплатна и доступна для использования в кранах.

Это означает, что мы можем создавать бесконечное количество транзакций в общедоступной тестовой сети (называемой Sepolia для Ethereum) совершенно бесплатно!

Если размер входных данных является разумным, Sepolia предоставляет возможность использовать блокчейн для бесконечного хранения данных , обладая в основном теми же свойствами, что и основная сеть*.

* Блокчейны Sepolia не являются постоянными, но в большинстве случаев им можно доверять в течение нескольких лет. Если вам нужна абсолютная постоянность, вам придется заплатить за это, используя основную сеть.

Помните, что мы не храним сами данные в блокчейне. Только отпечаток.

⚙️Процесс

Во-первых, нам нужен способ надёжного создания транзакций в сети Ethereum.

Несмотря на кажущуюся сложность, на самом деле это чрезвычайно просто. Нам не требуется никакого дополнительного программного обеспечения или технологий кошелька. Кошелек — это всего лишь ключ, соединенный с секретным ключом, используемым для его подписи.

Для создания транзакции Ethereum мы создаём объект Python с необходимыми ключами и форматом, кодируем его нашим ключом и отправляем в сеть. Затем валидатор извлекает нашу транзакцию из «mempool» и включает её в блок.

Если мы включим все необходимые поля, и всё пройдёт проверку, то это станет неотъемлемой частью блокчейна примерно через 12 секунд.

Шаг 1: Создайте ключ и секрет с помощью web3.py всего несколькими строками кода.

 from eth_account import Account account = Account.create() print("Address:", account.address) print("Private Key:", account.key.hex())

Шаг 2: Получите немного ETH на Sepolia. Введите свой адрес здесь и подождите 12 секунд. Спасибо, Google!

Шаг 3: Хэширование набора данных

Как я уже упоминал, существуют хеш-функции, которые лучше подходят для этого процесса. Мы могли бы использовать хеш SHA256, но Blake2b на самом деле лучше с точки зрения пропускной способности. В принципе, подойдет любая хеш-функция.

Используйте эту функцию для хеширования данных.

 import hashlib from pathlib import Path def hash_dataset(dataset, algorithm="blake2b", chunk_size=1024 * 1024): h = hashlib.new(algorithm) def update(obj): if isinstance(obj, (str, Path)) and Path(obj).exists(): with open(obj, "rb") as f: while chunk := f.read(chunk_size): h.update(chunk) elif isinstance(obj, bytes): h.update(obj) elif isinstance(obj, str): h.update(obj.encode("utf-8")) elif isinstance(obj, dict): for k in sorted(obj.keys()): update(k) update(obj[k]) elif isinstance(obj, (list, tuple)): for item in obj: update(item) elif isinstance(obj, set): try: for item in sorted(obj): update(item) except TypeError: for item in sorted(obj, key=str): update(item) elif hasattr(obj, "__iter__"): for item in obj: update(item) else: h.update(repr(obj).encode("utf-8")) update(dataset) return h.hexdigest() digest = hash_dataset("hugedataset.parquet", algorithm="blake2b")

Шаг 4: Запишите, подпишите и опубликуйте транзакцию, используя хеш нашего набора данных.

Используя библиотеку web3.py , мы можем структурировать нашу транзакцию в виде словаря Python, а затем опубликовать её в сети.

Нам нужен провайдер для трансляции нашей транзакции (у нас нет узла). Здесь мы используем Infura, но есть и другие, например, Alchemy.

Обратите внимание, что мы добавляем нулевой бит «0x» к хешу, вычисленному на основе нашего набора данных. Нам нужно удалить его при проверке хеша.

 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.address, # self-send (no contract required) "value": 0, # no ETH transfer "gas": 50_000, "maxFeePerGas": w3.to_wei("20", "gwei"), "maxPriorityFeePerGas": w3.to_wei("2", "gwei"), "nonce": w3.eth.get_transaction_count(account.address), "chainId": 11155111, # Sepolia testnet "data": dataset_hash }

Подпишите и отправьте. Здесь мы ждем завершения сделки.

 signed_tx = account.sign_transaction(tx) tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) print("Broadcast tx hash:", tx_hash.hex()) # Wait for mining / inclusion in a block tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print("Transaction mined in block:", tx_receipt["blockNumber"]) print("Status:", tx_receipt["status"])

Обязательно сохраните идентификатор транзакции.

Шаг 5: Создайте запись метаданных для хранения вместе с нашим набором данных.

Здесь мы создаём простой фрагмент метаданных, который может храниться в базе данных (DynamoDB, MongoDB) или непосредственно рядом с нашим объектом данных (S3, Google Cloud Storage).

Метаданные могут выглядеть примерно так:

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

Шаг 6: При каждом чтении набора данных проверяйте, совпадает ли хеш с исходным хешем, хранящимся вместе с нашими данными.

Заключительный этап процесса включает в себя три действия:

  1. Получить транзакцию Ethereum
  2. Извлеките хэш набора данных из данных вызова.
  3. Сравните это с локально пересчитанным хешем.
 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["input"] onchain_hash = raw_input.hex() if hasattr(raw_input, 'hex') else str(raw_input).lower() computed_hash = "0x" + hash_dataset(dataset_path).lower() if computed_hash != onchain_hash: raise ValueError(f"Integrity FAILED: Local {computed_hash} != On-chain {onchain_hash}") print("Integrity check PASSED. Dataset matches the blockchain record.") return True

Вот и все!

Важно отметить , что это не мешает никому перезаписывать наш объект метаданных. Однако существует множество способов предотвратить изменение небольшого фрагмента метаданных внутри системы, например, с помощью баз данных аудита или блокировки объектов S3.

Подводя итоги

В конечном счете, использование криптографического хеша для проверки целостности набора данных — это легковесный подход к сложной задаче.

Естественными расширениями этого подхода могут служить такие методы, как проверка весов модели или даже хеширование фрагментов исходного кода для обеспечения релевантности предварительной обработки.

Независимо от того, сотрудничаете ли вы в распределенных командах разработчиков открытого программного обеспечения, проводите воспроизводимые исследования или просто создаете аудиторский след для соблюдения нормативных требований, блокчейн — это удобный и беспристрастный нотариус для ваших данных. Вам не нужно доверять инфраструктуре; вам нужно доверять только математическим расчетам.

Сэм Блэк. Посмотреть все материалы от Сэма Блэка.

Источник: towardsdatascience.com

✅ Найденные теги: Данных, Криптографического, новости, Обеспечение, Помощью, Целостности

Добавить комментарий

Новости других рубрик

Архив рубрики ~Обо всем~: Dell XPS 13 (2026) против MacBook Neo: я сравнил оба бюджетных ноутбука, вот какой из них я бы купил. Архив рубрики ~Обо всем~: Sony объявила дату выхода и цены на новейшие аксессуары для PlayStation. Архив рубрики ~Обо всем~: Компания OpenAI представляет созданных с помощью ИИ питомцев для своего приложения Codex. Архив рубрики ~Обо всем~: Алкоголь во внутриутробном периоде связали с рискованным поведением в 16 лет. Статистику собирали в Великобритании Архив рубрики ~Обо всем~: Кооперативные шутеры про нежить, великолепный экшен в стиле hack-and-slash и другие новые инди-игры, которые стоит попробовать. Архив рубрики ~Обо всем~: Билет в будущее: фестиваль профессий биоэкономики на ВДНХ: Биология Архив рубрики ~Обо всем~: Чернокожие основатели компаний привлекли наибольшую сумму квартального финансирования с 2022 года, но есть один нюанс. Архив рубрики ~Обо всем~: Митохондрии контролируют работу иммунных клеток и эффективность иммунотерапии