区块链 | 水印:A Blockchain-based System for Secure Image Protection Using Zero-watermark(三)

🍍原文: A Blockchain-based System for Secure Image Protection Using Zero-watermark

🍍写在前面: 原文是一篇 2020 年的 CCF-C,它对传统的零水印技术进行了改进,并与区块链应用结合了起来。



Contract Design

在智能合约设计方面,我们确保合约仅可供 I O \mathsf{IO} IO 及其授权的 I U \mathsf{IU} IU 使用,同时要求 S C \mathsf{SC} SC 始终保持其内容私密。为此,我们在 S C \mathsf{SC} SC 中建立了一个授权用户集合,仅允许该集合内的用户调用 S C \mathsf{SC} SC。此外,为了降低 S C \mathsf{SC} SC 的使用成本,并防止不必要的循环和栈操作,我们实施了一个简单的反向关键词索引机制。

I O \mathsf{IO} IO 是图像所有者, I U \mathsf{IU} IU 是图像使用者, S C \mathsf{SC} SC 特指图像存档合约。

在本节中,我们将关注本文所使用的 S C \mathsf{SC} SC 的接口和逻辑,这些代码是用支持图灵完备性的以太坊 S o l i d i t y \mathsf{Solidity} Solidity 编程语言编写的。



1 图像存档合约

此合约由 I O \mathsf{IO} IO 发行,主要功能是存储图像数据,因此名为 I m a g e   D e p o s i t o r y   C o n t r a c t \mathsf{Image\ Depository\ Contract} Image Depository Contract 图像存档合约。

该合约在系统的启动阶段被创建,创建时设定了三个主要变量:

  • o w n e r \mathsf{owner} owner:地址类型,用于保存 I O \mathsf{IO} IO 的以太坊账户地址;
  • a u t h o r i z e d   u s e r \mathsf{authorized\ user} authorized user:映射类型,用于将授权用户的地址映射到布尔值,以表明其访问权限;
  • k e y \mathsf{key} key:映射类型,用于存储密钥 K e y \mathsf{Key} Key 及其相关信息的映射。授权用户可以通过合约提供的接口来访问该映射集合。

原文中这三个变量的名字都是大写字母,我看起来太难受就改成小写了😇

合约的主要接口如下:

  • addUser:只有 I O \mathsf{IO} IO 可以执行此接口。每当 I U \mathsf{IU} IU I O \mathsf{IO} IO 发送注册请求时, I O \mathsf{IO} IO 在验证 I U \mathsf{IU} IU 的身份后,将其地址添加到 a u t h o r i z e d   u s e r \mathsf{authorized\ user} authorized user 映射集合中。
  • removeUser:只有 I O \mathsf{IO} IO 可以执行此接口,负责从授权列表中移除用户。
  • addKey:只有 I O \mathsf{IO} IO 可以执行此接口。在 I O \mathsf{IO} IO 将新图像上传到 IPFS 之前,首先启动零水印算法,然后将 K e y \mathsf{Key} Key 和相关交易哈希 T X H \mathsf{TXH} TXH 传递到接口,以添加到 k e y \mathsf{key} key 集合中。
  • deleteKey:当 I O \mathsf{IO} IO 想要删除某个图像文件 F \mathsf{F} F 时,可以使用此接口从 k e y \mathsf{key} key 集合中删除相应的信息。
  • Search:只有 I O \mathsf{IO} IO a u t h o r i z e d   u s e r \mathsf{authorized\ user} authorized user 集合中的地址可以执行此功能,即通过相关信息获取相应的 K e y \mathsf{Key} Key 密钥。
  • Withdraw I O \mathsf{IO} IO I U \mathsf{IU} IU 支付的费用中提取图像存档合约的余额,以执行后续的图像验证合约。

注意区分变量 k e y \mathsf{key} key 和密钥 K e y \mathsf{Key} Key,二者不可混为一谈😇



2 图像验证合约

在以太坊的智能合约中,日志 l o g \mathsf{log} log 事件成为获取异常数量 u n u s u a l   q u a n t i t y \mathsf{unusual\ quantity} unusual quantity 函数返回值的唯一途径。自然而然,由 Search 函数产生的搜索结果,也只能通过图像存档合约中的相关事件来获取。然而,这种方法存在安全隐患,因为如果用户 I U \mathsf{IU} IU 直接依赖事件来获取搜索结果,那么这些信息将暴露给公众。这是因为以太坊事件是公开可查的,任何人都可以通过监听事件来访问这些信息,这显然与我们对信息保密性的要求相冲突。

为了解决这一问题,我们采用了合约调用的策略。具体来说,用户 I U \mathsf{IU} IU 部署一个新的智能合约,该合约专门用于调用图像存档合约中的 Search 功能,并将检索到的搜索结果进行存储。通过这种方式,只有 I U \mathsf{IU} IU 能够访问和查看这些搜索结果,从而确保了信息的安全性和私密性。我们为这个新的智能合约起了一个名字 —— I m a g e   V a l i d a t i o n   C o n t r a c t \mathsf{ Image\ Validation\ Contract} Image Validation Contract 图像验证合约。

在合约初始化过程中,定义了三个关键变量:

  • o w n e r \mathsf{owner} owner:地址类型,用来记录发起合约的 I U \mathsf{IU} IU 的以太坊账户地址;
  • c o n t r a c t   a d d r \mathsf{contract\ addr} contract addr:地址类型,为了使图像验证合约能够调用图像存档合约的搜索功能,必须将图像存档合约的地址保存在此变量中;
  • r e s u l t \mathsf{result} result:该变量是一个结构化的集合,旨在存储调用 Search 函数后返回的结果。

合约的主要接口如下:

  • deposit I U \mathsf{IU} IU 使用此接口向智能合约的余额中存入以太币,用于支付调用图像存档合约中 Search 功能的费用。
  • Search:只有 I U \mathsf{IU} IU 可以调用该接口。使得 I U \mathsf{IU} IU 能够间接调用图像存档合约的 Search 功能,并且将搜索结果记录在 r e s u l t \mathsf{result} result 集合中。
  • getResult:这是一个只读接口,只有 I U \mathsf{IU} IU 可以调用该接口。“只读” 意味着该接口不会改变区块链的状态,调用记录也不会被记录在链上。通过这个接口, I U \mathsf{IU} IU 能够获取到通过 Search 接口记录的返回值。这种设计的优势在于,除了合约的创建者 I U \mathsf{IU} IU 之外,其他人都无法看到搜索的过程和结果,从而有效保障了秘钥 K e y \mathsf{Key} Key 的隐私安全。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值