🍍原文: 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 的隐私安全。