# 配置文件说明

- 配置文件说明
  - [配置文件](./configIntro.html#配置文件)
  - 模块配置
    - [title配置](./configIntro.html#title-配置)
    - [blockchain模块](./configIntro.html#blockchain-模块)
    - [p2p模块](./configIntro.html#p2p-模块)
    - [rpc模块](./configIntro.html#rpc-模块)
    - [mempool模块](./configIntro.html#mempool-模块)
    - [consensus模块](./configIntro.html#consensus-模块)
    - [store模块](./configIntro.html#store-模块)
    - [wallet模块](./configIntro.html#wallet-模块)
    - [exec模块](./configIntro.html#exec-模块)
    - [health模块](./configIntro.html#health-模块)
    - [metrics模块](./configIntro.html#metrics-模块)
    - [log模块](./configIntro.html#log-模块)
  - 配置文件示例

## 配置文件

chain33 系统配置文件 chain33.toml，包含区块链，p2p，存储，共识，账户等各个模块的配置。对于不同的部署环境，无论是单节点，私链还是联盟链，大部分配置都是通用的。

## 模块配置

### title 配置

主链的 title 可以使用默认配置，不需要修改，包括单节点，私链和联盟链。平行链需要配置唯一的 `Title`，还需要配置平行链上的主币名称 `CoinSymbol`。

```
# 平行链 Title 以"user.p."前缀开头
Title="user.p.devtest."
# 配置主币的名称: 比特元链 bty, 部分未配置的平行链需要配置为 bty，新的平行链配置 para 或其他， 不配置 panic
CoinSymbol="para"
# app 的版本
Version="1.0.0"
# 是否是测试网络
TestNet=false
# 是否开启自动修复时间
FixTime=false
# 是否按照块高度设置过期时间
TxHeight=false
# 平行链是否开启 fork 功能，没有配置 fork，那么默认所有的fork 为 0
EnableParaFork=false
```

### blockchain 模块

blockchain 模块主要配置区块链节点相关的配置，单节点 `singleMode=true`, 平行链节点`isParaChain=true`，其他可配置项使用默认值，也可根据具体情况自行修改。

```
[blockchain]
# 分片存储中每个大块包含的区块数
chunkblockNum=10000
# 缓存区块的个数
defCacheSize=128
# 同步区块时一次最多申请获取的区块个数
maxFetchBlockNum=128
# 向对端节点请求同步区块的时间间隔
timeoutSeconds=5
# 使用的数据库类型
driver="leveldb"
# 数据库文件目录
dbPath="datadir"
# 数据库缓存大小
dbCache=64
# 是否为单节点
singleMode=false
# 同步区块批量写数据库时，是否需要立即写磁盘，非固态硬盘的电脑可以设置为false，以提高性能
batchsync=false
# 是否记录添加或者删除区块的序列，若节点作为主链节点，为平行链节点提供服务，需要设置为true
isRecordBlockSequence=true
# 是否为平行链节点
isParaChain=false
# 是否开启交易快速查询索引
enableTxQuickIndex=false
# 是否开启精简localdb
enableReExecLocal=true
# 区块回退
rollbackBlock=5
# 回退是否保存区块
rollbackSave=true
# 最新区块上链超时时间，单位秒。
onChainTimeout=1
# 使能精简localdb
enableReduceLocaldb=true
# 关闭分片存储,默认开启分片存储为false;平行链不需要分片需要修改此默认参数为true
disableShard=false
# 使能从P2pStore中获取数据
enableFetchP2pstore=true
# 使能注册推送区块、区块头或交易回执
EnablePushSubscribe=true
# 当前活跃区块的缓存数量
maxActiveBlockNum=1
# 当前活跃区块的缓存大小M为单位
maxActiveBlockSize=1
# 允许打包的High区块高度
highAllowPackHeight=0
# 允许打包的low区块高度
lowAllowPackHeight=0
# 关闭分片存储,默认false为开启分片存储;平行链不需要分片需要修改此默认参数为true
disableShard=false
# 分片存储中每个大块包含的区块数
chunkblockNum=1000
# 使能从P2pStore中获取数据
enableFetchP2pstore=false
# 使能假设已删除已归档数据后,获取数据情况
enableIfDelLocalChunk=false
```

### p2p 模块

p2p 模块配置节点网络通信类型，以及种子节点的信息。网络类型分为 `dht` 和 `gossip` 两种，分别对应的 seed 配置也有不同。根据具体情况配置监听端口 `port` 和 `seeds`。单节点可以无需配置 p2p，使用默认值即可。

```
[p2p]
# 使用的数据库类型
driver="leveldb"
# 配置p2p网络类型，dht,gossip两种
types=["dht"]
# 数据库文件目录
dbPath="datadir/addrbook"
# 数据库缓存大小
dbCache=4
# GRPC请求日志文件
grpcLogFile="grpc33.log"
# 是否等待seed导入
waitPid=false
# 是否启动P2P服务
enable=true
[p2p.sub.gossip]
port=13802
# 种子节点，格式为ip:port，多个节点以逗号分隔，如seeds=["10.0.0.1:13802","10.0.0.2:13802","10.0.0.3:13802"]
seeds=[]
isSeed=false
innerSeedEnable=true
useGithub=true
innerBounds=300
[p2p.sub.dht]
# 默认监听端口号
port=13803
# 种子节点，格式为/ip4/ip/tcp/port/p2p/peerID，多个节点以逗号分隔，如seeds=["/ip4/10.0.0.1/tcp/13803/p2p/16Uiu2HAm19JAcWxkryuYShj6RWn3TGP4Y4Er1DwFe7AC4TevbuU6"]
seeds=[]
[p2p.sub.dht]
seeds=[]
port=13803
maxConnectNum=100
# 禁止通过局域网发现节点
disableFindLANPeers=false
# 配置为全节点模式，全节点保存所有分片数据
isFullNode=true
# 若本节点不是全节点，则需要配置全节点地址，当在分片网络中查不到数据时，会到全节点上获取数据
# 格式: "/ip4/139.196.46.175/tcp/13803/p2p/16Uiu2HAkvnDRF8HQTTU5Uu5GmtbLDrgPxCwgVsn2QQ9VEU7Eiwjw"
fullNodes=[]
```

### rpc 模块

rpc 模块主要配置 json rpc 和 grpc 的监听端口，用户根据实际情况选择，也可以在端口没有冲突的情况下选择默认值。

```
[rpc]
# jrpc绑定地址
jrpcBindAddr="localhost:8801"
# grpc绑定地址
grpcBindAddr="localhost:8802"
# 白名单列表，允许访问的IP地址，默认是“*”，允许所有IP访问
Whitelist=["127.0.0.1"]
# jrpc方法请求白名单，默认是“*”，允许访问所有RPC方法
jrpcFuncWhitelist=["*"]
# grpc方法请求白名单，默认是“*”，允许访问所有RPC方法
grpcFuncWhitelist=["*"]
# jrpc方法请求黑名单，禁止调用黑名单里配置的rpc方法，一般和白名单配合使用，默认是空
jrpcFuncBlacklist=[]
# grpc方法请求黑名单，禁止调用黑名单里配置的rpc方法，一般和白名单配合使用，默认是空
grpcFuncBlacklist=[]
# 是否开启https
enableTLS=false
# grpc的日志是否开启
enableTrace=true
# 证书文件，证书和私钥文件可以用cli工具生成
certFile="cert.pem"
# 私钥文件
keyFile="key.pem"
```

### mempool 模块

mempool 模块主要配置交易缓存处理的策略和交易手续费，缓存策略分为 `timeline`，`score`，`price`，用户可根据需要选择不同的策略，其他配置一般情况下使用默认值即可。

```
[mempool]
# mempool队列名称，可配，timeline，score，price
name="timeline"
# mempool缓存容量大小，默认10240
poolCacheSize=10240
# 强制把状态改为同步状态
forceAccept=false
# 最小得交易手续费用，这个没有默认值，必填，一般是100000
minTxFee=100000
# 每个账户在mempool中得最大交易数量，默认100
maxTxNumPerAccount=10000
# 最大得交易手续费用，这个没有默认值，必填，一般是100000
maxTxFee=1000000000
# 是否开启阶梯手续费
isLevelFee=false
# 创建最后交易的缓存大小
maxTxLast=10240
# 最大单元交易费, 默认1e7
maxTxFeeRate=1000000
# 目前execCheck效率较低，支持关闭交易execCheck，提升性能
disableExecCheck=false
# timeline 是默认的先来先进的按时间排序
[mempool.sub.timeline]
# mempool缓存容量大小，默认10240
poolCacheSize=10240
# score是分数队列模式(分数=常量a*手续费/交易字节数-常量b*时间*定量c，按分数排队，高的优先，常量a，b和定量c可配置)，按分数来排序
[mempool.sub.score]
# mempool缓存容量大小，默认10240
poolCacheSize=10240
# 时间占价格比例
timeParam=1
# 手续费相对于时间的一个合适的常量，取当前unix时间戳前四位数，排队时手续费高1e-5的分数~=快1s的分数
priceConstant=1544
# 常量比例
pricePower=1
# price是价格队列模式(价格=手续费/交易字节数，价格高者优先，同价则时间早优先)
[mempool.sub.price]
# mempool缓存容量大小，默认10240
poolCacheSize=10240
# 最小得交易手续费用，这个没有默认值，必填，一般是100000
```

### consensus 模块

consensus 模块主要配置共识方法和不同共识对应的配置。单节点使用 `solo` 共识，私链使用 `raft` 共识，联盟链使用 `tendermint` 共识，平行链使用 `paracross` 共识，不同的共识对应不同的配置。

```
[[consensus]
# 共识名,可选项有 solo,ticket,raft,tendermint,para
name="solo"
# 是否开启挖矿,开启挖矿才能创建区块
minerstart=true
# 创世区块时间(UTC时间)
genesisBlockTime=1514533394
# 创世交易地址
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
# 在线挖矿地址
hotkeyAddr="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
# 配置挖矿的合约名单
minerExecs=["ticket", "autonomy"]
# 最优区块选择
enableBestBlockCmp=true
[mver.consensus]
# 基金账户地址
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
# 挖矿难度
powLimitBits = "0x1f00ffff"
# 区块包含最多交易数
maxTxNumber = 1500
[mver.consensus.ticket]
# 用户回报
coinReward = 18
# 发展基金回报
coinDevFund = 12
# ticket价格
ticketPrice = 10000
# 每次调整难度的最大的范围，如果设置成 4 的话，范围是 (1/4 - 4)，一次不能增加 4倍以上的难度，或者难度减少为 原来的 1/4 ，这个参数，是为了难度不会突然爆增加或者减少
retargetAdjustmentFactor = 4
# 表示如果区块时间大于当前时间 15s ，那么区块就会判定为无效区块。
futureBlockTime = 15
# ticket冻结时长
ticketFrozenTime = 43200
# ticket取回时长
ticketWithdrawTime = 172800
# ticket挖矿等待时长
ticketMinerWaitTime = 7200
#调整挖矿难度的间隔，(ps:难度不是每个区块都调整的，而是每隔 targetTimespan / targetTimePerBlock 块调整一次)
targetTimespan = 2304
#每个区块打包的目标时间
targetTimePerBlock = 16
[consensus.sub.solo]
# 创世交易地址
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
# 创世区块时间(UTC时间)
genesisBlockTime=1514533394
# 等待交易时间，如果 10秒没有交易的话，就出一个空块
waitTxMs=10
# 是否为基准测试模式
benchMode=true
# 创世块的配置
[consensus.sub.ticket]
# 创世区块时间(UTC时间)
genesisBlockTime=1514533394
[[consensus.sub.ticket.genesis]]
# 在线挖矿地址
minerAddr="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
# 离线地址
returnAddr="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
# 创世票的数量
count=10000
[[consensus.sub.ticket.genesis]]
minerAddr="1PUiGcbsccfxW3zuvHXZBJfznziph5miAo"
returnAddr="1EbDHAXpoiewjPLX9uqoz38HsKqMXayZrF"
count=10000
[[consensus.sub.ticket.genesis]]
minerAddr="1EDnnePAZN48aC2hiTDzhkczfF39g1pZZX"
returnAddr="1KcCVZLSQYRUwE5EXTsAoQs9LuJW6xwfQa"
count=10000
[consensus.sub.tendermint]
# 创世交易地址
genesis="1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs"
# 创世区块时间(UTC时间)
genesisBlockTime=1514533394
# 获取交易间隔时长,以下时长单位均为毫秒
timeoutTxAvail=1000
# 等待proposal超时基准时长
timeoutPropose=3000
# 每轮延长等待proposal的时长
timeoutProposeDelta=500
# 等待pre-vote超时基准时长
timeoutPrevote=1000
# 每轮延长等待pre-vote的时长
timeoutPrevoteDelta=500
# 等待pre-commit超时基准时长
timeoutPrecommit=1000
# 每轮延长等待pre-commit的时长
timeoutPrecommitDelta=500
# 收到对一个区块的2/3pre-commits后,等待落后者投票超时时长,超时后将启动新高度流程
timeoutCommit=1000
# 是否在收到所有pre-commits,还未达到超时等待时长时,取消等待,如果为true,将启动新高度流程;如果为false,等到超时时才启动新高度流程
skipTimeoutCommit=true
# 是否允许创建空区块
createEmptyBlocks=false
# 创建空区块的时间间隔,如果大于0则认为允许出空块
createEmptyBlocksInterval=0
# 共识节点，格式为ip:port，多个节点以逗号分隔，为了拜占庭容错,节点数至少为4个,如
validatorNodes=["10.0.0.1:46656","10.0.0.2:46656","10.0.0.3:46656","10.0.0.4:46656"]
```

用户只需根据实际情况配置共识节点`validatorNodes`，其他配置可使用默认值。

### store 模块

区块链存储模块，chain33 支持多种数据存储格式和数据存储驱动，一般情况用户使用默认配置即可，有需要的可以根据实际情况配置不同的存储格式和驱动。

```
[store]
# 数据存储格式名称，目前支持mavl,kvdb,kvmvcc,mpt
name="mavl"
# 数据存储驱动类别，目前支持leveldb,goleveldb,memdb,gobadgerdb,ssdb,pegasus
driver="leveldb"
# 数据文件存储路径
dbPath="datadir/mavltree"
# Cache大小
dbCache=128
# 数据库版本
localdbVersion="1.0.0"
# 数据库版本
storedbVersion="1.0.0"
[store.sub.mavl]
# 是否使能mavl加前缀
enableMavlPrefix=false
# 是否使能MVCC,如果mavl中enableMVCC为true此处必须为true
enableMVCC=false
# 是否使能mavl数据裁剪
enableMavlPrune=false
# 裁剪高度间隔
pruneHeight=10000
```

### wallet 模块

wallet 模块主要配置账户存储路径和签名方式，签名方式支持 secp256k1, 国密 sm2， ed25519，一般情况下使用默认配置即可，如果有国密签名的需要，可以修改 `signType`。

```
[wallet]
# 交易发送最低手续费，单位0.00000001BTY(1e-8),默认100000，即0.001BTY
minFee=100000
# walletdb驱动名，支持leveldb/memdb/gobadgerdb/ssdb/pegasus
driver="leveldb"
# walletdb路径
dbPath="wallet"
# walletdb缓存大小
dbCache=16
# 钱包发送交易签名方式
signType="secp256k1"
# 币种名称
coinType="bty"
```

### exec 模块

```
[exec]
# 交易费相关统一在mempool中配置
# 是否开启 stat 插件
enableStat=false
# 是否开启 MVCC 插件
enableMVCC=false
alias=["token1:token","token2:token","token3:token"]
# 是否保存token交易信息
saveTokenTxList=true
[exec.sub.token]
# 是否保存 token 交易信息
saveTokenTxList=true
# token 审批人地址
tokenApprs = [
    "1Bsg9j6gW83sShoee1fZAt9TkUjcrCgA9S",
    "1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK",
    "1LY8GFia5EiyoTodMLfkB5PHNNpXRqxhyB",
    "1GCzJDS6HbgTQ2emade7mEJGGWFfA15pS9",
    "1JYB8sxi4He5pZWHCd3Zi2nypQ4JMB6AxN",
    "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
]
[exec.sub.cert]
# 是否启用证书验证和签名
enable=false
# 加密文件路径
cryptoPath="authdir/crypto"
# 带证书签名类型，支持"auth_ecdsa", "auth_sm2"
signType="auth_ecdsa"
[exec.sub.relay]
# relay 执行器保存 BTC 头执行权限地址
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
[exec.sub.manage]
# manage 执行器超级管理员地址
superManager=[
    "1Bsg9j6gW83sShoee1fZAt9TkUjcrCgA9S",
    "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
    "1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
[exec.sub.autonomy]
total="16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
useBalance=false
```

### health 模块

health 模块监听一个节点是否停止服务了的功能。

```
[health]
# 监听地址是对外服务的地址，缺省是:8805，如果本节点保持和主链同步，则监管服务器可以通过这个监听地址返回，如果失联，则这个监听地址也失效
listenAddr="127.0.0.1:8805"
# 本地检查是否同步的时间间隔，单位秒
checkInterval=5
# 未同步的最大次数
unSyncMaxTimes=6
```

### metrics 模块

```
[metrics]
# 是否使能发送metrics数据的发送
enableMetrics=false
# 数据保存模式
dataEmitMode="influxdb"
# 以纳秒为单位的发送间隔
duration=1000000000
# 接收采样数据的地址
url=""
# 数据库名称
databaseName=""
# 数据库用户名
username=""
# 数据库密码
password=""
# 域名
namespace=""
[metrics.sub.influxdb]
# 以纳秒为单位的发送间隔
duration=1000000000
url="http://influxdb:8086"
database="chain33metrics"
username=""
password=""
namespace=""
```

### log 模块

log 模块配置日志级别和保存，一般使用默认值即可。

```
[log]
# 日志级别，支持debug(dbug)/info/warn/error(eror)/crit
loglevel = "debug"
# 共识日志级别
logConsoleLevel = "info"
# 日志文件名，可带目录，所有生成的日志文件都放到此目录下
logFile = "logs/chain33.para.log"
# 单个日志文件的最大值（单位：兆）
maxFileSize = 300
# 最多保存的历史日志文件个数
maxBackups = 100
# 最多保存的历史日志消息（单位：天）
maxAge = 28
# 日志文件名是否使用本地事件（否则使用UTC时间）
localTime = true
# 历史日志文件是否压缩（压缩格式为gz）
compress = true
# 是否打印调用源文件和行号
callerFile = false
# 是否打印调用方法
callerFunction = false
```

## 配置文件示例

- [单节点](./soloTest.md)
- [私链](./privateChainConfig.md)
- [联盟链](./consortiumChainConfig.md)
- [平行链](./parallelChainConfig.md)

