三方联合计算SCQL出现逻辑问题
我们这边存在如下的业务场景:
存在两个数据方A和B,使用方C,购买了A和B的数据权限执行SCQL。
但是在实际的操作过程中,如果A方仅把数据授权给C方,B方也仅把数据授权给C方,在C方无法执行SCQL运算,会显示CCL的授权错误。
仅当将A方的数据授权给了B和C,B方的数据授权给了A和C的情况下,C方才能执行SCQL运算。
我想请问这是否存在一定的逻辑问题呢?为什么A方和B方,不需要互相使用数据,却需要互相授权才能在C方执行运算。
C 会有自己的数据参与运算吗?
C中没有数据,他只是被A和B分别授权了数据,它使用A和B的数据进行计算
你使用的是 SCQL 哪种部署模式呀? p2p 还是 中心化的 SCDB ?
中心化的方式
能否提供下具体的query(注意脱敏),以及CCL授权信息,报错信息。以帮助我们进一步确认问题?
具体的实例是这样的:
注:下述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查询,即可得到结果。
这里的报错和UNION有关,因为UNION ALL了A/B的数据,在代码实现上增加了UNION后的数据对所有参与方不为UNKNOWN的要求,因此报错了。 另:可以尝试下,A给B、B给A都设置ENCRYPTED_ONLY绕过校验试试(后面可能别的推导环节也会卡住。。)
我们稍后试一下,这样去做,但是这样的逻辑感觉还是不太对的样子。
为什么在代码实现上增加了UNION后的数据对所有参与方不为UNKNOWN的要求,这个仅针对计算方不行吗?因为只有计算方能拿到数据呀。
此外,这部分校验的代码的位置在哪里呢?
仅针对计算方也会报错,因为A对B或B对A在UNION后也是UNKNOWN。 当然,CCL的校验规则比较保守,也存在比直觉更严格的情况,如果场景合理后续迭代可以优化。 出错的位置:https://github.com/secretflow/scql/blob/9cbd51534e9dbb2c1cdb4709a5fbc03963bceeed/pkg/interpreter/translator/build_ccl.go#L489
好的,后续我们这边再测试一下
您好,请问一下,咱们scql的执行过程中,是否使用SPU进行隐私计算,是根据CCL判断的吗?如果去掉了CCL判断,是不是默认就是明文的方式进行计算了。
SCQL 密态引擎包含了 SPU 和 HEU,密态相关的计算会委托给 SPU 和 HEU 进行。
CCL 是做 Query 之前行的约束校验的,不过当前的实现和密态图的翻译有点耦合。是否可以明文计算,或者 reveal 成明文,其实上是根据参与运算的数据属于哪个参与方决定的,以及算子的结果是否是降维的,比如 aggregate 操作。如果没有 CCL,应该全部在密态下执行。