# 平行链环境搭建

平行链的运行是依赖于主链的，它通过grpc接口同主链进行通信，所以平行链一定是在主链环境已经具备的情况下才能搭建。

## 应用场景

为解决专有问题，适用于特定场景，用户可以在主链上搭建平行链来解决，实现各个击破 。平行链共享主链共识网络，每条平行链只运行自己的数据，平行链与平行链之间数据相互隔离。
本文分别介绍Window和Linux两种操作系统上搭建Chain33平行链，请根据实际情况查阅对应文档。

## 环境准备

准备好已搭建好的主链。主链的形态可以是：

1. [单节点solo,用于开发和测试](solo.md)
2. [单节点docker,用于开发和测试](./docker.md)
3. [私有链集群](./privateChain.md)
4. [联盟链集群](./consortiumChain.md)

### 下载软件包

下载页面: [资源下载](https://chain.33.cn/resource)
平行链软件包有window和linux两个版本，根据自己的操作系统下载对应的平行链软件包，再解压到任意指定目录。

软件包分别包含

```
# windows
chain33.exe                -- chain33节点程序
chain33-cli.exe            -- chain33节点命令行工具
chain33.para.toml          -- chain33平行链配置文件
# linux
chain33                -- chain33节点程序
chain33-cli            -- chain33节点命令行工具
chain33.para.toml      -- chain33平行链配置文件
```

### 配置文件

平行链根据具体情况修改对应的平行链title，主链地址，和super manager地址。

```
# 平行链title，用来唯一标识一条平行链，修改其中的xxxx(只支持英文字符，另外xxxx后面那个 .  不能省略)
Title="user.p.xxx."
# 平行链上创世积分的名称，可以自定义，但只支持英文字符
CoinSymbol="para" 
[rpc]
 # 平行链的jsonrpc和grpc地址，可以自定义，如果主链和平行链放在同一台服务器上， 只需要保证以下两个端口和主链配置不一样就行
jrpcBindAddr=":8901"
grpcBindAddr=":8902"
[consensus]
# 平行链创世积分所在的地址，可以修改成自己的地址（[命令行地址生成方式](../docs/foodTrace.md), JAVA-SDK地址生成方式见：https://baas.33.cn/doc/detail/69 ）
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
[consensus.sub.para]
# 主链的grpc地址，根据主链节点的具体情况修改 (具体的端口可以看主链配置文件中的：grpcBindAddr这个参数的配置)
ParaRemoteGrpcClient="127.0.0.1:8802"
# 指示从主链哪个高度开始同步，比如主链高度是1万，建议配置是提前1000个区块（10000-1000=9000），配置为1代表从主链第1个高度开始同步。 此参数不能配置成大于主链的高度
startHeight = 1
[exec.sub.manage]
# 平行链管理合约的super manager地址，用于设置一些合约权限相关的配置， 地址生成方式参考上述genesis地址
superManager=["14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"]
[exec.sub.evm]
# 前面coins.是固定配置，后面的参数和上述的CoinSymbol对应
ethMapFromSymbol="coins.para"
```

## 节点启动

**windows**
1.在软件包解压目录打开windows终端，执行启动命令，启动后会一直打印日志。

```
chain33.exe -f chain33.para.toml
```

2.在软件包解压目录下重新打开windows终端，执行以下命令查询平行链网络信息，判断平行链是否创建成功。

```
chain33-cli.exe net peer
```

创建成功后，将输出如下类似的信息：

```
{
    "peers": [
        {
            "addr": "192.168.0.157",
            "port": 13802,
            "name": "03a2314f11d5f78b93f13aba18618d61a652720003d8941415c6e8008761d58452",
            "mempoolSize": 0,
            "self": true,
            "header": {
                "version": 0,
                "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "txHash": "0xe34a933c5abf350db4db5122abbf43f6a54da2dbd67d214f67362c36bd70d23e",
                "stateHash": "0x88f0b06df8cd2cd6da81e1580e6f179128e42aa8c66e2dba9c38af3e18f9fa44",
                "height": 0,
                "blockTime": 1514533394,
                "txCount": 1,
                "hash": "0xfd39dbdbd2cdeb9f34bcec3612735671b35e2e2dbf9a4e6e3ed0c34804a757bb",
                "difficulty": 0
            }
        }
    ]
}
```

如果执行出错，请检查`logs/chain33.log`文件中的错误信息。

**linux**
1.在待搭建平行链的服务器中，解压软件包。

```
tar -zxvf chain33_para_linux_0670237.tar.gz
```

2.在软件包解压缩目录中，执行启动命令。

```
nohup ./chain33 -f chain33.para.toml >/dev/null 2>&1 &
```

3.执行命令，查看进程。

```
ps -ef | grep -v grep | grep chain33
```

4.如果进程已经启动，执行命令查询平行链网络信息。

```
# --rpc_laddr参数指向的是平行链jsonrpc端口地址， 此端口配置对应在配置文件的 jrpcBindAddr
./chain33-cli --rpc_laddr="http://localhost:8901" block last_header
```

创建成功后，将输出如下类似的信息：

```
{
    "version": 0,
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "txHash": "0xe4bf83e83b4624b5c39e333ec251eba8dab6a87ced457d44fda84c8b1a2c8a38",
    "stateHash": "0x94a510c6ecb9bbee0f5b7c21dfb2fe4cc21251882292ebece60b59a6acd4961d",
    "height": 0,
    "blockTime": 1514533390,
    "txCount": 1,
    "hash": "0xebd9ba0fa9bdb26cd937ab1fd77650236b935bac48ede4522c5b2d85dc890be2",
    "difficulty": 0
}
```

如果执行出错，请检查`logs/chain33.log`文件中的错误信息。