I had a synced geth node (syncmode default = snap). After restarting the machine geth starts to sync again. Ten hours are passed but still syncing. In the log file i see a lot of State heal in process.

Can someone explain in the following line

State heal in progress  [email protected]    slots=383,[email protected] [email protected] nodes=40,904,[email protected] pending=97731

that the: Accounts, slots, codes, nodes mean and which value indicating that the process is close to end.

P.S. I restarted the geth and accounts start for 0 again..

  • 1
    I don't have an answer, but here is some helpful information about how low IOPS performance can cause the state healing to go on forever: eth-docker.net/docs/Usage/ResourceUsage/#initial-sync-times I measured mine to be adequate, but I also can't "parse" the log messages to understand how much healing is still left.
    – Kennu
    Dec 26, 2021 at 15:47

2 Answers 2


I am certainly not an expert on this yet, but I would assume that the accounts figure will have to reach the total # of Ethereum accounts.

I have not been able to find a good chart on the growth of Eth accounts, except for this chart that stops in Jan 2020 at 80+ million. But I would say: As long as your state heal runs faster than the growth of Eth accounts (roughly 100.000 per day, iirc), it should terminate at some point.

Hoping for somebody to correct me if I am wrong...

Also see this question with the same explanation, which I posted separately because I didn't have enough reputation yet to answer protected questions.


Taken from go-ethereum github -

  • accounts: Number of accounts downloaded during the healing stage
  • slots: Number of storage slots downloaded during the healing stage
  • codes: Number of bytecodes downloaded
  • nodes: Number of state trie nodes downloaded
  • pending: Pending returns the number of state entries currently pending for download.

Can see most of these here.

    var (
        trienode = fmt.Sprintf("%v@%v", log.FormatLogfmtUint64(s.trienodeHealSynced), s.trienodeHealBytes.TerminalString())
        bytecode = fmt.Sprintf("%v@%v", log.FormatLogfmtUint64(s.bytecodeHealSynced), s.bytecodeHealBytes.TerminalString())
        accounts = fmt.Sprintf("%v@%v", log.FormatLogfmtUint64(s.accountHealed), s.accountHealedBytes.TerminalString())
        storage  = fmt.Sprintf("%v@%v", log.FormatLogfmtUint64(s.storageHealed), s.storageHealedBytes.TerminalString())
    log.Info("State heal in progress", "accounts", accounts, "slots", storage,
        "codes", bytecode, "nodes", trienode, "pending", s.healer.scheduler.Pending())

Not the answer you're looking for? Browse other questions tagged or ask your own question.