这文章说的主要是本地架设的测试网络 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
按区块编号设置本地链的当前头部。注意,这是一个破坏性的动作,可能会严重损害你的链。使用时要特别小心。

比如我出错的这个块,是最新的那个块,获取到它的blocknumber

eth.getBlock("latest").number

比如这个值是 33138

我只要"删除"这个块,那么我可以将目标blockNumber 设置为此值-1 = 33137

debug.setHead(33137)

实际上这样执行会出错

invalid argument 0: json: cannot unmarshal non-string into Go value of type hexutil.Uint64

有个办法就是转成 HEX string

debug.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

这样,我就"删除"了最后那个不正确的块

标签: geth, eth