跳到主要内容

隐私计算

1. 摘要

BRC412(Bubi Request for Comments 第412号协议)即隐私计算协议,是区块链领域一项标准协议,用于隐私计算业务结合区块链技术交互过程。通过BPP协议,各方可以安全地进行数据流转与任务协作,确保在共享价值的同时,充分保护数据隐私不被泄露。此外,该协议还具备完善的权限管理功能,确保数据访问与使用均在严格的权限控制之下进行,进一步增强了数据的安全性。

2. 动机

基于该标准协议,用户可以轻松在区块链上迅速构建起隐私计算业务的智能合约,从而加速隐私计算业务的部署与实施。这一目标的实现,不仅提升了业务开展的效率,更为数据隐私保护提供了坚实的保障。

3. 原理

隐私计算应用场景较为复杂,具体有一下俩种情况导致:

  • 一是因隐私计算实现方法较为驳杂,如全同态加密就包括BGV(Brakerski-Gentry-Vaikuntanathan)、BFV(Brakerski-Fan-Vercauteren)、GHSE(Gentry-Halevi Smart Encapsulation)等多种方式,所以实现过程难以统一;

  • 二是因目前目前隐私计算尚处于探索阶段,各开发组织多数根据自身接触场景及对应隐私计算理解进行定义,缺乏普适性。而BPP协议则旨在规范一套标准的隐私计算数据协作协议。

隐私计算需解决如下问题:

  • 参与者权限控制: 隐私计算主要用于数据协作安全性保证,即参与方间数据可用不可见,同时未授权用户无法参与、操作。
  • 成员间数据基础数据一致:成员间彼此基础数据需一致,才可保证各成员平等的应用或甄选彼此暴露的信息,同时后加入节点也应获取完整共享数据才能进行正常业务。
  • 任务协作方责权利可追溯:参与者有权允许或拒绝其他参与方对其信息的使用,但也许保证其参与协作数据的真实性,并可提供三方监督。

隐私计算业务场景可按作用划分为俩个场景:

  • 数据公示: 数据公示场景常用于各参与节点数据同步,如新加入节点的发现、新增数据源在各参与节点同步等
  • 数据协作:即指隐私计算任务需要所选参与者共同协作,只有所选参与者有资格协作或拒绝,其他节点无权参与的场景。

为兼容上述场景及问题,本协议包括权限管理子协议、数据协作子协议、任务流转子协议。其关系如图:

image-20240402201349813

  • 权限管理子协议:其主要用于管理员对与参与节点的管理,获得授权的参与节点才可以在数据公示、数据协作等场景进行操作。
  • 数据公示子协议:该协议主要共享数据的公示,用户可通过该协议将需要其他节点展示的数据进行发布。参与方也可通过解析该协议同步其他用户公示信息,帮助滞后参与节点快速同步信息。其主要应用功能包括新节点加入、数据源同步等。
  • 数据协作子协议:该协议主要用于隐私计算任务的发布,及与参与节点的协作。任务发布会在协议中指定参与者,指定参与者可通过投票方式参与隐私计算的流转中。主要用于多方安全计算、联邦建模等任务处理过程中。

4. 规范

​ bubi 智能合约由 JavaScript 语言实现, 包含初始化函数 init 和两个入口函数 main、query 。init 函数用于合约创建时初始化; main 函数主要负责数据写入,query 函数负责数据查询。

​ 根据上述BRC412协议设计,其包含权限管理子协议、数据协作子协议、任务流转子协议三个子协议,下面将分别对这三个子协议的属性、功能函数等进行详细介绍。

4.1. 权限管理子协议规范

描述:权限管理子协议主要通过区块链方式帮助管理员对参与成员进行准入及权限管理,并对数据公示、数据协作操作进行控制,保证隐私计算安全环境。

​ 下列为管理员即管理者对新参与节点权限管理及信息同步场景进行描述,其中智能合约(权限管理)遵循权限管理子协议,智能合约(数据公示)遵循数据公示子协议,参与者为隐私计算已参与的节点。

image-20240702170427374

属性

变量描述
admins管理员列表
participants参与者列表

功能函数

approve[required]

参与者地址集合录入函数,管理员通过该方法可以动态录入新增参与者地址,保证新增参与者可以正常开展隐私计算业务。

注意事项:

  • 只能被管理员列表调用,及admins
  • **触发事件:**Approve

调用示例:

{
"method":"approve",
"params":{
"participants":["adxSgELwiJkbfhV8fnwtef7joqQ6MkCTHs1jp"]
}
}

调用示例参数说明:

参数类型描述
participantsArray必填,参与方集合
revoke[required]

参与这地址集合剔除函数,参与者退出后,管理员通过该方法可以动态删除参与者地址,被剔除参与者则不能继续正常开展隐私计算业务。

注意事项:

  • 只能被管理员列表调用,即admins集合中的成员
  • **触发事件:**Revoke

调用示例:

{
"method":"revoke",
"params":{
"participants":["adxSgELwiJkbfhV8fnwtef7joqQ6MkCTHs1jp"]
}
}

调用示例参数说明:

参数类型描述
participantsArray必填,吊销集合,即待吊销参与者地址集合
authorize[optional]

参与者权限管理函数,管理员可通过该函数为参与者账户动态设置操作权限,默认为全量(即参与者可执行数据公示、数据协作所有方法),也可通过该方法精确控制可执行函数。

注意事项:

  • 只能被管理员列表调用,即admins集合中的成员
  • 参数address中的地址必须被包含于participants, 即其必须为参与者
  • **触发事件:**Authorize

调用示例:

{
"method":"authorize",
"params":{
"address": "adxSgELwiJkbfhV8fnwtef7joqQ6MkCTHs1jp",
"authorizes":["addition","updateData"]
}
}

调用示例参数说明:

参数类型描述
addressaddress必填,待授权地址
authorizesArray授权信息
allowable[required]

权限调用执行验证接口,其他合约或者用户可通过该函数,获取当前执行地址是否有权限调用执行方法。其通过需满足如下条件:

注意事项:

  • 需满足当前执行地址在参与者列表中(participants)
  • 满足当前执行函数/权限,已被管理员授权

调用示例:

{
"method":"allowable",
"params":{
"address": "adxSgELwiJkbfhV8fnwtef7joqQ6MkCTHs1jp",
"operation":"updateData"
}
}

调用示例参数说明:

参数类型描述
addressaddress必填,权限查询地址
operationArray待查询权限

响应数据:

{
"result":true
}
permissionsInfo[optional]

权限信息查询接口,用户可通过该函数或者指定地址的授权详情信息。

调用示例:

{
"method":"permissionsInfo",
"params":{
"address": "adxSgELwiJkbfhV8fnwtef7joqQ6MkCTHs1jp"
}
}

调用示例参数说明:

参数类型描述
addressaddress必填,待查询地址

响应数据:

{
"authorizes":["addition","updateData"]
}

事件

Approve[required]

参与者地址集合录入时,需要触发该事件。

tlog('Approve', sender, participants);

事件参数:

参数类型描述
ApproveStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
participantsString函数录入参与者集合字符串

Revoke[required]

参与者地址被吊销时,需要触发该事件。

tlog('Revoke', sender, participants);

事件参数:

参数类型描述
RevokeStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
participantsString函数吊销集合字符串

Authorize[required]

参与者授权时,需要触发该事件。

tlog('Authorize', sender, address, authorizes);

事件参数:

参数类型描述
AuthorizeStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
addressaddress被授权地址
authorizesString权限集合字符串

合约入口

init
function init(input_str){
}

创建合约时候,触发合约 init 入口函数,传递 JSON 参数格式如下:

{
"params":{
"admins":["adxSdFW4QySCA9zbH2AjDZ1fz6gXfrUKjzJ33"],
"participants":["adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshko","adxSdFW4QySCA9zbH2AjDZ1fz6gXfrUKjzJ33"]
}
}
  • admins: 管理地址,该属性可以对权限管理合约参数进行管理,如添加业务参与地址,删除参与地址等
  • participants: 参数方地址集合,该集合中地址允许操作数据公示合约、数据协作合约相关方法。

入口函数的返回值:true或者抛异常

main

主要通过该函数调用协议方法,该方法一般需要消耗gas

function main(jsonParams){
const { method, params } = JSON.parse(jsonParams);
let funcList = {
'approve': approve,
'revoke': revoke,
'authorize': authorize
};
funcList[method](params);
}
query

该调用该方法主要用于查询合约信息,一般不需要支付gas费用

function main(jsonParams){
const { method, params } = JSON.parse(jsonParams);
let funcList = {
'permissionsInfo': permissionsInfo,
'allowable': allowable
};
return JSON.stringify(funcList[method](params));
}

4.2. 数据公示子协议规范

描述:数据公示子协议,主要应用于新节点加入、数据源同步等数据公示场景,以区块链透明性对所有参与方数据公开,参与方可对公示信息进行链上解析,进而用于后续数据协作过程。

​ 下列以数据源发布并公示场景,做简要描述(数据发布方、数据同步方A、数据同步方B为 隐私计算网络中3个参与方,本例中数据发布方进行数据源录入操作,公示给数据同步方A、B,智能合约即数据公示子协议)其实现流程如下:

image-20240702170042035

属性

变量描述
authorizeAddresss授权合约地址
name当前合约名称
description合约功能描述
Prefix数据存储前缀

功能函数

addition[required]

公示数据创建函数,参与者可通过该函数公示己方待公开基础数据, 其他参与方可对metadatas进行解析,获取当前公示数据。

注意事项:

  • 调用者地址必须包含于参与者集合之内
  • 触发事件: Addition

调用示例:

{
"method":"addition",
"params":{
"id":"ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"name":"联邦建模数据源—001",
"status":"init",
"owner":"adxSdFW4QySCA9zbH2AjDZ1fz6gXfrUKjzJ33",
"data":{
"remark": "描述",
"roleInfo": "角色信息",
"createTime": 1713080123000,
"applyTimeOut": 1800,
"executTimeOut": 1800,
"resultRepietList": [
{
"roleInfo": "角色信息"
}
]
}
}
}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
nameString必填,公示数据名称
statusString必填,公示数据状态
ownerString必填,当前数据拥有者地址
dataString必填,公示数据业务参数,根据自身业务确定披露那些数据
updateData[required]

更新公示数据业务参数,即data部分数据调整

注意事项:

  • 该方法调用仅限数据创建者
  • **触发事件:**UpdateData

调用示例:

{
"method":"updateData",
"params":{
"id":"ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"data":{
"remark": "更新的备注信息",
}
}
}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
dataJSON必填,待修改数据json
updateStatus[required]

更新公示数据状态

注意事项:

  • 该方法调用仅限数据创建者
  • **触发事件:**UpdateData

调用示例:

{
"method":"updateStatus",
"params":{
"id":"ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"status": "del"
}
}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
statusString必填,待修改数据状态
allowable[required]

方法是否允许被调用, 主要用于判断管理权限为participants的方法是否允许被调用(需调用权限管理合约进行验证)

注意事项:

  • 该方法需调用[权限管理合约中allowable]

调用示例:

{
"method":"allowable",
"params":{
"sender": "adxSdFW4QySCA9zbH2AjDZ1fz6gXfrUKjzJ33",
"method": "addition"
}
}

调用示例参数说明:

参数类型描述
senderString必填,当前合约调用方
methodString必填,待验证函数权限名称

响应数据:

{
"result":true
}
queryData[required]

用于查看公示数据详细信息

调用示例:

{
"method":"queryData",
"params":{
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4"
}
}

调用示例参数说明:

参数类型描述
idString必填,待查询数据对应id

响应数据:

{
"id":"ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"name":"联邦建模数据源—001",
"status":"init",
"owner":"adxSdFW4QySCA9zbH2AjDZ1fz6gXfrUKjzJ33",
"data":{
"remark": "描述",
"roleInfo": "角色信息",
"createTime": 1713080123000,
"applyTimeOut": 1800,
"executTimeOut": 1800,
"resultRepietList": [
{
"roleInfo": "角色信息"
}
]
}
}

事件

Addition[required]

添加公示数据时,需要触发该事件。

tlog('Addition', sender, id, objStr);

事件参数:

参数类型描述
AdditionStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
idString录入数据唯一标识
objStrString当前录入数据jsonString

UpdateData[required]

当公示信息被更新时,需要触发该事件, 包含基础数据更新和状态更新。

tlog('UpdateData', sender, id, objStr);

事件参数:

参数类型描述
UpdateDataStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
idString更新数据唯一标识
objStrString当前更新数据jsonString

Authorize[required]

参与者授权时,需要触发该事件。

tlog('Authorize', sender, address, authorizes);

事件参数:

参数类型描述
AuthorizeStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
addressaddress被授权地址
authorizesString权限集合字符串

合约入口

init
function init(input_str){
}

创建合约时候,触发合约 init 入口函数,传递 JSON 参数格式如下:

{
"params":{
"authorizeAddress":"adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshko",
"name":"数据源公示",
"Prefix": "DATASOURCE_",
"description":"用于数据源基础信息公示"
}
}
  • 可参考当前协议属性

main

主要通过该函数调用协议方法,该方法一般需要消耗gas

function main(jsonParams){
const { method, params } = JSON.parse(jsonParams);
let funcList = {
'addition': addition,
'updateData': updateData,
'updateStatus': updateStatus
};
funcList[method](params);
}
query

该调用该方法主要用于查询合约信息,一般不需要支付gas费用

function main(jsonParams){
const { method, params } = JSON.parse(jsonParams);
let funcList = {
'queryData': queryData
};
return JSON.stringify(funcList[method](params));
}

4.3. 数据协作子协议规范

描述:数据协作主要用于隐私计算任务中各参与节点交互所遵循的协议。各参与节点有权通过或拒绝参与任务,并等所有参与方均投票通过后,在本地执行隐私计算。

​ 下面以联邦建模场景为例,进行简单说明(任务发起方作为任务发起节点,任务参与方A、B作为发起方所选择的参与方; 智能合约即数据协作协议实现合约),其交互流程如下图所示:

image-20240702170623120

属性

变量描述
authorizeAddresss授权合约地址
proposalDuration任务有效期,单位秒
name合约名称
description合约功能描述
Prefix数据存储前缀

功能函数

apply[required]

创建协同任务,及发起协同数据方需通过该函数,创建协同任务,其他选择参与方通过监听该合约metadatas,进行显示和参与。

注意事项:

  • 本功能管理权限为participants
  • 触发事件: Proposal_apply

调用示例:

{
"method": "apply",
"params": {
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"name":"协作任务名称",
"status": "init",
"dataSourceList": [
{
"userId":"a91a2de1-5ef8-4994-8ad9-15d7d4a0b254",
"dataSourceId": "aa68ece8-4df7-43cb-83e1-e6b654ee60f4",
"address": "adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshko",
},
{
"userId":"5a78cffb-038b-40a4-8260-5b63f0226403",
"datasourceId": "ca68ece8-4df7-43cb-83e1-e6b654ee60fb",
"address": "adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshsa",
}
],
"data": {
"remark": "描述",
"roleInfo": "角色信息",
"createTime": 1713080123000,
"applyTimeOut": 1800,
"executTimeOut": 1800
}
}
}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
nameString必填,协作任务名称
statusString必填,公示数据状态
dataSourceListList必填,协同数据源信息
dataSourceList.userIdString参与方唯一标识
dataSourceList.datasourceIdString数据源唯一标识
dataSourceList.addressString参与方上链地址
dataJson必填,系统任务基础内容
vote[required]

协同任务所邀请的参与方,可通过该函数确认是否加入,如果有任意一个参与节点拒绝,协同任务将失败。

注意事项:

  • 管理权限限于协同任务邀请方
  • 触发事件: Proposal_vote

调用示例:

{
"method": "vote",
"params":{
"id":"ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"userId": "a91a2de1-5ef8-4994-8ad9-15d7d4a0b254",
"vote": "agree"
}
}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
userIdString必填,当前投票参与者唯一标识
voteString必填,投票策略[agree, refuse]
updateStatus[required]

更新协同任务状态,如果协同任务过程中,发起方可将任务修改为失效等状态

注意事项:

  • 管理权限 仅限该数据创建者
  • 触发事件: Proposal_update

调用示例:

{
"method":"updateStatus",
"params":{
"id":"ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"status": "init"
}
}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
statusString必填,协同任务待更新状态
updateData[required]

更新协同任务基础数据,如果协同任务过程中,发起方可更新协同任务的基础数据

注意事项:

  • 管理权限 仅限该数据创建者
  • 触发事件: Proposal_update

调用示例:

{
"method": "updateData",
"params": {
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"data": {
"remark": "更新后的描述",
"applyTimeOut": 21000
},

}

调用示例参数说明:

参数类型描述
idString必填,当前场景数据唯一标识
dataString必填,协同任务待更新数据
addAuditData[optional]

上传审核数据,在隐私计算处理过程中,参与者可通过该函数将计算过程数据上传,便于后期审核和追溯

注意事项:

  • 管理权限 协同任务参与者
  • 触发事件: Proposal_update

调用示例:

{
"method": "addAuditData",
"params": {
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"auditData":"11f3d39624343acc3ac57b81f014b5013b640399cbeb054af8afcda177d8ec4f",
}
}

调用示例参数说明:

参数类型描述
idString必填,协作任务唯一标识
auditDataString必填,审计数据
allowable[required]

方法是否允许被调用, 主要用于判断管理权限为participants的方法是否允许被调用(需调用权限管理合约进行验证)

注意事项:

  • 该方法需调用[权限管理合约中allowable]

调用示例:

{
"method":"allowable",
"params":{
"sender": "adxSdFW4QySCA9zbH2AjDZ1fz6gXfrUKjzJ33",
"method": "addition"
}
}

调用示例参数说明:

参数类型描述
senderString必填,当前合约调用方
methodString必填,待验证函数权限名称

响应数据:

{
"result":true
}
getProposal[required]

用于查看协同任务详细信息

调用示例:

{
"method":"getProposal",
"params":{
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4"
}
}

调用示例参数说明:

参数类型描述
idString必填,待查询协同任务唯一标识

响应数据:

{
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"status": "init",
"dataSourceList": [
{
"userId":"a91a2de1-5ef8-4994-8ad9-15d7d4a0b254",
"dataSourceId": "aa68ece8-4df7-43cb-83e1-e6b654ee60f4",
"address": "adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshko",
},
{
"userId":"5a78cffb-038b-40a4-8260-5b63f0226403",
"datasourceId": "ca68ece8-4df7-43cb-83e1-e6b654ee60fb",
"address": "adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshsa",
}
],
"data": {
"name": "流程线名称",
"remark": "描述",
"roleInfo": "角色信息",
"createTime": 1713080123000,
"applyTimeOut": 1800,
"executTimeOut": 1800
}
}
getAuditData[optional]

用于查看协同任务各参与节点上传的计算过程审核数据

调用示例:

{
"method":"getAuditData",
"params":{
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4"
}
}

响应数据:

{
"id": "ba68ece8-4df7-43cb-83e1-e6b654ee60f4",
"auditDatas":[
"userId":"a91a2de1-5ef8-4994-8ad9-15d7d4a0b254",
"auditData":"11f3d39624343acc3ac57b81f014b5013b640399cbeb054af8afcda177d8ec4f"
],
}

事件

Proposal_apply[required]

添加公示数据时,需要触发该事件。

tlog('Proposal_apply', sender, id, objStr);

事件参数:

参数类型描述
Proposal_applyStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
idString录入数据唯一标识
objStrString当前录入数据jsonString

Proposal_vote[required]

添加公示数据时,需要触发该事件。

tlog('Proposal_vote', sender, id, vote);

事件参数:

参数类型描述
Proposal_voteStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
idString录入数据唯一标识
voteString投票结果

Proposal_update[required]

添加公示数据时,需要触发该事件。

tlog('Proposal_update', sender, id, data);

事件参数:

参数类型描述
Proposal_voteStringTlog的 topic 主题名称
senderString触发合约执行的源账户地址
idString录入数据唯一标识
dataString更新数据

合约入口

init
function init(input_str){
}

创建合约时候,触发合约 init 入口函数,传递 JSON 参数格式如下:

{
"params":{
"authorizeAddress":"adxSfvU4YD2kQ4e1CQfRm8drBew1Cs9rKshko"
"proposalDuration":604800,
"name":"可信计算任务同步",
"description":"用于可信计算任务场景数据协作"
"Prefix":"SMPC_"
}
}
main

主要通过该函数调用协议方法,该方法一般需要消耗gas

function main(jsonParams){
const { method, params } = JSON.parse(jsonParams);
let funcList = {
'creatieProposal': creatieProposal,
'vote': vote,
'updateStatus': updateStatus,
'updateData': updateData,
'addAuditData': addAuditData,
'updateStatus': updateStatus
};
funcList[method](params);
}
query

该调用该方法主要用于查询合约信息,一般不需要支付gas费用

function main(jsonParams){
const { method, params } = JSON.parse(jsonParams);
let funcList = {
'getProposal': getProposal,
'getAuditData': getAuditData
};
return JSON.stringify(funcList[method](params));
}