As of this writing, the algorithm employed for difficulty adjustment in the CryptoNote reference code is known by the Monero Research Lab to be flawed. We describe and illustrate the nature of the flaw and recommend a solution. By dishonestly reporting timestamps, attackers can gain disproportionate control over network difficulty. We verify this route of attack by auditing the CryptoNote reference difficulty adjustment code, which, we reimplement in the Python programming language. We use a stochastic model of blockchain growth to test the CryptoNote reference difficulty formula against the more traditional Bitcoin difficulty formula. This allows us to test our difficulty formula against various hash rate scenarios. This research bulletin has not undergone peer review, and reflects only the results of internal investigation.
In mathematics, a rational number is any number that can be expressed as the quotient
or fraction p/q of two integers, a numerator p and a non-zero denominator q. Since q
may be equal to 1, every integer is a rational number. The set of all rational numbers,
often referred to as ”the rationals”, is usually denoted by a boldface Q (or blackboard
bold , Unicode ); it was thus denoted in 1895 by Giuseppe Peano after quoziente, Italian
for ”quotient”. The decimal expansion of a rational number always either terminates
after a finite number of digits or begins to repeat the same finite sequence of digits over
and over. Moreover, any repeating or terminating decimal represents a rational number.
These statements hold true not just for base 10, but also for any other integer base (e.g.
binary, hexadecimal). A real number that is not rational is called irrational. Irrational
numbers include √2, , e, and . The decimal expansion of an irrational number continues
without repeating. Since the set of rational numbers is countable, and the set of real
numbers is uncountable, almost allreal numbers are irrational.
The Art, Science, and Engineering of Programming is a new journal created with the goal of placing the wonderful art of programming in the map of scholarly works. Many academic journals and conferences exist that publish research related to programming, starting with programming languages, software engineering, and expanding to the whole Computer Science field. Yet, many of us feel that, as the field of Computer Science expanded, programming, in itself, has been neglected to a secondary role not worthy of scholarly attention. That is a serious gap, as much of the progress in Computer Science lies on the basis of computer programs, the people who write them, and the concepts and tools available to them to express computational tasks.
The Art, Science, and Engineering of Programming aims at closing this gap by focusing primarily on programming: the art itself (programming styles, pearls, models, languages), the emerging science of understanding what works and what doesn’t work in general and in specific contexts, as well as more established engineering and mathematical perspectives.
This is an example of and a guide to writing articles for The Art, Science, and Engineering of Programming.