源码安装
1.1 环境准备
PaddleDTX 使用 golang 进行开发,当您使用源码进行编译和安装时,首先需要准备源码以及编译的环境:
- 系统环境,推荐使用Linux或MacOS操作系统
- golang编译器,推荐版本1.13+ 点击下载安装golang
- git源码下载工具 点击下载安装git
- make编译工具
- ubuntu:
$ sudo apt-get install -y make
- centos:
$ sudo yum install -y make
- macOS:
通过iTunes下载安装xcode
- ubuntu:
1.2 源码编译
-
下载源码:
-
编译XuperDB
编译产出为 output 文件夹,内容为:
-
编译Distributed AI
编译产出为 output 文件夹,内容为:
-
编译xchain区块链合约:
编译产出为 paddlempc 合约文件,为安装在xchain 区块链上的合约文件。
-
准备fabric链码:
$ cp ./testdata/blockchain/fabric/chaincode/go.mod ./dai/blockchain/fabric/chaincode $ cd ./dai/blockchain/fabric/chaincode $ go mod vendor
产出为fabric链码安装所需的依赖库。
1.3 网络部署
-
部署区块链网络
PaddleDTX 使用区块链网络支撑计算层和去中心化存储网络,底层依赖可以使用同一个区块链网络。
这里以 xchain 为例介绍区块链网络部署具体步骤。Fabric网络搭建,可参考Fabric网络部署。
PaddleDTX使用百度超级链 xchain v3.9 作为底层区块链网络,可参考 XuperChain环境部署 来搭建区块链网络。
您需要了解如何创建合约账户、部署智能合约,详细参考 部署 native 合约 ,更多内容请参考XuperChain官方文档 。
合约安装过程如下:# 定义合约账户和合约名称 $ export contractAccount='1234567890123456' $ export contractName='paddlempc' # 创建区块链账户,并转 token $ ./xchain-cli account newkeys --strength 1 -o ukeys $ export address=`cat ./ukeys/address` $ ./xchain-cli transfer --to $address --amount 1000000000000 # 创建区块链合约账户,并转 token $ ./xchain-cli account new --account $contractAccount --fee 1000 --keys ./ukeys # 给合约账户转 token $ ./xchain-cli transfer --to XC${contractAccount}@xuper --amount 100000000000 --keys ./ukeys # 安装合约 $ ./xchain-cli native deploy --account XC${contractAccount}@xuper --runtime go -a '{"creator":"XC${contractAccount}@xuper"}' --cname $contractName ./$contractName --fee 19267894 --keys ./ukeys # 查询合约安装的状态 $ ./xchain-cli contract query $contractName
-
部署 XuperDB
每一个 XuperDB 的节点都有一对公私钥,用来标识节点的账户,公私钥可以通过如下XuperDB的客户端命令进行获取:
请妥善保存您创建的公私钥对,在后续的配置及命令行使用时您将会频繁的用到它。
XuperDB 包含两种类型的节点服务,数据持有节点和存储节点,我们需要分别启动这两种服务。为了方便,我们这里两种类型的服务分别启动一个。 首先进入到 xdb 的编译产出 output 文件中:
-
启动数据存储节点
修改配置文件,修改内容如下:
# vim conf/config-storage.toml # type = "storage" [storage] name = "storageNode1" # 修改服务监听端口及对外服务地址 listenAddress = ":8122" publicAddress = "127.0.0.1:8122" # genkey创建的私钥 keyPath = "./keys" [storage.blockchain] type = "xchain" [storage.blockchain.xchain] # 助记词为用户部署区块链网络后,安装合约过程中创建的区块链账户,取值./ukeys/mnemonic mnemonic = "充 雄 孔 坝 低 狠 争 短 摸 拜 晨 造" contractName = "paddlempc" contractAccount = "XC1234567890123456@xuper" chainAddress = "127.0.0.1:37101" chainName = "xuper" [storage.blockchain.fabric] configFile = "./config/fabric/config.yaml" channelId = "mychannel" chaincode = "mycc" userName = "Admin" orgName = "org1" [storage.prover] localRoot = "/root/xdb/data/prove" [storage.mode] type = "local" [storage.mode.local] rootPath = "/root/xdb/data/slices" [storage.mode.ipfs] hosts = [ "127.0.0.1:5001", "127.0.0.1:5002" ] timeout = 5000 [storage.monitor] challengingSwitch = "on" nodemaintainerSwitch = "on" fileclearInterval = 24 [log] level = "debug" path = "./logs"
其中,listenAddress和publicAddress 指定服务监听的地址及对外暴露的地址,blockchain配置中指定了使用区块链网络部署时创建的账户助记词、合约账户及合约名,storage.mode定义了存储节点采取的存储方式,支持本地文件系统和ipfs方式。
启动服务:
-
启动数据持有节点
修改配置文件,修改内容如下:
# vim conf/config-dataowner.toml # type = "dataOwner" [dataOwner] name = "dataOwnerNode1" # 修改服务监听端口及对外服务地址 listenAddress = ":8121" publicAddress = "127.0.0.1:8121" # 是否允许跨域访问 allowCros = false # genkey创建的私钥 keyPath = "./keys" [dataOwner.slicer] type = "simpleSlicer" [dataOwner.slicer.simpleSlicer] blockSize = 4194304 queueSize = 4 [dataOwner.encryptor] type = "softEncryptor" [dataOwner.encryptor.softEncryptor] password = "abcdefg" [dataOwner.challenger] type = "merkle" [dataOwner.challenger.pairing] maxIndexNum = 5 sk = "Fudm9gDXNlEdCkieMid1WHIHd9K/M/CctBPlF/4y+AU=" pk = "B60Vdoq4SVUpVRZf1FM7ImRXo/22q0ZjYMHlaB4HgUXMSsu+2iCrNkk3gROXOUDvB8zWMcBGCnBCAnb6N9WOaBPbKkYWnp/iodp0+GFWvW1DCnAYNV2+vdaFkHaezsqeDqRDsdqV2uG47PTE2xdkljSblWNgKhsHYp7LgCcbBWiMO3TcrzUdq+ETxfIu1Bi7AzSHHAj8oc7toGT0anrO9LPSDcde8rCdsptX5CLH7WvRF0AXrqhX4Mr7i+547qI3" randu = "NA1xy6JCWWc8IB4x1CM4DCoxKTqEele6zqD8kCfuj5s=" randv = "TV0J8YFWEsybwFdwm3DJvUHXx88YXkzK97Zpvj/tyGc=" [dataOwner.challenger.merkle] leveldbRoot = "./challenger" shrinkSize = 500 segmentSize = 5 [dataOwner.blockchain] type = "xchain" [dataOwner.blockchain.xchain] # 助记词为用户部署区块链网络后,安装合约过程中创建的区块链账户,取值./ukeys/mnemonic mnemonic = "充 雄 孔 坝 低 狠 争 短 摸 拜 晨 造" contractName = "paddlempc" contractAccount = "XC1234567890123456@xuper" chainAddress = "127.0.0.1:37101" chainName = "xuper" [dataOwner.blockchain.fabric] configFile = "./config/fabric/config.yaml" channelId = "mychannel" chaincode = "mycc" userName = "Admin" orgName = "org1" [dataOwner.copier] type = "random-copier" [dataOwner.monitor] challengingSwitch = "on" filemaintainerSwitch = "on" filemigrateInterval = 6 [log] level = "debug" path = "./logs"
其中,listenAddress和publicAddress 指定服务监听的地址及对外暴露的地址,blockchain配置中使用区块链网络部署时创建的账户助记词、合约账户及合约名。
启动服务:
注意:一般构建 PaddleDTX 网络至少需要两方参与,对应两个计算任务执行节点,每个任务执行节点可以从一个或多个数据持有节点获取数据,这里为了说明方便启动一个数据持有节点,您也可以根据实际需求自行启动多个数据存储节点和数据持有节点;配置中的keyPath参数为节点的身份,不同keyPath即对应了不同的身份。
-
查看服务状态: 使用 xdb-cli 客户端执行如下命令,请求数据持有节点查看存储节点的在线状态:
-
-
部署Distributed AI
一般多方安全计算至少由两个任务执行节点,所以这里部署两个任务执行节点。 每一个 任务执行节点 都有一对公私钥,用来标识节点的账户,公私钥可以通过如下executor-cli的客户端命令进行获取:
请妥善保存您创建的公私钥对,在后续的配置及命令行使用时您将会频繁的用到它。
注意: 任务发布后时,任务执行节点会向数据持有节点发起文件授权申请,数据持有节点可通过或拒绝样本文件授权申请。 当前开源的多元线性回归、多元逻辑回归算法支持两个任务执行节点,神经网络算法需要三个任务执行节点,如果需要使用神经网络,请部署3个任务执行节点。
-
准备两个任务执行节点的配置
需要分别修改对应的conf/config.toml文件:# executor1 listenAddress = ":8184" publicAddress = "127.0.0.1:8184" #定义PaddleFL运行所需的容器地址 paddleFLAddress = "paddlefl-env1:38302" paddleFLRole = 0 # genkey创建的私钥 keyPath = "./keys" # 是否启动http server [executor.httpserver] switch = "on" httpPort = ":8013" allowCros = false [executor.storage] # 定义模型存储的路径 localModelStoragePath = "./models" # 定义模型评估结果的存储路径 localEvaluationStoragePath = "./evalus" # 定义预测结果存储的方式,默认本地存储,如果用户采取XuperDB方式存储,则需提前生成数据持有节点客户端./ukeys并授权,同时创建预测结果存储的命名空间 type = 'Local' [executor.storage.XuperDB] host = "http://127.0.0.1:8121" keyPath = "./ukeys" namespace = "mpc" [executor.storage.Local] localPredictStoragePath = "./predictions" [executor.blockchain] [executor.blockchain.xchain] # 助记词为用户部署区块链网络后,安装合约过程中创建的区块链账户,取值./ukeys/mnemonic mnemonic = "充 雄 孔 坝 低 狠 争 短 摸 拜 晨 造" contractName = "paddlempc" contractAccount = "XC1234567890123456@xuper" chainAddress = "127.0.0.1:37101" chainName = "xuper"
# executor2 listenAddress = ":8185" publicAddress = "127.0.0.1:8185" #定义PaddleFL运行所需的容器地址 paddleFLAddress = "paddlefl-env1:38303" paddleFLRole = 2 # genkey创建的私钥 keyPath = "./keys" # 是否启动http server [executor.httpserver] switch = "on" httpPort = ":8014" allowCros = false [executor.storage] # 定义模型存储的路径 localModelStoragePath = "./models" # 定义模型评估结果的存储路径 localEvaluationStoragePath = "./evalus" # 定义预测结果存储的方式,默认本地存储,如果用户采取XuperDB方式存储,则需提前生成数据持有节点客户端./ukeys并授权,同时创建预测结果存储的命名空间 type = 'Local' [executor.storage.XuperDB] host = "http://127.0.0.1:8121" keyPath = "./ukeys" namespace = "mpc" [executor.storage.Local] localPredictStoragePath = "./predictions" [executor.blockchain] [executor.blockchain.xchain] # 助记词为用户部署区块链网络后,安装合约过程中创建的区块链账户,取值./ukeys/mnemonic mnemonic = "充 雄 孔 坝 低 狠 争 短 摸 拜 晨 造" contractName = "paddlempc" contractAccount = "XC1234567890123456@xuper" chainAddress = "127.0.0.1:37101" chainName = "xuper"
-
启动服务
分别在对应文件夹下执行如下命令,启动任务执行节点:
通过命令查看有两个 executor 的进程,则启动成功:
-
1.4 客户端操作
步骤3为用户演示了源码安装区块链网络、去中心化存储网络(1个数据持有节点、1个数据存储节点)、Distributed AI(2个任务执行节点)流程,成功启动之后,可参考 客户端工具 操作您的网络。