Geth 事务未广播并停滞在待处理状态

Geth transactions not broadcast and stuck in pending state

提问人:abcuse1111 提问时间:11/14/2023 更新时间:11/14/2023 访问量:27

问:

通过 docker 容器设置三个 Geth 专用网络节点(Clique)。它们部署在三个不同的 VM 上。在 3 个节点中,有一个矿工节点用于挖掘区块,一个 RPC 节点用于接受 RPC 请求,以及一个引导对等节点用于连接两者。这个启动节点逐个连接到矿机和RPC节点,而RPC和矿机节点没有直接连接。

发现的问题:有时当有交易时,它们会卡在待处理状态,从不广播。这种情况是随机发生的,有时交易可以由矿工处理,但有时它们只是永远停留在待处理的交易中,重新启动 Geth 节点根本不起作用。

气体和随机数没有问题。另外,如果我手动通过admin.addPeer()将我的RPC节点连接到矿工节点,使这个3节点专用网络完全连接,那么这种情况就完全消失了,一切都变得正常了,这笔交易可以由矿工处理。问题似乎是,如果RPC节点不直接连接到矿工,它有时不会广播我的交易。

另外一个值得一提的情况是:区块可以在内网内同步,得到相同的数量 eth.blockNumber,但有时 RPC 节点可能会同步得很慢,比如矿工现在已经挖了 100 个区块,而 RPC 可能只同步到 80 个区块,而 eth.syncing 返回 false,虽然最终会赶上区块, 它有时会落后于矿工。

系统信息 Geth 版本:Geth/v1.11.6 操作系统和版本:Ubuntu 22.04 矿机启动命令: RPC启动命令:--nodekey=miner.key --bootnodes="enode://${BOOTNODE_KEY}@${BOOTNODE_IP}:${BOOTNODE_PORT}" --syncmode=full --gcmode=archive --miner.etherbase=${ADDR} --mine --miner.threads=1 --networkid=${NETWORK_ID} --unlock=${ADDR} --password=password --allow-insecure-unlock --verbosity=5--nodekey=rpc.key --bootnodes="enode://${BOOTNODE_KEY}@${BOOTNODE_IP}:${BOOTNODE_PORT}" --syncmode=full --gcmode=archive --networkid=${NETWORK_ID} --http --http.vhosts="" --http.addr="0.0.0.0" --http.port=8545 --http.corsdomain=""

预期行为 交易成功广播和挖掘。

实际行为 交易有时不在专用网络内广播。 RPC 的 txpooltxpool.inspect { pending: { 0x55FAac070a63F809eDF68D72856Ea88c183171C8: { 0: "contract creation: 0 wei + 5171633 gas × 2000000000 wei", 1: "contract creation: 0 wei + 4398916 gas × 2000000000 wei", 2: "contract creation: 0 wei + 5131938 gas × 2000000000 wei" } }, queued: {} }

矿机和启动节点的 txpool

txpool.inspect { pending: {}, queued: {} }

我在 Github issue 上发布了同样的问题: https://github.com/ethereum/go-ethereum/issues/28518 另外,我认为我的问题与 https://github.com/ethereum/go-ethereum/issues/22308#issuecomment-781940794 非常相似

交易成功广播和挖掘。

区块链 GO-以太坊

评论


答: 暂无答案