如何在Hyperledger Fabric 1.4.4中配置每区块交易数量?
你遇到的问题核心在于Hyperledger Fabric的区块打包触发逻辑——区块生成是由「交易数量达标」和「超时时间到」两个条件中先满足的那个触发的。虽然你把MaxMessageCount设成了100,完全能容纳21笔交易,但你的BatchTimeout只设置了2秒,这才是导致频繁生成小区块的关键。
问题拆解
Fabric的Orderer节点会持续收集交易,只要满足以下任一条件就会打包成区块:
- 收集到的交易数量达到
MaxMessageCount(你的配置是100) - 从收集第一笔交易开始,等待时间达到
BatchTimeout(你的配置是2秒)
你每10分钟才发送21笔交易,平均每秒仅0.035笔,远达不到100的阈值。所以每过2秒,Orderer就会把当前收集到的少量交易打包成一个区块,这就是为什么你会看到6、6、5、4这样的分块结果。
解决方案
要实现每10分钟生成1个包含21笔交易的区块,你需要调整BatchTimeout的配置,让它覆盖你的交易发送周期:
修改configtx.yaml中的BatchTimeout
把BatchTimeout从2s改成600s(也就是10分钟):# Batch Timeout: The amount of time to wait before creating a batch BatchTimeout: 600s # Batch Size: Controls the number of messages batched into a block BatchSize: # Max Message Count: The maximum number of messages to permit in a batch MaxMessageCount: 100 # Absolute Max Bytes: The absolute maximum number of bytes allowed for # the serialized messages in a batch. AbsoluteMaxBytes: 98 MB # Preferred Max Bytes: The preferred maximum number of bytes allowed for # the serialized messages in a batch. A message larger than the preferred # max bytes will result in a batch larger than preferred max bytes. PreferredMaxBytes: 512 KB重新生成通道配置更新文件
基于修改后的configtx.yaml,生成通道的配置更新文件(假设你的通道名为mychannel):configtxgen -profile YourChannelProfile -outputAnchorPeersUpdate ./channel_update.tx -channelID mychannel注意替换
YourChannelProfile为你实际使用的通道配置profile名称。提交通道配置更新
通过peer节点提交配置更新到通道,让Orderer节点应用新的配置:peer channel update -f channel_update.tx -c mychannel -o orderer.example.com:7050 --tls --cafile /path/to/orderer/tls/ca.crt替换命令中的Orderer地址、证书路径等为你实际环境的参数。
验证配置生效
发送21笔交易后,观察区块生成情况:应该会在10分钟左右生成一个包含所有21笔交易的区块。如果交易发送完成的时间早于10分钟,Orderer会等待到超时时间再打包;如果在10分钟内交易数量达到MaxMessageCount(这里是100),则会提前打包。
额外注意事项
- 如果你的交易发送时间可能有波动,可以把
BatchTimeout设为稍长于最长的交易发送周期,比如11分钟(660s),确保所有交易都能被收集到同一个区块中。 - 修改通道配置需要拥有通道的修改权限,确保你的peer节点有足够的权限执行
peer channel update命令。
内容的提问来源于stack exchange,提问作者Juliatzin

