Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

三方联合计算SCQL出现逻辑问题 #290

Open
JiPZou opened this issue May 24, 2024 · 12 comments
Open

三方联合计算SCQL出现逻辑问题 #290

JiPZou opened this issue May 24, 2024 · 12 comments
Assignees

Comments

@JiPZou
Copy link

JiPZou commented May 24, 2024

我们这边存在如下的业务场景:

存在两个数据方A和B,使用方C,购买了A和B的数据权限执行SCQL。

但是在实际的操作过程中,如果A方仅把数据授权给C方,B方也仅把数据授权给C方,在C方无法执行SCQL运算,会显示CCL的授权错误。

仅当将A方的数据授权给了B和C,B方的数据授权给了A和C的情况下,C方才能执行SCQL运算。

我想请问这是否存在一定的逻辑问题呢?为什么A方和B方,不需要互相使用数据,却需要互相授权才能在C方执行运算。

@tongke6
Copy link
Collaborator

tongke6 commented May 24, 2024

C 会有自己的数据参与运算吗?

@JiPZou
Copy link
Author

JiPZou commented May 24, 2024

C中没有数据,他只是被A和B分别授权了数据,它使用A和B的数据进行计算

@tongke6
Copy link
Collaborator

tongke6 commented May 24, 2024

你使用的是 SCQL 哪种部署模式呀? p2p 还是 中心化的 SCDB ?

@JiPZou
Copy link
Author

JiPZou commented May 24, 2024

中心化的方式

@Chrisdehe Chrisdehe assigned tongke6 and unassigned jingshi-ant May 27, 2024
@jingshi-ant
Copy link
Collaborator

能否提供下具体的query(注意脱敏),以及CCL授权信息,报错信息。以帮助我们进一步确认问题?

@JiPZou
Copy link
Author

JiPZou commented May 29, 2024

具体的实例是这样的:
注:下述2代表参与方B,3代表参与方A,1代表参与方C
首先:
A和B分别使用如下指令将自身数据库内容授权给C:
grant select PLAINTEXT_AFTER_GROUP_BY(zzdmc), select PLAINTEXT_AFTER_AGGREGATE(hznl),select PLAINTEXT_AFTER_COMPARE(hzxbmc),select PLAINTEXT_AFTER_COMPARE(hzxbdm),select PLAINTEXT_AFTER_COMPARE(abo_xxmc),select PLAINTEXT_AFTER_COMPARE(zzddm),select PLAINTEXT_AFTER_COMPARE(abo_xxdm) on feddb.cardiac_surgery_set1 to 1;

grant select PLAINTEXT_AFTER_GROUP_BY(zzdmc), select PLAINTEXT_AFTER_AGGREGATE(hznl),select PLAINTEXT_AFTER_COMPARE(hzxbmc),select PLAINTEXT_AFTER_COMPARE(hzxbdm),select PLAINTEXT_AFTER_COMPARE(abo_xxmc),select PLAINTEXT_AFTER_COMPARE(zzddm),select PLAINTEXT_AFTER_COMPARE(abo_xxdm) on feddb.cardiac_surgery_set2 to 1;

此时,在C方执行下述代码:
SELECT zzdmc AS '诊断', MAX(hznl) AS '最大年龄', MIN(hznl) AS '最小年龄', AVG(hznl) AS '平均年龄', COUNT(*) AS '患者人数', (SUM(CASE WHEN hzxbdm = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) AS '男性患者占比', (SUM(CASE WHEN hzxbdm = 2 OR hzxbdm = 9 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) AS '女性患者占比' FROM ( SELECT zzddm, zzdmc, hznl, abo_xxmc, abo_xxdm, hzxbmc, hzxbdm FROM feddb.cardiac_surgery_set2 WHERE abo_xxmc IN ('1','2') AND zzddm in ('1','2','3','4','5') UNION ALL SELECT zzddm, zzdmc, hznl, abo_xxmc, abo_xxdm, hzxbmc, hzxbdm FROM feddb.cardiac_surgery_set1 WHERE abo_xxmc IN ('1','2') AND zzddm in ('1','2','3','4','5') ) AS combined GROUP BY zzdmc;

出现如下报错:
failed to submit FATE job: failed to check union ccl: ccl of child 0 is ({ccl level: 1->PLAINTEXT_AFTER_GROUP_BY,2->PLAINTEXT,3->UNKNOWN,}) ccl of child 0 is ({ccl level: 1->PLAINTEXT_AFTER_GROUP_BY,2->UNKNOWN,3->PLAINTEXT,})

但是如果此时,A将数据授权给B:
grant select PLAINTEXT_AFTER_GROUP_BY(zzdmc), select PLAINTEXT_AFTER_AGGREGATE(hznl),select PLAINTEXT_AFTER_COMPARE(hzxbmc),select PLAINTEXT_AFTER_COMPARE(hzxbdm),select PLAINTEXT_AFTER_COMPARE(abo_xxmc),select PLAINTEXT_AFTER_COMPARE(zzddm),select PLAINTEXT_AFTER_COMPARE(abo_xxdm) on feddb.cardiac_surgery_set1 to 2;
B将数据授权给A:
grant select PLAINTEXT_AFTER_GROUP_BY(zzdmc), select PLAINTEXT_AFTER_AGGREGATE(hznl),select PLAINTEXT_AFTER_COMPARE(hzxbmc),select PLAINTEXT_AFTER_COMPARE(hzxbdm),select PLAINTEXT_AFTER_COMPARE(abo_xxmc),select PLAINTEXT_AFTER_COMPARE(zzddm),select PLAINTEXT_AFTER_COMPARE(abo_xxdm) on feddb.cardiac_surgery_set2 to 3;

此时C再次执行上述sql查询,即可得到结果。

@jingshi-ant
Copy link
Collaborator

这里的报错和UNION有关,因为UNION ALL了A/B的数据,在代码实现上增加了UNION后的数据对所有参与方不为UNKNOWN的要求,因此报错了。
另:可以尝试下,A给B、B给A都设置ENCRYPTED_ONLY绕过校验试试(后面可能别的推导环节也会卡住。。)

@JiPZou
Copy link
Author

JiPZou commented May 29, 2024

我们稍后试一下,这样去做,但是这样的逻辑感觉还是不太对的样子。

为什么在代码实现上增加了UNION后的数据对所有参与方不为UNKNOWN的要求,这个仅针对计算方不行吗?因为只有计算方能拿到数据呀。

此外,这部分校验的代码的位置在哪里呢?

@jingshi-ant
Copy link
Collaborator

仅针对计算方也会报错,因为A对B或B对A在UNION后也是UNKNOWN。
当然,CCL的校验规则比较保守,也存在比直觉更严格的情况,如果场景合理后续迭代可以优化。
出错的位置:

childCCLStr := "failed to check union ccl: "

@JiPZou
Copy link
Author

JiPZou commented May 29, 2024

好的,后续我们这边再测试一下

@JiPZou
Copy link
Author

JiPZou commented Jun 6, 2024

您好,请问一下,咱们scql的执行过程中,是否使用SPU进行隐私计算,是根据CCL判断的吗?如果去掉了CCL判断,是不是默认就是明文的方式进行计算了。

@tongke6
Copy link
Collaborator

tongke6 commented Jun 6, 2024

SCQL 密态引擎包含了 SPU 和 HEU,密态相关的计算会委托给 SPU 和 HEU 进行。

CCL 是做 Query 之前行的约束校验的,不过当前的实现和密态图的翻译有点耦合。是否可以明文计算,或者 reveal 成明文,其实上是根据参与运算的数据属于哪个参与方决定的,以及算子的结果是否是降维的,比如 aggregate 操作。如果没有 CCL,应该全部在密态下执行。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants