6

I looked up log2_work inside main.cpp and I can't follow its calculation by log(chainActive.Tip()->nChainWork.getdouble())/log(2.0).

a) What is -> explicitely indicating? (I'm at basic level of C++)

b) And what is log2_work exactly saying? Does it quantify the effort of calculation?

Related Question: here

Aliakbar Ahmadi
  • 1,625
  • 1
  • 11
  • 22

1 Answers1

10

FYI the code under discussion is available here on GitHub.

-> is a member access operator in C++, just as . is. They both expect the name of an object's member on the right (e.g. a member function or variable). The difference is that . expects an object on the left, whereas -> expects a pointer to an object which it first dereferences.

So chainActive.Tip()->nChainWork.getdouble() starts with the active chain, gets a pointer to a CBlockIndex object which represents the current tip, dereferences that pointer and gets the total chain work of the tip (which is a 256 bit integer), and converts it to a double.

Next it calculates natural_log(total_chain_work) / natural_log(2), which is the same as calculating log_base_2(total_chain_work). I presume this is simply to make the output smaller, as opposed to having to output the entire (much longer) total_chain_work.

If you'd like to get it back into the total_chain_work format used in older versions, just calculate 2log2_work, e.g. pow(2.0, log2_work).

Christopher Gurnee
  • 2,493
  • 15
  • 22
  • 2
    Minor correction: the ´log´ function in C and C++ computes the natural logarithm (base *e*), not base 10. – Nate Eldredge May 07 '15 at 06:30
  • 1
    What's the "total chain work of the tip"? What's the "tip" (I assume the currently known head of the "best" blockchain)? If I see e.g. `log2_work=69.1234` what does it tell me? – Flow May 08 '15 at 08:53
  • 8
    @Flow Yes, the "tip" is the most recent block in the "best" chain. The "total chain work" is the number of SHA-256d hashes that would be required (on average) to recreate the entire chain up to and including this tip (assuming the same the difficulty *target* of each block in the best chain). The "best" chain is the chain whose total work is greatest. If you see `log2_work=82.749277` (which is the current `log2_work` according to my node), it means that the total work (approximate total # of hashes calculated) is about 2^82.749277 ≈ 8.12858 * 10^24. – Christopher Gurnee May 08 '15 at 12:33