如何基于IBFT共识启动Besu区块链链上权限配置
IBFT共识模式下Besu启用链上权限的完整操作步骤
核心说明:IBFT共识需至少4个验证节点才能达成2/3以上共识完成出块,单节点运行状态下所有交易都无法被打包确认,必须先完成4节点组网并稳定出块后再执行权限合约部署操作
一、前置准备
- 安装Besu 23.x及以上稳定版本,执行
besu --version可正常返回版本信息 - 配置好Java 17+运行环境
- 创建独立工作目录,例如
~/besu-ibft-perm,所有节点数据、配置、合约文件统一存放于此
二、生成节点密钥与IBFT创世配置
- 在工作目录下创建4个验证节点的数据目录:
mkdir -p Node-{1..4}/data
- 为每个节点生成节点密钥对:
for i in {1..4}; do besu --data-path=Node-$i/data public-key export --to=Node-$i/data/nodeKey.pub done
- 整理4个节点的enode信息,格式为
enode://<节点公钥内容>@127.0.0.1:<p2p端口>,4个节点p2p端口依次分配为30303、30304、30305、30306,HTTP RPC端口依次分配为8545、8546、8547、8548。 - 编写IBFT创世块配置文件
genesis.json,核心配置要求:
config段添加"permissions": {"onchain-permissions-enabled": true}开启链上权限开关config.bft段配置共识参数:"epochlength": 30000, "blockperiodseconds": 2, "requesttimeoutseconds": 10extraData字段的初始验证人列表必须填入全部4个节点的公钥- 为后续部署合约的测试账户(例如
0xfe3b557e8fb62b89f4916b721be55ceb828dbd73)预分配至少10000ETH的测试余额 gasLimit设置为"0x1fffffffffffff",避免合约部署时gas不足
注意:禁止使用单节点测试的创世配置直接启动多节点,初始验证人列表漏填会直接导致网络无法出块。
三、启动4节点网络并验证出块状态
每个节点启动时需携带权限相关基础参数,以Node1为例(其余节点对应修改数据目录、端口配置即可):
besu \ --data-path=Node-1/data \ --genesis-file=./genesis.json \ --rpc-http-enabled \ --rpc-http-api=ETH,NET,IBFT,PERM,ADMIN,WEB3,TXPOOL \ --rpc-http-cors-origins="*" \ --rpc-http-port=8545 \ --p2p-port=30303 \ --permissions-accounts-contract-enabled \ --permissions-nodes-contract-enabled \ --bootnodes=<4个节点的enode地址,用英文逗号分隔>
4个节点全部启动后,多次执行以下命令查询块高:
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://127.0.0.1:8545
若返回的块高数值持续增长,说明IBFT网络已正常达成共识,可执行后续合约部署操作。
四、部署链上权限合约
- 从本地Besu安装路径下的
contracts/permissions目录获取权限合约源码,共包含4个核心文件:NodeRules.sol、AccountRules.sol、PermissionsImplementation.sol、PermissionsInterface.sol,无需额外下载。 - 使用Foundry或Hardhat等合约部署工具,连接Node1的RPC端口
http://127.0.0.1:8545,使用预分配了测试ETH的账户按顺序部署:- 首先部署
PermissionsImplementation.sol,记录部署得到的合约地址 - 部署
PermissionsInterface.sol,构造函数传入上一步得到的Implementation合约地址,记录Interface合约地址 - 调用Implementation合约的公开查询方法,获取
AccountRules和NodeRules两个合约的部署地址
- 首先部署
- 停掉所有运行中的节点,为每个节点的启动命令添加两个参数:
--permissions-accounts-contract-address=<查询到的AccountRules合约地址>--permissions-nodes-contract-address=<查询到的NodeRules合约地址>
- 重新启动4个节点,等待块高恢复正常增长后,执行以下命令验证权限功能:
curl -X POST --data '{"jsonrpc":"2.0","method":"perm_getAccountsWhitelist","params":[],"id":1}' http://127.0.0.1:8545
若接口正常返回账户白名单列表,说明链上权限功能已部署生效。
常见问题排查
- 合约部署交易长时间处于pending状态:检查4个节点的对等连接数是否正常,通过
ibft_getValidatorsByBlockNumber接口查询当前生效验证人数量是否≥4 - 节点重启后权限校验不生效:核对启动参数中两个权限合约地址是否填写正确,创世块中
onchain-permissions-enabled开关是否设为true - 网络无法出块:核对创世块
extraData中初始验证人公钥是否和4个节点的公钥完全匹配,bootnodes配置是否正确
内容的提问来源于stack exchange,提问作者Woojik Chun
相关产品推荐
相关产品推荐

