本项目基于fabric1.4+IPFS+Intel SGX,进行创新设计,提供一种保护客户隐私的、可审 计的区块链文件存储系统(简称为:EFS)。
.
├── Chaincode
│ ├── zallDisk
│ └── zallDisk.go
├── client
│ ├── Html
│ │ ├── background.jpg
│ │ ├── css
│ │ │ ├── bootstrap.css
│ │ │ ├── bootstrap.css.map
│ │ │ ├── bootstrap-grid.css
│ │ │ ├── bootstrap-grid.css.map
│ │ │ ├── bootstrap-grid.min.css
│ │ │ ├── bootstrap-grid.min.css.map
│ │ │ ├── bootstrap.min.css
│ │ │ ├── bootstrap.min.css.map
│ │ │ ├── bootstrap-reboot.css
│ │ │ ├── bootstrap-reboot.css.map
│ │ │ ├── bootstrap-reboot.min.css
│ │ │ └── bootstrap-reboot.min.css.map
│ │ ├── index.html
│ │ └── js
│ │ ├── bootstrap.bundle.js
│ │ ├── bootstrap.bundle.js.map
│ │ ├── bootstrap.bundle.min.js
│ │ ├── bootstrap.bundle.min.js.map
│ │ ├── bootstrap.js
│ │ ├── bootstrap.js.map
│ │ ├── bootstrap.min.js
│ │ └── bootstrap.min.js.map
│ ├── httpclient.js
│ ├── LocalWebServer.js
│ ├── package-lock.json
│ └── sgx_protect_file
├── README.md
├── server
│ ├── bufferSplit.js
│ ├── chaincode.js
│ ├── httpserver.js
│ ├── ipfsApi.js
│ ├── package.json
│ ├── package-lock.json
│ ├── sgx_protect_file
│ ├── upload
│ │ ├── demo.txt
│ │ └── encrypted_example.txt
│ └── wallet
│ └── admin
│ ├── 50903b380f64b25831d5d82978cabf58b6baf741102d62fef9f85d650b099c0b-priv
│ ├── 50903b380f64b25831d5d82978cabf58b6baf741102d62fef9f85d650b099c0b-pub
│ └── admin
├── startFabric.sh
└── stopFabric.sh
$ sudo cp -r zallDiskSdk/ $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/zallDiskSDK/
$ cd $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/zallDiskSDK/
$ sudo cp -r zallDiskSdk/Chaincode/zallDisk $GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/Chaincode
$ cd /GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/zallDiskSDK/
$ sudo ./startFabric.sh
$ ipfs daemon
$ source /opt/intel/sgxsdk/environment
$ cd ./server
$ npm install
$ sudo node httpserver.js
-
请求处理过程:
-
接收加密文件,存储到./server/upload文件夹
-
启动Enclave,解密文件,并执行审计规则。
-
审计通过,会返回"Pass Audit"消息给客户端
-
审计未通过,会返回“Fail Audit”消息给客户端。
-
-
调用ipfsApi.js,add文件到IPFS网络,生成hash。
-
调用chaincode.js,调用链码。
-
如果用户存在,则上链:hash, filename, 用户名
-
如果用户不存在,先创建用户上链:用户名,再上链:hash, filename, 用户名 *
-
-
$ cd sgx_protected_file/
$ sudo make
$ sudo ./app decrypt -i encrypted_example.txt -u wuliangshun
$ cd client/
$ npm install
$ sudo node LocalWebServer.js
注意:前端与后端的交互尚未完成。可手动继续4-6,完成文件加密和上传
$ source /opt/intel/sgxsdk/environment
$ cd client/sgx-protected-file
$ sudo make
$ sudo ./app encrypt -i example.txt -u wuliangshun
$ cd ..
$ sudo node httpclient.js ../sgx-protected-file/encrypted_example.txt
https://dist.ipfs.io/#go-ipfs(需要翻墙)
如果网络没翻墙去github下载 地址https://github.com/ipfs/go-ipfs/releases
$ sudo tar xvfz go-ipfs.tar.gz
$ cd go-ipfs
$ sudo ./install.sh
$ sudo ipfs init
会生成提示,界面有一串哈希地址,通过
$ sudo ipfs cat $(FILE_HASH)
出现界面安装成功。
$ sudo git clone https://github.com/Kubuxu/go-ipfs-swarm-key-gen.git
(也可以通过go get 安装,但是go get经常失败)
$ sudo go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
$ sudo go build -o ipfs-swarm-key-gen go-ipfs-swarm-key-gen/ipfs-swarm-key-gen/main.go
$ sudo ./ipfs-swarm-key-gen > swarm.key
源码就是随机生成一个32位的随机数,然后用 hex.Encode 成一个 64 位 16进制数
将生成的秘钥复制到多主机的.ipfs(ipfs的)本地目录。
$ ipfs bootstrap rm all
"Addresses": {
"Swarm": [
"/ip4/0.0.0.0/tcp/4001", //0.0.0.0需要修改为当前主机的ip,通用192.168.1.11
"/ip6/::/tcp/4001"
],
"Announce": [],
"NoAnnounce": [],
"API": "/ip4/127.0.0.1/tcp/5001", //127.0.0.1需要修改为当前主机的ip,通用192.168.1.11
"Gateway": "/ip4/127.0.0.1/tcp/8080" //127.0.0.1需要修改为当前主机的ip,通用192.168.1.11
},
$ ipfs id
$ ipfs daemon
$ ipfs bootstrap add /ip4/被添加节点的ip地址/tcp/4001/ipfs/被添加节点的ID值
$ ipfs swarm peers
$ ipfs add $(FILE_PATH)
$ ipfs get $(FILE_HASH)
$ ipfs cat $(FILE_HASH)
安装运行WebUI:
$ git clone https://github.com/ipfs/webui
$ cd webui
$ npm install
Runs server on port 3000.
$ npm start
$ tar -C /usr/local -zxf go1.12.7.linux-amd64.tar.gz
$ vim /etc/profile
末端插入:
export PATH=$PATH:/usr/local/go/bin //goroot可执行文件路径
export GOROOT=/usr/local/go //goroot路径,安装路径
export GOPATH=$HOME/go //go项目启动路径
export PATH=$PATH:$HOME/go/bin //gopath可执行文件路径
$ source /etc/profile
$ go version
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce
$ systemctl start docker
$ systemctl enable docker
$ docker version
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ sudo service docker restart
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(没安装curl,输入命令行yum install -y curl安装)
$ cd /usr/local/bin/
会有一个docker-compose的文件,可以输入ls查看。
$ sudo chmod +x docker-compose
$ docker-compose version
$ mkdir -p go/src/github.com/hyperledger/
$ cd go/src/github.com/hyperledger/
$ git clone "https://github.com/hyperledger/fabric.git"
$ cd fabric/
$ git checkout release-1.4
这一步会下载官方的例子以及所需要的Docker镜像,下载是比较慢的,如果出现错误或者长时间没有速度只需要重新运行就可以了
$ sudo ./bootstrap.sh
此处说明,跟网络关系很大,二进制文件如果下载失败,去github上下载对应版本,源网址网站我今年尝试已经关闭了。如果上一步操作下载二进制文件太慢或者没速度,可以直接对源码进行编译,执行以下命令(前提是以上相关路径配置没有错误):如果失败,去github上下载对应二进制文件放到此文件夹下,要不然网络无法启动,因为缺少configtxgen configtxlator cryptogen 这些工具. 如果文件夹内有如下文件的话说明编译成功:configtxgen configtxlator cryptogen discover idemixgen orderer peer
$ cd ~/go/src/github.com/hyperledger/fabric/
$ make release
$ cd release/linux-amd64/bin
$ vim ~/.profile
$ export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric/release/linux-amd64/bin
$ source ~/.profile
$ cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/
$ ./byfn.sh up
--大概率失败,如果是干净容器第一次部署的机器成功很大,fabric受镜像版本影响很大,如果出错查看弹窗说明,百度搜索或者stackoverflow去搜索。
$ ./byfn.sh down
如果要开始其他网络必须执行此步,要不然环境不干净。
$ git clone https://github.com/occlum/linux-sgx.git
$ sudo apt-get install build-essential ocaml automake autoconf libtool wget python libssl-dev
$ sudo apt-get install libssl-dev libcurl4-openssl-dev protobuf-compiler libprotobuf-dev debhelper cmake
$ ./download_prebuilt.sh
$ make sdk
$ make psw
$ cd SampleCode/LocalAttestation
$ make SGX_MODE=SIM
$ ./app
$ cd server
$ npm install node-gyp
$ npm install node-pre-gyp
$ npm install grpc
$ npm install express -save
$ npm install ipfs-api
$ sudo npm install --registry=https://registry.npm.taobao.org --unsafe-perm=true --allow-root