Hwj's blog - eth
type: channel
link: https://blog.hwj.im/index.php/tag/eth/
items: 在 Geth 如何回滚(或者说删除最后的几个块)

在 Geth 如何回滚(或者说删除最后的几个块)
type: item
date: 2023-04-19T18:09:00+08:00
description: 这文章说的主要是本地架设的测试网络 Private Network事情的起因是因为本人误操作,调整了本地计算机时间(向后调整),导致GETH在挖了一个新的矿后,新的块的时间变成了刚刚调整的计算机时间.导致我再改回正确的时间后,GETH不能正确工作了.一开始寻找"删除块"的办法,找不到,后来有发现 debug 下有这个指令 :setHead以下内容来自官方:debug_setHead Sets the current head of the local chain by block number. Note, this is a destructive action and may severely damage your chain. Use with extreme caution. CLIENT METHOD INVOCATION Go debug.SetHead(number uint64) Console debug.setHead(number) RPC {"method": "debug_setHead", "params": [number]} 翻译: debug_setHead 按区块编号设置本地链的当前头部。注意，这是一个破坏性的动作，可能会严重损害你的链。使用时要特别小心。 比如我出错的这个块,是最新的那个块,获取到它的blocknumbereth.getBlock("latest").number比如这个值是 33138我只要"删除"这个块,那么我可以将目标blockNumber 设置为此值-1 = 33137debug.setHead(33137)实际上这样执行会出错invalid argument 0: json: cannot unmarshal non-string into Go value of type hexutil.Uint64有个办法就是转成 HEX stringdebug.setHead("0x8171")正确了,GETH输出如下:WARN [04-19|17:58:28.474] Rewinding blockchain to block target=33137 INFO [04-19|17:58:28.475] Loaded most recent local block number=33137 hash=f5f231..10bfad td=66275 age=4h48m5s这样,我就"删除"了最后那个不正确的块