前言
今天学习了FISCO-BCOS的节点信息配置讲解,来分开讲一下FISCO-BCOS是在正常单群组四节点的情况下如何调用文件。篇幅较长请耐心观看,如果觉得小弟写的还可以,留下红心和关注帮助小弟冲一下榜。
后面我会在A C之间的小破站更新一下视频,如果看完一脸懵的大哥可以去看一下我的视频讲解,最多一周,敬请期待。
B站地址:CQCET-阿雄不会写代码的个人空间_哔哩哔哩_bilibili
示例:Ubuntu20.0、FISCO-BCOS 2.X
起链
我们在这里就不完整的去讲起链的方式,挑重点讲如果大家对起链感兴趣或者不熟悉,可以去看我的另一篇文章【教程】完美的FISCO-BCOS区块链网络如何启动,单机四节点,联盟链
首先我会下载build_chain.sh脚本
使用建链命令进行建链(在这里使用一个节点目录方便教学)
bash build_chain.sh -l 127.0.0.1 -p 30300,20200,8545
我们可以先看一下窗口中返回的信息
第一段
[INFO] Downloading fisco-bcos binary from https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.0/fisco-bcos.tar.gz ...
curl: (7) Failed to connect to github.com port 443: Connection refused [INFO] Download speed is too low, try https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.0/fisco-bcos.tar.gz
## 这里讲了我们去访问GitHub中下载FISCO-BCOS的压缩包,结果发现链接失败所以跳转到国内的码云中去下载
这里对应这我们build_chain.sh中的1633行
这里的cdn_download_link在上面环境变量中有指定
在下面有许多的判断就是为了预防在国内无法访问GitHub的情况发生
第二段
==============================================================
Generating CA key...
==============================================================
生成CA秘钥对应脚本1677行,在脚本内的运行流程就是找到${output_dir}下的cert目录将CA证书存放进去,${output_dir}在上面定义的是nodes目录,所以我们进入后就可以看见我们的CA证书,具体CA证书的生成会有专栏来讲解。
第三段
==============================================================
Generating keys and certificates ...
Processing IP=127.0.0.1 Total=1 Agency=agency Groups=1
==============================================================
生成秘钥和证书对应在脚本的1793行,脚本内的运行流程就是在输入起链命令后将他们赋给变量$OPTARG接收,确定起链模式,节点数量,确定IP,群组等参数,开始创建节点目录节点目录由node_count来确定这个node_count就是我们在起链时输入的节点数量我们是默认单节点,所以建起来的目录就是一个目录
第四段
==============================================================
Generating configuration files ...
Processing IP=127.0.0.1 Total=1 Agency=agency Groups=1
==============================================================
生成配置文件对应在脚本的1925行,脚本内的运行流程就是先确定证书的输出目录的位置,用node_count和node_dir进行接收之后就将生成的证书发送到目录下,生成的证书有群组证书,group.X.genesis、group.x.ini、config.ini、和agency目录
第五段
==============================================================
[INFO] Start Port : 30300 20200 8545
[INFO] Server IP : 127.0.0.1
[INFO] Output Dir : /home/fisco223/fisco/nodes
[INFO] CA Path : /home/fisco223/fisco/nodes/cert/
[INFO] RSA channel : true
==============================================================
这里是将所有的端口和服务以及最终的工作目录反馈给使用者,用于自身确定是否达到预期以及预防工作量过大后配置文件等找不到的情况,对应脚本226行
第六段
==============================================================
[INFO] Execute the download_console.sh script in directory named by IP to get FISCO-BCOS console.
e.g. bash /home/fisco223/fisco/nodes/127.0.0.1/download_console.sh -f
==============================================================
[INFO] All completed. Files in /home/fisco223/fisco/nodes
这里就是提醒使用者在IP命名的目录中使用sh脚本获取FISCO-BCOS控制台。并且举了个例子e.g.讲解了用法,最终提示用户所有的流程已经结束,搭建完成工作目录在${output_dir}下。
证书
首先我们现将所有的文件列出来看一下我们的FISCO-BCOS起链完成后nodes中有多少配置文件。
介绍证书
-
config.ini
:主配置文件,主要配置RPC、P2P、SSL证书、账本配置文件路径、兼容性等信息。 -
start.sh\stop.sh:单节点启动\单节点关闭
-
group.X.gensis:群组配置文件,群组内所有节点一致,节点启动后,不可手动更改该配置。主要包括群组共识算法、存储类型、最大gas限制等配置项。
-
group.X.ini:群组可变配置文件,包括交易池大小等,配置后重启节点生效。
-
start_all.sh\stop_all.sh:启动所有节点\关闭所有节点
-
download_bin.sh:下载FISCO-BCOS二进制程序
-
download_console.sh:下载区块链控制台
-
.crt文件:按照X.509 v3证书标准的数字安全证书
-
.key文件:注册加密文件
-
.cnf文件:系统的配置文件
讲解
- config.ini
- grouop.1.genesis
- group.1ini
这三个配置文件是在建链中会使用的文件,所以会比较详细的讲解
config.ini
[rpc]channel_listen_ip=0.0.0.0channel_listen_port=20200jsonrpc_listen_ip=127.0.0.1jsonrpc_listen_port=8545disable_dynamic_group=false
配置RPC端口
-
channel_listen_ip
: Channel监听IP,为方便节点和SDK跨机器部署,默认设置为0.0.0.0
; -
jsonrpc_listen_ip
:RPC监听IP,安全考虑,默认设置为127.0.0.1,若有外网访问需求,请监听节点外网IP或0.0.0.0
; -
channel_listen_port
: Channel端口,对应到JAVA SDK配置中的channel_listen_port
; -
jsonrpc_listen_port
: JSON-RPC端口。
[p2p]listen_ip=0.0.0.0listen_port=30300; nodes to connectnode.0=127.0.0.1:30300
当前FISCO-BCOS必须要配置P2P网络配置
-
listen_ip
:P2P监听IP,默认设置为0.0.0.0
。 -
listen_port
:节点P2P监听端口。 -
node.*
: 节点需连接的所有节点IP:Port
或DomainName:Port
。该选项支持域名,但建议需要使用的用户手动编译源码。 -
enable_compress
:开启网络压缩的配置选项,配置为true,表明开启网络压缩功能,配置为false,表明关闭网络压缩功能。
[certificate_blacklist]; crl.0 should be nodeid, nodeid's length is 128;crl.0=[certificate_whitelist]; cal.0 should be nodeid, nodeid's length is 128;cal.0=
黑名单与白名单配置
- certificate_blacklist:黑名单配置
- certificate_whitelist:白名单配置
[group]group_data_path=data/group_config_path=conf/
配置群组内的配置
-
group_data_path
: 群组数据存储路径。 -
group_config_path
: 群组配置文件路径。
[network_security]; directory the certificates located indata_path=conf/; the node private key filekey=node.key; the node certificate filecert=node.crt; the ca certificate fileca_cert=ca.crt
配置SSL连接的证书信息
-
data_path
:证书和私钥文件所在目录。 -
key
: 节点私钥相对于data_path
的路径。 -
cert
: 证书node.crt
相对于data_path
的路径。 -
ca_cert
: ca证书文件路径。 -
ca_path
: ca证书文件夹,多ca时需要。 -
check_cert_issuer
:设置SDK是否只能连本机构节点,默认为开启(check_cert_issuer=true)。
[storage_security]enable=falsekey_manager_ip=key_manager_port=cipher_data_key=
落盘加密
-
enable
: 是否开启落盘加密,默认不开启; -
key_manager_ip
:Key Manager服务的部署IP; -
key_manager_port
:Key Manager服务的监听端口; -
cipher_data_key
: 节点数据加密密钥的密文,cipher_data_key
的产生
[chain]id=1; use SM crypto or not, should nerver be changedsm_crypto=falsesm_crypto_channel=falsersa_crypto_channel=true
配置节点的链属性。此配置项建链时工具会自动生成,用户不需修改。
-
id:
链ID,默认为1; -
sm_crypto:
true
表示节点使用国密模式,false
表示节点使用非国密模式,默认为false
; -
sm_crypto_channel
:此选项用于配置是否使用国密SSL与SDK连接,默认为false。
[compatibility]; supported_version should nerver be changedsupported_version=2.9.0
配置节点的兼容性
-
supported_version
:当前节点运行的版本
[log]enable=truelog_path=./log; enable/disable the statistics functionenable_statistic=false; network statistics interval, unit is second, default is 60sstat_flush_interval=60; info debug tracelevel=info; MBmax_log_file_size=200flush=true
统计日志配置
-
enable
: 启用/禁用日志,设置为true
表示启用日志;设置为false
表示禁用日志,默认设置为true,性能测试可将该选项设置为false
,降低打印日志对测试结果的影响 -
log_path
:日志文件路径。 -
level
: 日志级别,当前主要包括trace
、debug
、info
、warning
、error
五种日志级别,设置某种日志级别后,日志文件中会输大于等于该级别的日志,日志级别从大到小排序error > warning > info > debug > trace
。 -
max_log_file_size
:每个日志文件最大容量,计量单位为MB,默认为200MB。 -
flush
:boostlog默认开启日志自动刷新,若需提升系统性能,建议将该值设置为false。
[flow_control]; restrict QPS of the node;limit_req=1000; restrict the outgoing bandwidth of the node; Mb, can be a decimal; when the outgoing bandwidth exceeds the limit, the block synchronization operation will not proceed;outgoing_bandwidth_limit=2
- limit_req:用于限制SDK每秒到节点的最大请求数目,当每秒到节点的请求超过配置项的值时,请求会被拒绝,SDK请求速率限制默认关闭,若要开启该功能,需要将
limit_req
配置项前面的;
去掉
-
outgoing_bandwidth_limit
:节点出带宽限制,单位为Mbit/s
,当节点出带宽超过该值时,会暂缓区块发送,也会拒绝客户端发送的AMOP请求,但不会限制区块共识和交易广播的流量,该配置项默认关闭,若要打开流量限制功能,请将outgoing_bandwidth_limit
配置项前面的;
去掉。
config.ini讲解到此结束
group.X.gengsis
群组系统配置主要包括群组ID、共识、存储和gas相关的配置。
[consensus]; consensus algorithm now support PBFT(consensus_type=pbft), Raft(consensus_type=raft); rpbft(consensus_type=rpbft)consensus_type=pbft; the max number of transactions of a blockmax_trans_num=1000; in seconds, block consensus timeout, at least 3sconsensus_timeout=3; rpbft related configuration; the working sealers num of each consensus epochepoch_sealer_num=1; the number of generated blocks each epochepoch_block_num=1000; the node id of consensusersnode.0=faa5f3ef8e0761064d9dde923ee8e8027b5fa25f45d12c54b044eade1a16782ec72191a4c1a145f958ccd4e9927f03f27e5dd0406eee4a4d93bb7fd63c546367
-
consensus_type
:共识算法类型,目前支持PBFT,Raft和rPBft,默认使用PBFT共识算法; -
max_trans_num
:一个区块可打包的最大交易数,默认是1000,链初始化后,可通过控制台动态调整该参数; -
consensus_timeout
:PBFT共识过程中,每个区块执行的超时时间,默认为3s,单位为秒,可通过控制台动态调整该参数; -
node.idx
:共识节点列表,配置了参与共识节点的Node ID,节点的Node ID可通过${data_path}/node.nodeid
文件获取(其中${data_path}
可通过主配置config.ini
的[network_security].data_path
配置项获取)
rPBFT相关配置
-
epoch_sealer_num
:一个共识周期内选择参与共识的节点数目,默认是所有共识节点总数,链初始化后可通过控制台动态调整该参数; -
epoch_block_num
:一个共识周期出块数目,默认为1000,可通过控制台动态调整该参数;
[state]type=storage
存储区块链状态信息
-
type
:state类型,目前支持storage state和MPT state,默认为storage state,storage state将交易执行结果存储在系统表中,效率较高,MPT state将交易执行结果存储在MPT树中,效率较低,但包含完整的历史信息。
[tx]; transaction gas limitgas_limit=300000000
FISCO BCOS兼容以太坊虚拟机(EVM),为了防止针对EVM的DOS攻击,EVM在执行交易时,引入了gas概念,用来度量智能合约执行过程中消耗的计算和存储资源,包括交易最大gas限制和区块最大gas限制,若交易或区块执行消耗的gas超过限制(gas limit),则丢弃交易或区块。FISCO BCOS是联盟链,简化了gas设计,仅保留交易最大gas限制,区块最大gas通过共识配置的
gas_limit:配置交易最大gas限制,默认是300000000,链初始化完毕后,可通过控制台指令动态调整gas限制。
[evm]enable_free_storage=false
-
evm.enable_free_storage
设置为true:开启Free Storage
Gas模式 -
evm.enable_free_storage
设置为false:关闭Free Storage
Gas模式
group.X.gensis讲解到此结束
group.X.ini
可变配置主要包括交易池大小、PBFT共识消息转发的TTL、PBFT共识打包时间设置、PBFT交易打包动态调整设置、并行交易设置等。
[consensus]; the ttl for broadcasting pbft messagettl=2; min block generation time(ms)min_block_generation_time=500enable_dynamic_block_size=trueenable_ttl_optimization=trueenable_prepare_with_txsHash=true; The following is the relevant configuration of rpbft; set true to enable broadcast prepare request by treebroadcast_prepare_by_tree=true; percent of nodes that broadcast prepare status to, must be between 25 and 100prepare_status_broadcast_percent=33; max wait time before request missed transactions, ms, must be between 5ms and 1000msmax_request_missedTxs_waitTime=100; maximum wait time before requesting a prepare, ms, must be between 10ms and 1000msmax_request_prepare_waitTime=100
- ttl:PBFT共识算法为了保证共识过程最大网络容错性,每个共识节点收到有效的共识消息后,会向其他节点广播该消息,在网络较好的环境下,共识消息转发机制会造成额外的网络带宽浪费,因此在群组可变配置项中引入了
ttl
来控制消息最大转发次数,消息最大转发次数为ttl-1
min_block_generation_time
:默认为500ms共识节点最长打包时间为1000ms,若超过1000ms新区块中打包到的交易数仍为0,共识模块会进入出空块逻辑,空块并不落盘;不可超过出空块时间1000ms,若设置值超过1000ms,系统默认min_block_generation_time为500ms- enable_dynamic_block_size:考虑到CPU负载和网络延迟对系统处理能力的影响,PBFT提供了动态调整一个区块内可打包最大交易数的算法,该算法会根据历史交易处理情况动态调整区块内可打包的最大交易数,默认开启
enable_ttl_optimization
配置为true\
false:打开PBFT消息转发优化策略\关闭PBFT消息转发优化策略- max_trans_num:区块内可打包的最大交易数
enable_prepare_with_txsHash
配置为true\
false:打开Prepare包结构优化,Prepare消息包内区块仅包含交易哈希列表\关闭Prepare包结构优化,Prepare消息包内区块包含全量的交易-
broadcast_prepare_by_tree
:Prepare包树状广播策略开启/关闭开关,设置为true
,开启Prepare包树状广播策略;设置为false
,关闭Prepare包树状广播策略,默认为true
-
prepare_status_broadcast_percent
:Prepare状态包随机广播的节点占共识节点总数的百分比,取值在25到100之间,默认为33 -
max_request_prepare_waitTime
:节点Prepare缓存缺失时,等待父节点发送Prepare包的最长时延,默认为100ms,超过这个时延后,节点会向其他拥有该Prepare包的节点请求 -
max_request_missedTxs_waitTime
:节点Prepare包内交易缺失后,等待父节点或其他非leader节点同步Prepare包状态的最长时延,默认为100ms,若在等待时延窗口内同步到父节点或非leader节点Prepare包状态,则会随机选取一个节点请求缺失交易;若等待超时,直接向leader请求缺失交易。
[storage]; storage db type, rocksdb / mysql / scalable, rocksdb is recommendedtype=rocksdb; set true to turn on binary logbinary_log=false; scroll_threshold=scroll_threshold_multiple*1000, only for scalablescroll_threshold_multiple=2; set fasle to disable CachedStoragecached_storage=true; max cache memeory, MBmax_capacity=32max_forward_block=10; only for external, deprecated in v2.3.0max_retry=60topic=DB; only for mysqldb_ip=127.0.0.1db_port=3306db_username=db_passwd=db_name=
公共配置项
-
type
:存储的DB类型,支持RocksDB
、MySQL
和Scalable
,不区分大小写。DB类型为RocksDB时,区块链系统所有数据存储于RocksDB本地数据库中;type为MySQL
时,节点根据配置访问MySQL数据库;type为Scalable
时,需要设置binary_log=true
,此时状态数据和区块数据分别存储在不同的RocksDB实例中,存储区块数据的RocksDB实例根据配置项scroll_threshold_multiple
*1000切换实例,实例以存储的起始区块高度命名。 -
binary_log
:当设置为true
时打开binary_log,此时关闭RocksDB的WAL。 -
cached_storage
:控制是否使用缓存,默认true
。 -
max_capacity
:配置允许节点用于内存缓存的空间大小。 -
max_forward_block
:配置允许节点用于内存区块的大小,当节点出的区块超出该数值时,节点停止共识等待区块写入数据库。
数据库相关配置项
-
scroll_threshold_multiple
:当type为Scalable
时,此配置项用于配置区块数据库的切换阈值,按scroll_threshold_multiple*1000
。默认为2,区块数据按每2000块存储在不同的RocksDB实例中。 -
db_ip
:当type为MySQL
时,需要配置该字段,表示MySQL的IP地址。 -
db_port
:当type为MySQL
时,需要配置该字段,表示MySQL的端口号。 -
db_username
:当type为MySQL
时,需要配置该字段,表示MySQL的用户名。 -
db_passwd
:当type为MySQL
时,需要配置该字段,表示MySQL用户对应的密码。 -
db_name
:当type为MySQL
时,需要配置该字段,表示MySQL中使用的数据库名。 -
init_connections
:当type为MySQL
时,可选配置该字段,表示与MySQL建立的初始连接数,默认15。使用默认值即可。 -
max_connections
:当type为MySQL
时,可选配置该字段,表示与MySQL建立的最大连接数,默认20。使用默认值即可。
[tx_pool]limit=150000; transaction pool memory size limit, MBmemory_limit=512; number of threads responsible for transaction notification,; default is 2, not recommended for more than 8notify_worker_num=2; transaction expiration time, in seconds; default is 10 minute(600s)txs_expiration_time=600
交易池容量配置
-
[tx_pool].limit
: 限制交易池内可以容纳的最大交易数目,默认为150000
,超过该限制后,客户端发到节点的交易会被拒绝。 -
[tx_pool].memory_limit
: 交易池内交易占用的内存大小限制,默认为512MB
,超过该限制后,客户端发到节点的交易会被拒绝。 [tx_pool].notify_worker_num:
配置项来配置异步推送线程数目:-
[tx_pool].notify_worker_num
:异步推送线程数目,默认为2,建议该值不超过8 -
[tx_pool].txs_expiration_time
: 交易过期时间,默认为10分钟,要求该值不小于共识超时时间
[sync]; max memory size used for block sync, must >= 32MBmax_block_sync_memory_size=512idle_wait_ms=200; send block status by tree-topology, only supported when use pbftsync_block_by_tree=true; send transaction by tree-topology, only supported when use pbft; recommend to use when deploy many consensus nodessend_txs_by_tree=true; must between 1000 to 3000; only enabled when sync_by_tree is truegossip_interval_ms=1000gossip_peers_number=3; max number of nodes that broadcast txs status to, recommended less than 5txs_max_gossip_peers_num=5
区块同步优化配置,增强区块链系统在网络带宽受限情况下的可扩展性
- max_block_sync_memory_size:最大块同步内存大小。
- idle_wait_ms:空闲等待毫秒。
sync_block_by_tree
配置为true\
false:打开区块同步优化策略\关闭区块同步优化策略。- send_txs_by_tree:设置为
true\
false,打开交易树状广播策略\关闭交易树状广播优化策略。 -
gossip_interval_ms
:gossip协议同步区块状态周期,默认为1000ms。 -
gossip_peers_number
:节点每次同步区块状态时,随机选取的邻居节点数目,默认为3。 txs_max_gossip_peers_num:
配置交易状态最多转发节点数目,默认为5。为保障交易到达每个节点的同时,尽量降低交易状态转发引入的流量开销,不建议将将 txs_max_gossip_peers_num 设置太小或太大,直接使用默认配置即可。
[flow_control]; restrict QPS of the group;limit_req=1000; restrict the outgoing bandwidth of the group; Mb, can be a decimal; when the outgoing bandwidth exceeds the limit, the block synchronization operation will not proceed;outgoing_bandwidth_limit=2
群组级别的SDK请求速率限制以及流量限制
- limit_req:用于限制SDK每秒到群组的最大请求数目,当每秒到节点的请求超过配置项的值时,请求会被拒绝,SDK到群组请求速率限制默认关闭,若要开启该功能,需要将
limit_req
配置项前面的;
去掉 outgoing_bandwidth_limit
:群组出带宽限制,单位为Mbit/s
,当群组出带宽超过该值时,会暂缓发送区块,但不会限制区块共识和交易广播的流量,该配置项默认关闭,若要打开流量限制功能,请将outgoing_bandwidth_limit
配置项前面的;
去掉。
[sdk_allowlist]; When sdk_allowlist is empty, all SDKs can connect to this node; when sdk_allowlist is not empty, only the SDK in the allowlist can connect to this node; public_key.0 should be nodeid, nodeid's length is 128;public_key.0=
群组级的SDK白名单访问控制机制,实现sdk到群组的访问控制,默认关闭
- public_key.0:配置允许与该群组进行通信的SDK公钥公钥列表。