链重组(reorgs)发生在竞争链成为新的规范链时。了解如何处理重组对于维护应用程序一致性至关重要。
// 监控重组
const monitorReorgs = async (callback, checkInterval = 5000) => {
let lastBlock = await web3.eth.getBlockNumber();
let lastBlockHash = (await web3.eth.getBlock(lastBlock)).hash;
return setInterval(async () => {
const currentBlock = await web3.eth.getBlockNumber();
const currentBlockHash = (await web3.eth.getBlock(lastBlock)).hash;
if (currentBlockHash !== lastBlockHash) {
// 检测到重组
callback({
oldBlock: lastBlock,
oldHash: lastBlockHash,
newBlock: currentBlock,
newHash: currentBlockHash,
});
}
lastBlock = currentBlock;
lastBlockHash = currentBlockHash;
}, checkInterval);
};
// 获取共同祖先区块
const findCommonAncestor = async (hash1, hash2) => {
let block1 = await web3.eth.getBlock(hash1);
let block2 = await web3.eth.getBlock(hash2);
while (block1.number > block2.number) {
block1 = await web3.eth.getBlock(block1.parentHash);
}
while (block2.number > block1.number) {
block2 = await web3.eth.getBlock(block2.parentHash);
}
while (block1.hash !== block2.hash) {
block1 = await web3.eth.getBlock(block1.parentHash);
block2 = await web3.eth.getBlock(block2.parentHash);
}
return block1;
};