📰 来源:Towards Data Science | 📅 翻译日期:2026年6月2日
🔗 原文:查看原文
🤖 翻译:DeepSeek AI · 仅供参考
在许多数据科学工作流中,团队通常需要访问一个完美同步且不可修改的共享数据集,例如在分布式机器学习环境中,多个团队依赖完全相同的特征集。
在本文中,我将介绍一种简单、免费的方法,对任意大小的数据集进行加密哈希处理,并将其哈希值不可变地存储在以太坊区块链上,从而为数据集的完整性创建永久且可验证的记录。
此方法同样适用于模型权重、需要一致应用的特定转换、源代码或其他需要不可变和可验证的数据。
🤔 为什么完整性很重要
如果你对数据科学实践有一定了解,你已经知道数据完整性的重要性。输入数据的微小变化或错误都可能导致项目崩溃。
现代机器学习模型对其训练数据极为敏感。缺失归一化步骤、修改的CSV文件、行顺序打乱、特征损坏或训练集与验证集不匹配,都可能产生截然不同的结果。
完整性故障难以检测,且常常导致项目偏离轨道。模型可能仍然看似正常运行或训练,但指标可能缓慢下降,偏差累积,或实验变得无法复现。当团队分布在不同的组织,需要处理同一问题的不同版本时,完整性尤其重要。
🔐 使用加密哈希作为“真相来源”
加密哈希为我们提供了一种简单且非常有用的机制来验证数据完整性。
加密哈希简要介绍:哈希函数接受任意数量的输入数据(字节),并确定性地产生固定长度的输出,称为哈希值或摘要。加密哈希是计算机科学的基础,你很可能已经了解。
关键点是确定性:
- 相同的数据输入 → 相同的哈希输出
- 即使输入数据中更改一个字节,也会产生完全不同的哈希值。
由于这一特性,哈希值充当数据的唯一指纹,非常适用于验证完整性。哈希函数有多种变体,其中一些更适合此任务,我将进行描述。
这如何应用于数据集?
由于哈希函数的确定性,一旦应用于数据集,我们就可以快速可靠地测试该数据集是否与我们期望的相同。
对于被多个团队、多家公司使用的大型数据集,从版本到版本迁移时,这一特性特别有价值。例如,研究组Alpha的团队1创建特征1-10,研究组Zeta的团队2创建特征10-100,系统X使用版本Y等。
我们不再需要质疑数据,只需计算数据集的哈希值并与参考点计算的哈希值进行比较。如果匹配,则正常;否则,发生了变化。
哈希非常高效。对 10MB 或 10TB 数据集运行哈希函数,能快速得到一个小巧的固定长度字符串,可共享、存储或发布。
🧐 为什么使用以太坊作为不可变存储?
这是本文真正有用的部分。
以太坊,如你所知,是一个区块链。它为我们提供了:
- 不可变性:交易永远不能被更改
- 分布式可用性:无需中心化权限即可访问
- 永久性:一旦写入,便永久可访问
但是,以太坊不是用于交易的吗?我们是否需要为此特殊目的编写复杂的智能合约?
你确实可以,但没必要。
巧妙之处在于利用以太坊交易中一个不常用的输入数据字段,有时称为“calldata”。
但是,以太坊交易需要花费真金白银(gas、费用等)?
这也是事实。在以太坊主网上,输入数据每个字节都需要支付“gas”。以 $2,000/ETH 的价格计算,每个哈希可能需要花费 $0.04 – $0.10。这还不包括区块验证器打包实际传输所需的gas,根据网络当前负载,这可能相当昂贵。
让我们变得更聪明些。🦊
通过将所有内容转移到“测试网”(每个区块链都普遍拥有),我们可以完全免费实现这一点。
Sepolia(以太坊测试网)除了智能合约开发者外很少被使用。Sepolia的ETH是免费的,可从水龙头公开获取。
这意味着我们可以在公开可访问的测试网(以太坊的Sepolia)上无限创建交易,而且免费!
只要我们的输入数据大小合理,Sepolia就提供了一种利用区块链进行无限数据存储的方法,且具有与主网大部分相同的特性*。
- Sepolia区块链并非永久存在,但通常可信任数年。如果需要绝对永久性,则需要使用主网付费。
记住,我们存储的不是实际数据,而只是指纹。
⚙️ 流程
首先,我们需要一种可靠地在以太坊上创建交易的方法。
尽管看似复杂,但实际上非常简单。我们不需要额外的软件或钱包技术。钱包不过是一对密钥:一个地址和一个用于签名的秘密。
创建以太坊交易时,我们使用所需的键和格式创建一个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:...(原文未提供完整代码,但翻译至此)
评论已关闭