5. 文件上链

  IPFS(InterPlanetary File System,星际文件系统)是一种使网络更快、更安全、更开放的点对点超媒体协议。SDChain集成IPFS,提供了文件存储的服务,使用SDChain提供的服务可以直接将文件上链。文件的链上存储和下载需向提供存储功能的SDChain节点支付一定的SDA作为服务费用。

5.1 使用方法

1. 文件上链

(1) 上传文件
  通过HTTP POST将文件上传至SDChain节点服务器。返回信息如下:

{
    "files": [{
        "name": "下载.jpg",
        "content_type": "image/jpeg",
        "md5": "66a673346f862ae5dbcdeef65cd8413b",
        "size": "8924",
        "id": "QmcxLNgqS3R4eVkBYGHdcHVbLH6Y3v182iy3vUGd6xXWwF"
    }],
    "charge_account": "69r6EF9DhBRn85VDphqFuY5qUJ9EfjRc81",
    "storage_fee": "10",
    "download_fee": "11"
}
字段名称 类型 描述
name string 文件名
content_type string 文件类型
md5 string MD5值
size string 文件大小,单位:bytes
id string 上传后文件的标识号
charge_account string 存储节点收费地址
storage_fee string 文件上链费率,单位:bytes/drops
download_fee string 链上文件下载费率,单位:bytes/drops


(2) 文件上链
  根据文件上传后返回的文件信息,向存储节点收费地址(charge_account)发起支付交易,交易金额不少于(size+storage_fee-1)/storage_fee,MemoData填入文件信息(Json格式)HEX编码后的字符串,MemoType设置为"FileUpload"HEX编码后的字符串。交易成功后,即实现了文件的上链。具体可参考:1.7 文件上链接口 - 上传文件信息接口。

2. 链上文件下载

  SDChain提供了在线签名和离线签名两种下载方式。离线签名先在本地(不联网状态)根据signature算法生成签名,再联网提交签名下载。在线签名下载是直接在联网的状态下提交私钥交易。建议使用离线签名下载的方式,以保障您私钥的安全。

(1) 支付费用获取下载信息
  根据文件上传后返回的文件信息,向存储节点收费地址(charge_account)发起支付交易,交易金额值不小于(size+download_fee-1)/download_fee,MemoData填入文件信息(Json格式)HEX编码后的字符串,MemoType设置为"FileUpload"HEX编码后的字符串。返回的文件下载信息中包含password字段,为SDChain生成的一次性下载密码(HEX编码后的字符串),时效1小时(需在1小时内发起下载交易)。具体可参考:1.7 文件上链接口 - 付费获取下载信息接口。

(2) 文件下载
  根据下载信息中的交易哈希和下载密码,发起文件下载的交易即可下载链上的文件。具体可参考:1.7 文件上链接口 - 签名下载。

5.2 部署搭建

  在SDChain应用节点部署IPFS,通过配置可实现文件上链环境的搭建,具体步骤如下:

1. 安装go

· 下载go安装包。版本:1.10+
· 在/usr/local目录下安装go

tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz

在~/.bashrc和/etc/profile两个文件中设置环境变量

export GOPATH=/root/go
export GOROOT=/usr/local/go
export PATH=$PATH:SGOROOT/bin:$GOPATH/bin

配置完成后,输入命令:

go env

查看对应的GOPATH和GOROOT值是否与配置一致:

root:-/go/bin# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOPROXY=** 
GOROOT="/usr/local/go"

查看go版本信息:

root:~/go/bin# go version 
go version gol.11.2 linux/amd64


2. 安装并启动IPFS

(1) 安装IPFS

root:~# go get -u -d github.com/ipfs/go-ipfs
root:~# cd $GOPATH/src/github.com/ipfs/go-ipfs
root:~# make install

编译完成后,查看IPFS版本:

root:~/go/src/github.com/ipfs/go-ipfs# ipfs version
ipfs version 0.4.19-dev

按照预期输出版本号,则表示安装成功。

(2) 启动IPFS

初始化IPFS节点:

root:~/go/src/github.com/ipfs/go-ipfs# ipfs init
initializing IPFS node at /root/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmYdaaECj2eXbBt9tUgjstGx6vNtxVjZVJ3v93BqDXzDK6
to get started, enter:
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

IPFS默认节点存储空间为10G,对应~/.ipfs/config文件中StorageMax值(可更改)。

启动服务:

root:~/go/src/github.com/ipfs/go-ipfs# ipfs daemon


3. 一键部署

上述两步(“安装go”和“安装并启动IPFS”)可运行如下shell脚本一键部署。
shell脚本内容如下:

#!/bin/sh
sudo apt-get install golang
echo "export GOPATH=/root/go" >> ~/.bashrc
echo "export GOROOT=/usr/local/go" >> ~/.bashrc
echo "export PATH=$PATH:SGOROOT/bin:$GOPATH/bin" >> ~/.bashrc
echo "export GOPATH=/root/go" >> /etc/profile
echo "export GOROOT=/usr/local/go" >> /etc/profile
echo "export PATH=$PATH:SGOROOT/bin:$GOPATH/bin" >> /etc/profile

go get -u -d github.com/ipfs/go-ipfs
cd $GOPATH/src/github.com/ipfs/go-ipfs
make install
ipfs init > ipfs.log
ipfs daemon


4. 添加配置至SDChain节点配置文件

在SDChain-core.cfg文件中,添加:

[IPFS]
account_id=69r6EF9DhBRn85VDphqFuY5qUJ9EfjRc81       //上传和下载时收取费率的账号
storage_fee=10      //上传文件收取的费率值,单位为bytes/drops
download_fee=11     //下载文件收取的费率值,单位为bytes/drops


5. 搭建文件服务器

搭建文件服务器,用于存放上传的临时文件。下载压缩包后,解压。执行以下命令,完成文件服务器的搭建:

chmod +x npm-node-nginx-org.sh
source npm-node-nginx-org.sh

文件上传后返回以下Json格式的文件信息:

{
    "files": [{
        "name": "下载.jpg",
        "content_type": "image/jpeg",
        "md5": "66a673346f862ae5dbcdeef65cd8413b",
        "size": "8924",
        "id": "QmcxLNgqS3R4eVkBYGHdcHVbLH6Y3v182iy3vUGd6xXWwF"
    }],
    "charge_account": "69r6EF9DhBRn85VDphqFuY5qUJ9EfjRc81",
    "storage_fee": "10",
    "download_fee": "11"
}

其中id为IPFS文件的标识号,可通过interface-js-ipfs-coreipfs.addFromFs(path, {onlyHash : true});方法获取。节点存储相关的账号和费用信息可从SDChain-core.cfg读取。

results matching ""

    No results matching ""