共识常见问题

Date: 2020-09-14 Source: 本站


学习区块链就是不断踩坑积累的过程,为方便大家更好地从前人中总结经验,我们将FISCO BCOS社群中高频次、高质量的技术提问与探讨沉淀下来,集合成常见FAQ,作为一手学习材料,供大家随时查阅。


本篇收录了关于“共识”的常见问题。FISCO BCOS共识模块采用插件化的设计,可支持多种共识算法,当前包括RPBFT、PBFT和Raft。


Q1 FISCO BCOS会记录交易是从哪个节点或者是从哪家机构发出的吗?

A1 可以在合约调用的接口中增加字段记录来实现这个功能。


Q2 FISCO BCOS各节点和终端有内部自行同步时间吗?

A2 没有同步时间。


Q3 从FISCO BCOS资料上只看到节点机的硬件配置要求,但找不到FISCO BCOS对客户端的硬件配置要求,能给一些指导意见吗?

A3 能运行工程代码 ( 包括 java , go , nodejs ) ,能访问到节点所在服务器,基本满足这两点就可以了。


Q4 如果在同一群组内想对交易和节点之间达成隔离,有对应的功能吗?比如交易A只对节点A可见,其他节点可以查看到交易Ahash,但无法获取交易数据的详细内容 input data 或者 outdata。

A4 目前 FISCO BCOS链上交易数据在所有的共识节点中都是保持一致的,不会根据交易对节点进行区分。


Q5 落盘加密可以对不同交易执行吗?例如,共识节点同步所有数据,观察者节点A和B可以各自同步自己相关的交易数据,但A和B互相又是不可见的?

A5 目前不支持。所有的共识节点和观察节点的区块数据都是保持一致的,不会出现你说的同步自己相关的交易数据。


Q6 由于服务器原因,开始一个群组只有一个节点,后来想添加其他节点,创世文件需要做相应修改吗?

A6 走扩容操作,不用改创世块,发交易可以更新共识列表。


Q7 1.3版本的如果把所有节点的文件直接拷走到新的机器上,可行吗?

A7 1.3和2.x系列在数据上不兼容,不能直接拷贝数据升级。


Q8 关于单链多账本的概念,不同的群组产生的交易数据是否会打包在同一个区块中?

A8 不同群组的交易不会打包在同一个区块,每个群组都有独立的链。


Q9 构建不同的群组A和B,两者之间的交易数据是不共享的吗?也就是群组B中的节点不会同步群组A中的交易。

A9 交易数据是不共享的。两个不同的群组相当于是两个不同的链,群组B中的交易不会同步到群组A中。


Q10 在同一个群组里,用户是不是能够看到群组里所有(智能合约)的数据?包括智能合约中未提供对外查询接口的状态变量。

A10 是的,同一个群组就是大家共识和同步,所以是可以看到的。


Q11 交易体中blocklimit 是不是可以理解为:当前块超过设定块高,该笔交易就会被丢弃?

A11 是的。


Q12 用API获取交易回执信息的时候,同样是1万条数据第一次获取耗时9870ms,但第二次获取则需要耗时230966ms,这是什么原因?

A12 节点有缓存,第二次获取过了有些时间了,缓存替换出去了。大部分场景的回执只会去查一次,而且是一出块就查了。当缓存替换出去以后,确实会慢一些。1w条回执同时从节点请求,压力很大,时间确实会慢一些。实际场景下,可以考虑缓存第一次查询的结果。


Q13 1.0版本以MPT方式存储,交易历史记录可以溯源;2.0推荐storage state,不会保留历史交易数据,不支持溯源,但是区块链本身特性是数据不被篡改,可以溯源;如果使用storage state,没有历史交易数据和历史状态数据,对与我们开发应用来说,拿到的最新数据没有历史做对比,说服力不足以让别人相信这个数据一定是没有经过篡改,这种情况下怎么查到历史交易呢?

A13 区块hash和共识签名保证历史交易没被篡改。历史交易是有的,可以通过getBlock和getTransaction查询,根据历史交易可以推导出状态数据。可以通过数据导出模块bee,从区块导出所有event数据,参考文档:https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Codegen-Monkey/index.html


Q14 智能合约中做数据库插入操作,假如一个区块中有1000条交易数据,在区块共识过程中第999条数据共识失败,那之前的998条数据是否会回滚不会入库呢?

A14 一条交易异常,这个区块就会被丢弃了,里面所有的改动也会被丢弃。


Q15 根据文档一键部署,执行到如图这个位置后,4个节点都跑起来了,看着正确,但是区块一直是0,没有新增区块,是什么问题呢?



A15 在没有交易的场景下,虽然会打包,但是不会出块; 有交易打包进区块才会出块。


Q16 请问一下FISCO BCOS的区块大小有限制吗?
A16 没有固定大小限制,与打包的交易数量多少相关。


Q17 如果一笔合约调用只发event,不修改链上数据,这笔提交会出现在块里吗? 我认为是可以的,但是看浏览器,没有这个块(交易很少,基本一个交易一个块)。
A17 如果没有修改数据,自然就不需要和其他节点进行共识,也就不会出块。


Q18 Java sdk 2.3版本,通过sdk创建群组,然后启动群组,如果创建时指定多个共识节点的话部署合约会超时,这个是我操作有问题吗?通过sdk生成的群组是不是要自己手动把群组的创世文件拷贝到其他共识节点?
A18 调用其他节点的generate和start 入参保持一致。


Q19 Transaction has failed with status: 0x19. Gas used: 300000000. (not-enough gas?) ! 疑问:这里的 gasPrice gasLimit 是否必须设置成 300000000 ?还是说当前部署的这个账户GAS不够? 我设置成了300000000,还是报这个错!

A19 0x19对应到25,是权限不足,(not-enough gas?) 这个只是给一个可能的出错原因,并没有根据错误码推导具体的错误原因,具体的错误码请参考https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/api.html#id68 。


Q20 创建的外部账户直接采用privateKey就调用了合约!但这个外部账户怎么理解呢?外部账户是没有文件的,跟P12 PEM格式的账户不同? 这个外部账户是保存在哪里?
A20 p12和pem里面保存了外部账户的公私钥,外部账户的address是可以通过公钥推导出来的,不需要单独保存,构建交易签名的时候,直接从p12, pem里面加载公私钥对就可以了。


Q21 请问FISCO BCOS是多久打包一次区块?

A21 默认500ms打包一次区块,如果一直没有交易的话,最多等待1秒打包空块。


Q22 我目前有3个机房,如果我要分别在3个机房里面部署fisco bcos节点组成网络,那是否需要3个机房部署的所有节点都需要对外提供访问?是否可以只提供共识节点对外?

A22 对外的接口看需求,p2p肯定要。可以使用 nginx 对外提供统一的一个访问接口,然后在 nginx 上配置需要提供对外服务的共识节点。


Q23 java.lang.Exception: no active connection available network exception;跑测试类是正常的, 在项目里就会报错,这是什么原因呢?

A23 看报错是连接不上节点,可以检查一下网络是否能正常连接。


Q24 我把某个节点的证书拷贝出来,配置到另外一个节点上,是否可用?我看节点证书里面没有包含域名或ip信息。

A24 可以,节点id证书不动就行。


Q25 在原有的机构里面增加一个节点的时候,第三步的操作是只需要在新节点的配置文件里面增加还是需要在所有的节点上都要增加新节点的node.* 的配置?

A25 只配置新节点上的配置文件功能上不会有问题,但在其他老节点加上冗余配置,网络异常时更加健壮。


Q26 单机4节点,创建一个群组,状态也是RUNNing,为何部署合约一直超时?

A26 不是节点,是节点上的群组,建立、启动群组的RPC请求要发到所有的节点上。


Q27 我用docker创建了一个叫fisco-gm的国密版四节点BCOS, 发现8545端口永远是连不上的,但是20200又是连得上的。我就是用四节点script起的节点 有人知道这是为什么吗?

A27 8545是RPC端口,默认监听ip是127.0.0.1,只能本机访问,如果需要跨机器访问,需要修改config.ini的rpc_listen_ip为0.0.0.0 。


Q28 启动节点的时候报这个错是因为port没开放吗?

A28 channel_listen_port端口冲突了。


Q29 这个地址是从哪里生成的?

A29 两条链的用户外部账号。


Q30 目前群组1有,A、B、C、D、E五个机构,每个机构两个节点,目前由于E操作系统有问题被维护人员重新格式化了,E节点上的两个node.nodeid在其它节点进行了删除动作(remodenodeid),但未成功(因为E节点操作系统重做),在此情况下重新安装了E进行部署已经动态增加,但这时之前的,A、B、C、D出块也产生了问题(不出块了),请问这个怎么解决?

A30 P2P配置成全连


Q31 如果有一个节点对历史信息做出修改,后续还可以正确共识吗?mpt模式和storage模式进行共识的时候计算状态根的时候只对新的数据的hash进行计算的时候怎么发现以前的数据是否还合法呢?

A31 节点有缓存,暂时还能跑,如果重启了,合约又读了改的数据,就不能共识了。


Q32 是不是只有在节点建立连接的时候才会验证证书,其他时候会不会和证书有交互?

A32 :SDK等客户端通过channel与节点建立连接时也会验证证书。


Q33 SDK直连节点的带宽降低为原先的一半,那么原先一般是多少呢?有具体的值吗?具体的计算公式?

A33 体数值跟具体的交易和交易的并发数有关,以 centos 为例,服务器上用 nload 查看下带宽就可以看到了,没有具体的公式。


Q34 任何有全量数据的节点都可以获取链上数据,那没有存储全量数据的节点呢?

A34 连接到链上的共识节点和观察节点都是有全量数据的,但是节点变为游离节点后,交易就不会同步到这个节点,数据自然不是全量的了。


Q35 如果联盟链的跑了一段时间之后,节点数据量已经很大了,再新加节点,这个新节点同步数据流程是怎么样的?会不会影响整个链的tps?

A35 可以从已有的节点上,copy data 目录到新节点下,然后启动新节点,这时新节点包含的数据就是最新的链数据。


Q36 我现在只起了4个节点网络, 其中一个节点同步数据块很慢,有没有快速同步区块的方法?

A36 把这个节点加入观察节点,同步完在加入记账列表。


Q37 群组和节点配置只能删除不能修改吗?

A37 是的,只能删除,不能修改;因为如果允许修改的话,新的节点数据和旧的节点数据就会相互交叉,造成数据干扰。


Q38 CA这块支持第三方CA 吗?

A38 支持, CFCA就可以。


Q39 FISCO BCOS 2.5.0、浏览器 2.0添加节点失败{"code":305007,"message":"node error or not alive","data":null}是什么问题?

A39 ip或者rpc端口配置错误。


Q40 一个节点新加入群组,会立马开始参与共识吗?加入群组只需要拿到群组创世块并运行./generator --add_group,不需要同群组的其他机构执行./generator --add_peers吗

A40 最佳示范是新节点添加到群组后,把群组已有的节点peers连接也更新一下,保证群组里的双向互联。


Q41 切换节点身份就卡住是什么情况呢?我在另一个ubuntu服务器可以正常操作,但在centos上就会卡。

A41 这个和节点有关系,addSealer是一笔交易,控制台将addSealer发到某节点上,如果是之前被remove掉的节点,控制台把交易发上去,其它节点也不会接受这个节点转发过去的交易了,其它节点也就不会去共识这笔交易了。


Q42 一个FISCO BCOS的链最少应该有几个节点参加呢?

A42 最少1个,但是不容错,3个以上开始容错,4个允许1个出错,7个允许2个,3f +1 这样来算。


Q43 新建一个群组之后,共识log正常,但是控制台进不去新群组是什么问题呢?

A43 新加群组,/generator/console/conf/applicationContext.xml 文件需要配置。不建议直接开error,推荐生产用info级别,定期清理无用的日志。

供参考:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/manual/configuration.html#id6。


Q44 节点没跑多久,打了好多日志,怎么控制日志级别?

A44 节点config.ini里,配置后重启。


Share: