WeBankBlockchain-DDCMS-Docs 技术文档

什么是 WeBankBlockchain-DDCMS

DDCMS(Distributed Data Collaboration Management Solution)旨在多方协作场景中,面向数据管理需求,提供一套基于区块链的、安全可信、友好易用的分布式数据管理开源方案,服务于个人数据携带、企业间数据共享。各参与方围绕数据目录展开业务协作,使得各参与方能够快速、低成本的进行数据管理和共享、确保数据安全和隐私的同时,实现数据共享全流程可追溯、可监管、可审计。

DDCMS 角色介绍 在DDCMS中包括5中角色:数据归属方、数据提供方、数据使用方、数据见证方、系统运营方。

  • 数据归属方:在数据传输共享过程中,对数据使用方的数据请求进行数据授权,在数据提供方进行授权管理。

  • 数据提供方:对外提供数据目录服务,负责审核数据目录使用申请及核验用户授权。

  • 数据使用方:对数据归属者提供服务,并经过授权通过数据目录获取数据。

  • 数据见证方:负责对数据目录的全流程进行进行审核监管,不参与具体业务。

  • 系统运营方:负责对各参与方进行KYC,确保参与方可信可靠。

它们的关系见下图:

_images/roles.png

DDCMS功能概述

DDCMS包括三个功能模块:统一可信的数据目录管理、可追溯审计的数据传输过程管理、丰富安全的数据处理组件管理。当前仅开源统一可信的数据目录管理模块。

  • 统一可信的数据目录管理

提供统一的数据目录管理功能,所有操作均上链存证,确保数据目录可信,提升管理和运营效率,降低接入成本。

  • 可追溯审计的数据传输过程管理

每次数据的传输过程均会记录上链,确保数据流通的定量、定时、定场景,实现全流程可管理可追溯可监管审计。

  • 丰富安全的数据处理组件管理

提供对各种数据处理组件的管理能力,企业可按需接入和使用,避免二次开发、降低接入和使用成本

各子工程简介

DDCMS包含三个子工程:

  1. DDCMS-Contract

  2. DDCMS-Service

  3. DDCMS-Front

  • DDCMS-Contract

DDCMS-Contract是DDCMS的智能合约实现,对接入用户、业务、数据目录等提供链上审核及管理等能力。地址:

  • DDCMS-Service

DDCMS-Service是DDCMS的后端工程,采用JAVA编写,提供和DDCMS-Contract的交互能力及账户、业务、数据目录的管理能力。地址:

  • DDCMS-Front

DDCMS-Front是一个前端项目,采用React编写,提供可视化注册、登录、业务注册、审核、数据目录注册、审核、展示、查看及管理等功能。地址:

快速开始

DDCMS由三个子项目构成:DDCMS-Contract、DDCMS-Service、DDCMS-Front。

  • DDCMS-Contract:提供项目的智能合约,将会部署在FISCO BCOS上,它包含了数据目录管理、数据传输管理的留痕存证功能。

  • DDCMS-Service:项目的后台服务器,用于支持前端。

  • DDCMS-Front:项目的前端。

环境要求

依赖软件 说明 备注
FISCO BCOS 安装FISCO BCOS 3.0链及控制台/webase
Java >= JDK1.8 64bit
NodeJs >= 14
MySQL >= mysql-community-server5.7
Git 下载安装包需要使用Git

部署项目

作为系统运营方,按照以下顺序进行部署:

启动后,默认情况下,可以访问访问首页。

使用流程

为了快速体验流程,用户可以执行如下流程:

注册账户

可以使用“注册功能”,以数据提供方身份注册账户:

_images/register.png

注意,注册之后,还需要系统运营方进行审核。

审核账户

用户需要以系统运营方账户登陆,初始密码取决于后端的配置。默认账户和密码为admin、123456。

登陆后,会自动跳转到管理台,用户可以在这里看到对应的待审核账户:

_images/audit.png

创建业务

审核通过后,用户可以提供方机构身份登陆,创建一个新的业务:

_images/product.png

注册见证机构

用户要再注册两个见证机构,注册页面勾选“见证机构”:

_images/registerwitness.png

审核业务

用户现在可以以见证机构的账户登陆,登陆后自动跳转到管理台,随后可在“所有业务”中看到待申请的业务:

_images/productaudit.png

由于审核需要超过半数的见证机构投票,因此在两家见证机构的场景下,投票要两个机构都进行同意,才算审核通过。

创建数据目录

类似地,数据提供方可以注册数据目录:

_images/createschema.png

_images/createschema2.png

审核数据目录

同样,见证机构可以对数据目录进行审核。

_images/schemaaudit.png

由于审核需要超过半数的见证机构投票,因此在两家见证机构的场景下,投票要两个机构都进行同意,才算审核通过。

查看

数据产品审核通过后,即可在首页看到。

DDCMS-Contract

https://img.shields.io/badge/license-Apache%202-4EB1BA.svgLicense

DDCMS-Contract用于追踪DDCMS的使用过程,数据目录生命周期中的每一个关键环节均会在链上留痕、存证,保证系统的可追溯、可监管。 它由三个模块构成:AccountContract, ProductContract, DataSchemaContract,由系统运营方部署。

  • AccountContract: 负责账户管理,包括机构的注册、审核等功能。系统中的数据提供方、见证机构,均需要在AccountContract中注册并审核,才能使用DDCMS。系统运营方则会在部署合约时自动注册。

  • ProductContract: 负责业务管理,包括业务的创建、审核等功能。其中,业务的创建由数据提供方进行,其审核由见证方进行,当票数超过半数,即通过审核。

  • DataSchemaContract:负责数据目录管理,包括数据目录的创建、审核等。其中,数据目录的创建由数据提供方进行,其审核由见证方进行,当票数超过半数,即通过审核。

快速开始

从依赖关系来讲,依赖关系如下:DataSchemaContract->ProductContract->AccountContract.因此,部署顺序需要按照相反顺序,按照AccountContract->ProductContract->DataSchemaContract的顺序部署。

链准备

首先需要有一条FISCO BCOS链,如果没有,可以部署一个。FISCO BCOS支持Air版、Pro版、Max版,对应不同的能力和复杂性,具体部署方式可以参考链搭建文档

接下来需要和FISCO BCOS交互,可以使用控制台或者webase。

私钥准备

只有系统运营方可以部署合约,所以需要一个系统运营方私钥,可以使用webase或者控制台生成。以fisco bcos的控制台为例:

cd [控制台目录]
bash get_account.sh

执行后,在accounts目录会生成对应的pem文件;同时,控制台会打印出它对应的私钥原文。如用于生产,请妥善保存,不要泄露或丢失!

部署合约

然后,依次部署三个合约。

以控制台为例,首先需要以系统运营方身份来启动控制台:

cd [控制台目录]
bash start.sh [群组,默认group0] -pem xxxx.pem

先将contracts目录下的合约拷贝到控制台contracts/solidity目录下,以系统运营方身份启动控制台后执行部署:

[group0]: /apps> deploy AccountContract
transaction hash: 0xade6832deb8f9641009336b955a3637bffbbc4fc9ffadb8a9de03ab6200f6093
contract address: 0x59fc2d7bbbb013ac9fc74a4c79bd25fdce02cba2
currentAccount: 0xcbe29631c0933c4319694dafc50723093f0de937

[group0]: /apps> deploy ProductContract 0x59fc2d7bbbb013ac9fc74a4c79bd25fdce02cba2
transaction hash: 0xefcc3503414490eb28dff330b9d42701bd1359f1fc784014f109ba16212fbfac
contract address: 0x24829babadbdc5fe4205353f6a2a6a79e7eef6a5
currentAccount: 0xcbe29631c0933c4319694dafc50723093f0de937

[group0]: /apps> deploy DataSchemaContract 0x59fc2d7bbbb013ac9fc74a4c79bd25fdce02cba2 0x24829babadbdc5fe4205353f6a2a6a79e7eef6a5
transaction hash: 0x27c43f0ca480a5f349205b2dcad6cc045ce4636ee4e41fbddfebb68b60104625
contract address: 0xa085baa5914e1d082c94ce24baf49473caa33ff1
currentAccount: 0xcbe29631c0933c4319694dafc50723093f0de937

其中:

  • ProductContract部署参数为AccountContract地址,请替换为实际的地址

  • DataSchemaContract部署参数分别为AccountContract地址和ProductContract地址,请替换为实际的地址

DDCMS-Service

https://img.shields.io/badge/license-Apache%202-4EB1BA.svgLicense

DDCMS-Service由系统运营方部署,它负责接收前端传来的请求。从功能而言,它承担了用户管理、业务管理、数据目录管理等功能。

快速开始

克隆代码

git clone https://github.com/WeBankBlockchain/DDCMS-Service.git
cd DDCMS-Service
git checkout origin/dev

编译

在DDCMS-Service项目根目录下执行

bash ./gradlew bootJar

这条指令会将代码编译成springboot jar包,该jar包位于dist目录。

链配置

由于后端服务需要访问区块链,因此需要先配置链信息,包括证书、sdk配置,这些信息可以直接从sdk里拷贝。

首先拷贝控制台里的证书到DDCMS-Service工程的conf目录下:

cp [控制台目录]/conf/* dist/conf

数据库初始化

进入数据库,依次执行resources目录下的数据库脚本:

  • src/main/resources/scripts/db-script.sql

服务配置

编辑dist/conf/application.yml,按照下面的模板进行配置,其中打了${}的需要自己配置。

server:
  port: 10880

spring:
  mvc:
    async:
      request-timeout: 500
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  datasource:
    url: ${数据库连接}
    username: ${数据库用户名}
    password: ${数据库密码}
    driverClassName: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    defaultAutoCommit: false
    initialSize: 25
    maxActive: 128
    maxIdle: 50
    minIdle: 25
    testOnBorrow: false
    testOnReturn: false
    testWhileIdle: true
    validationQuery: SELECT 1
    timeBetweenEvictionRunsMillis: 34000
    minEvictableIdleTimeMillis: 34000
    removeAbandoned: false
    logAbandoned: true
    removeAbandonedTimeout: 54
    maxWait: 10000
    poolPreparedStatements: false
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

mybatis:
  typeAliasesPackage: com.webank.databrain.dao.entity
  configuration:
    map-underscore-to-camel-case: true

jwt:
  secret: ${jwt secret}
  expiration: 8640000

system:
  bcos-cfg: "conf/config.toml"
  bcos-group-id: "group0"
  crypto-type: 0
  admin-account: ${系统运营方账户}
  admin-password: ${系统运营方密码}
  admin-private-key: ${见证方私钥,例如0x11afa82f974469792aa0172931b813d4fc7dd9177f3211779efc5f955d5e480f}
  admin-company: '系统运营方'
  contractConfig:
    account-contract: ${账户合约地址}
    product-contract: ${业务合约地址}
    dataSchema-contract: ${数据目录合约地址}
  fileConfig:
    file-dir: "tmp"
swagger:
  enabled: true



auth:
  permitAllApiList:
    - /api/account/register
    - /api/account/pageQueryCompany
    - /api/account/queryCompanyByUsername
    - /api/account/queryPersonByUsername
    - /api/account/queryCompanyByAccountId
    - /api/account/getHotCompanies
    - /api/account/searchCompany
    - /api/account/searchPerson
    - /api/schema/pageQuerySchema
    - /api/schema/querySchemaById
    - /api/schema/querySchemaAccessById
    - /api/file/download
    - /api/file/upload
    - /api/product/getHotProducts
    - /api/product/pageQueryProduct
    - /api/product/queryProductById
    - /api/tag/getHotTags
    - /v2/api-docs
    - /configuration/**
    - /swagger*/**
    - /webjars/**
    - /csrf
    - /
  anonymousApi: /api/account/login
  roleAuth:
    companyAuth:
      - /api/product/createProduct
      - /api/schema/createSchema
      - /api/product/updateProduct
    witnessAuth:
      - /api/product/approveProduct
    adminAuth:
      - /api/account/approveAccount

需要自己配置的属性包括:

  • spring.datasource.url: 数据库连接url。示例: jdbc:mysql://localhost:3306/databrain?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true

  • spring.datasource.username:数据库用户名。

  • spring.datasource.password:数据库密码

  • system.admin-account:系统运营方登陆账户名。示例:admin

  • system.admin-password:系统运营方登陆密码。示例:admin

  • system.admin-private-key:系统运营方私钥 。注意带上双引号,示例”0x11afa82f974469792aa0172931b813d4fc7dd9177f3211779efc5f955d5e480f”。

  • system.contractConfig.account-contract:账户合约地址。注意带上双引号,例如”0x1e0171e2f59d00a1851c5f8ca8af1b208f52627b”。

  • system.contractConfig.product-contract:业务合约地址。注意带上双引号,例如”0x2f45c1aac14531d8bd3269d7d2c9ffc342798dcb”。

  • system.contractConfig.dataSchema-contract:业务合约地址。注意带上双引号,注意带上双引号,例如”0xb426ac2d4436c051ae71a149621c76620733ede3”。

  • jwt.secret: 用于支持jwt,是一个base64的字符串,例如“Ok2Q0AZiRTT1N6CJ3q8ZvQOk2Q0AZiRTT1N6CJ3q8ZvQOk2Q0AZiRTT1N6CJ3q8ZvQOk2Q0AZiRTT1N6CJ3q8ZvQOk2Q0AZiRTT1N6CJ3q8ZvQ”

启动

在DDCMS-Service项目根目录下执行

cd dist
bash start.sh

这条指令会编译代码成springboot jar包,并执行。您可以检查nohup.out,如果出现类似字样表示启动成功:

...
2023-06-08 17:25:26.884  INFO 7287 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 10880 (http) with context path ''
2023-06-08 17:25:26.890  INFO 7287 --- [           main] com.webank.ddcms.DDCMSApplication        : Started DDCMSApplication in 4.754 seconds (JVM running for 5.115)

DDCMS-Front

https://img.shields.io/badge/license-Apache%202-4EB1BA.svgLicense

DDCMS-Front为前端操作页面,各个角色均需通过它来使用DDCMS。它包含两个核心功能:数据浏览、数据关联。

  • 数据浏览:当进入首页后,或者点击左上角DDCMS图标,可以浏览已通过审核的数据目录和对应的产品。

  • 数据管理:当登陆后,用户可以点击右上角的按钮,进入管理台页面,在里面将会根据不同的角色,展示不同的功能,例如:数据提供方可以创建业务、数据目录;系统运营方可以查看、审核注册请求;数据见证方可以查看、投票数据目录及归属业务。

快速开始

克隆代码

git clone https://github.com/WeBankBlockchain/DDCMS-Front.git
cd DDCMS-Front
git checkout origin/dev

修改配置

创建.env(可以参考.env.example)中,将REACT_APP_SERVER_API修改为DDCMS-Service启动后的api地址,例如:

REACT_APP_SERVER_API=http://localhost:10880/api/

更新依赖:

yarn

启动:

yarn start

然后用户可以访问 进行体验。