diff --git a/CMakeLists.txt b/CMakeLists.txt index f1f894dd7..38a63fe5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,15 @@ else() message(STATUS "Building without build tag") endif() +# Update and init submodules by default +if(NOT MANUAL_SUBMODULES) + find_package(Git) + if(GIT_FOUND) + message(STATUS "Initializing submodules") + execute_process(COMMAND git "submodule" "update" "--init" "--recursive" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + endif() +endif() + if(NOT MANUAL_SUBMODULES) find_package(Git) if(GIT_FOUND) @@ -236,7 +245,7 @@ endif() set_property(GLOBAL PROPERTY USE_FOLDERS ON) enable_testing() -option(BUILD_DOCUMENTATION "Build the Doxygen documentation." ON) +option(BUILD_DOCUMENTATION "Build the Doxygen documentation." OFF) option(BUILD_TESTS "Build tests." OFF) # Check whether we're on a 32-bit or 64-bit system diff --git a/Makefile b/Makefile index f9270ebf2..dae0f44e7 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ debug-static-win32: cmake-release: mkdir -p $(builddir)/release - cd $(builddir)/release && cmake -D CMAKE_BUILD_TYPE=Release $(topdir) + cd $(builddir)/release && cmake -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=Release $(topdir) release: cmake-release cd $(builddir)/release && $(MAKE) @@ -88,11 +88,11 @@ release-test: release-all: mkdir -p $(builddir)/release - cd $(builddir)/release && cmake -D BUILD_TESTS=ON -D CMAKE_BUILD_TYPE=release $(topdir) && $(MAKE) + cd $(builddir)/release && cmake -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=release $(topdir) && $(MAKE) release-static: mkdir -p $(builddir)/release - cd $(builddir)/release && cmake -D STATIC=ON -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=release $(topdir) && $(MAKE) + cd $(builddir)/release && cmake -D BUILD_TESTS=OFF -D STATIC=ON -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=release $(topdir) && $(MAKE) coverage: mkdir -p $(builddir)/debug diff --git a/README.md b/README.md index 284a0377d..22a4d438d 100644 --- a/README.md +++ b/README.md @@ -1,566 +1,107 @@ -# Monero +# ~~Mo~~Wownero - Such privacy! Many coins! Wow! 🐕 Copyright (c) 2014-2018 The Monero Project. Portions Copyright (c) 2012-2013 The Cryptonote developers. -## Development resources +## Resources -- Web: [getmonero.org](https://getmonero.org) -- Forum: [forum.getmonero.org](https://forum.getmonero.org) -- Mail: [dev@getmonero.org](mailto:dev@getmonero.org) -- GitHub: [https://github.com/monero-project/monero](https://github.com/monero-project/monero) -- IRC: [#monero-dev on Freenode](https://webchat.freenode.net/?randomnick=1&channels=%23monero-dev&prompt=1&uio=d4) +- Web: [wownero.org](http://wownero.org) +- Twitter: [@w0wn3r0](https://twitter.com/w0wn3r0) +- Discord: [discord.gg/sQt74ep](https://discord.gg/sQt74ep) +- Reddit: [/r/wownero](https://www.reddit.com/r/wownero) +- Mail: [wownero@protonmail.com](mailto:wownero@protonmail.com) +- GitHub: [https://github.com/wownero/wownero](https://github.com/wownero/wownero) +- IRC: [#wownero on Freenode](https://kiwiirc.com/client/irc.freenode.net/?nick=suchchatter|?#wownero) +- Bitmessage Chan: wownero (`BM-2cSzWtrj2pzLva9GF1Jp2TYsnLjrnJpvba`) +- Network stats: [https://freeboard.io/board/c8mM2c](https://freeboard.io/board/c8mM2c) +- Wownero Funding System: [https://funding.wownero.com](https://funding.wownero.com) +- Keybase Chat Group: [https://keybase.io/team/wownero](https://keybase.io/team/wownero) -## Vulnerability response - -- Our [Vulnerability Response Process](https://github.com/monero-project/meta/blob/master/VULNERABILITY_RESPONSE_PROCESS.md) encourages responsible disclosure -- We are also available via [HackerOne](https://hackerone.com/monero) - -## Announcements - -- You can subscribe to an [announcement listserv](https://lists.getmonero.org) to get critical announcements from the Monero core team. The announcement list can be very helpful for knowing when software updates are needed. - -## Build - -### IMPORTANT - -These builds are of the master branch, which is used for active development and can be either unstable or incompatible with release software. Please compile release branches. - -| Operating System | Processor | Status | -| --------------------- | -------- |--------| -| Ubuntu 16.04 | i686 | [![Ubuntu 16.04 i686](https://build.getmonero.org/png?builder=monero-static-ubuntu-i686)](https://build.getmonero.org/builders/monero-static-ubuntu-i686) -| Ubuntu 16.04 | amd64 | [![Ubuntu 16.04 amd64](https://build.getmonero.org/png?builder=monero-static-ubuntu-amd64)](https://build.getmonero.org/builders/monero-static-ubuntu-amd64) -| Ubuntu 16.04 | armv7 | [![Ubuntu 16.04 armv7](https://build.getmonero.org/png?builder=monero-static-ubuntu-arm7)](https://build.getmonero.org/builders/monero-static-ubuntu-arm7) -| Debian Stable | armv8 | [![Debian armv8](https://build.getmonero.org/png?builder=monero-static-debian-armv8)](https://build.getmonero.org/builders/monero-static-debian-armv8) -| OSX 10.10 | amd64 | [![OSX 10.10 amd64](https://build.getmonero.org/png?builder=monero-static-osx-10.10)](https://build.getmonero.org/builders/monero-static-osx-10.10) -| OSX 10.11 | amd64 | [![OSX 10.11 amd64](https://build.getmonero.org/png?builder=monero-static-osx-10.11)](https://build.getmonero.org/builders/monero-static-osx-10.11) -| OSX 10.12 | amd64 | [![OSX 10.12 amd64](https://build.getmonero.org/png?builder=monero-static-osx-10.12)](https://build.getmonero.org/builders/monero-static-osx-10.12) -| FreeBSD 11 | amd64 | [![FreeBSD 11 amd64](https://build.getmonero.org/png?builder=monero-static-freebsd64)](https://build.getmonero.org/builders/monero-static-freebsd64) -| DragonFly BSD 4.6 | amd64 | [![DragonFly BSD amd64](https://build.getmonero.org/png?builder=monero-static-dragonflybsd-amd64)](https://build.getmonero.org/builders/monero-static-dragonflybsd-amd64) -| Windows (MSYS2/MinGW) | i686 | [![Windows (MSYS2/MinGW) i686](https://build.getmonero.org/png?builder=monero-static-win32)](https://build.getmonero.org/builders/monero-static-win32) -| Windows (MSYS2/MinGW) | amd64 | [![Windows (MSYS2/MinGW) amd64](https://build.getmonero.org/png?builder=monero-static-win64)](https://build.getmonero.org/builders/monero-static-win64) - -## Coverage - -| Type | Status | -|-----------|--------| -| Coverity | [![Coverity Status](https://scan.coverity.com/projects/9657/badge.svg)](https://scan.coverity.com/projects/9657/) -| Coveralls | [![Coveralls Status](https://coveralls.io/repos/github/monero-project/monero/badge.svg?branch=master)](https://coveralls.io/github/monero-project/monero?branch=master) -| License | [![License](https://img.shields.io/badge/license-BSD3-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) +Blockchain Explorers +- https://explore.wownero.com +- https://explorer.wowkira.com +- http://explorer.wowne.ro +- http://wow4edxxxudchgj7.onion +- http://wow5eqtzqvsg5jctqzg5g7uk3u62sfqiacj5x6lo4by7bvnj6jkvubyd.onion ## Introduction -Monero is a private, secure, untraceable, decentralised digital currency. You are your bank, you control your funds, and nobody can trace your transfers unless you allow them to do so. - -**Privacy:** Monero uses a cryptographically sound system to allow you to send and receive funds without your transactions being easily revealed on the blockchain (the ledger of transactions that everyone has). This ensures that your purchases, receipts, and all transfers remain absolutely private by default. - -**Security:** Using the power of a distributed peer-to-peer consensus network, every transaction on the network is cryptographically secured. Individual wallets have a 25 word mnemonic seed that is only displayed once, and can be written down to backup the wallet. Wallet files are encrypted with a passphrase to ensure they are useless if stolen. - -**Untraceability:** By taking advantage of ring signatures, a special property of a certain type of cryptography, Monero is able to ensure that transactions are not only untraceable, but have an optional measure of ambiguity that ensures that transactions cannot easily be tied back to an individual user or computer. - -## About this project - -This is the core implementation of Monero. It is open source and completely free to use without restrictions, except for those specified in the license agreement below. There are no restrictions on anyone creating an alternative implementation of Monero that uses the protocol and network in a compatible manner. - -As with many development projects, the repository on Github is considered to be the "staging" area for the latest changes. Before changes are merged into that branch on the main repository, they are tested by individual developers in their own branches, submitted as a pull request, and then subsequently tested by contributors who focus on testing and code reviews. That having been said, the repository should be carefully considered before using it in a production environment, unless there is a patch in the repository for a particular show-stopping issue you are experiencing. It is generally a better idea to use a tagged release for stability. - -**Anyone is welcome to contribute to Monero's codebase!** If you have a fix or code change, feel free to submit it as a pull request directly to the "master" branch. In cases where the change is relatively small or does not affect other parts of the codebase it may be merged in immediately by any one of the collaborators. On the other hand, if the change is particularly large or complex, it is expected that it will be discussed at length either well in advance of the pull request being submitted, or even directly on the pull request. - -## Supporting the project - -Monero is a 100% community-sponsored endeavor. If you want to join our efforts, the easiest thing you can do is support the project financially. Both Monero and Bitcoin donations can be made to **donate.getmonero.org** if using a client that supports the [OpenAlias](https://openalias.org) standard. Alternatively you can send XMR to the Monero donation address via the `donate` command (type `help` in the command-line wallet for details). - -The Monero donation address is: `44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A` (viewkey: `f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c389501`) - -The Bitcoin donation address is: `1KTexdemPdxSBcG55heUuTjDRYqbC5ZL8H` - -Core development funding and/or some supporting services are also graciously provided by sponsors: - -[](https://mymonero.com) -[](https://kitware.com) -[](https://dome9.com) -[](https://araxis.com) -[](https://www.jetbrains.com/) -[](https://www.navicat.com/) -[](https://www.symas.com/) - -There are also several mining pools that kindly donate a portion of their fees, [a list of them can be found on our Bitcointalk post](https://bitcointalk.org/index.php?topic=583449.0). - -## License - -See [LICENSE](LICENSE). - -## Contributing - -If you want to help out, see [CONTRIBUTING](CONTRIBUTING.md) for a set of guidelines. +Wownero is a privacy-centric memecoin that was fairly launched on April 1, 2018 with no pre-mine, stealth-mine or ICO. Wownero has a maximum supply of around 184 million WOW with a slow and steady emission over 50 years. It is a fork of Monero, but with its own genesis block, so there is no degradation of privacy due to ring signatures using different participants for the same tx outputs on opposing forks. ## Scheduled software upgrades -Monero uses a fixed-schedule software upgrade (hard fork) mechanism to implement new features. This means that users of Monero (end users and service providers) should run current versions and upgrade their software on a regular schedule. Software upgrades occur during the months of April and October. The required software for these upgrades will be available prior to the scheduled date. Please check the repository prior to this date for the proper Monero software version. Below is the historical schedule and the projected schedule for the next upgrade. +Wownero uses a fixed-schedule software upgrade (hard fork) mechanism to implement new features. This means that users of Wownero (end users and service providers) should run current versions and upgrade their software on a regular schedule. The required software for these upgrades will be available prior to the scheduled date. Please check the repository prior to this date for the proper Wownero software version. Below is the historical schedule and the projected schedule for the next upgrade. Dates are provided in the format YYYY-MM-DD. -| Software upgrade block height | Date | Fork version | Minimum Monero version | Recommended Monero version | Details | + +| Software upgrade block height | Date | Release Name | Minimum Wownero version | Recommended Wownero version | Details | | ------------------------------ | -----------| ----------------- | ---------------------- | -------------------------- | ---------------------------------------------------------------------------------- | -| 1009827 | 2016-03-22 | v2 | v0.9.4 | v0.9.4 | Allow only >= ringsize 3, blocktime = 120 seconds, fee-free blocksize 60 kb | -| 1141317 | 2016-09-21 | v3 | v0.9.4 | v0.10.0 | Splits coinbase into denominations | -| 1220516 | 2017-01-05 | v4 | v0.10.1 | v0.10.2.1 | Allow normal and RingCT transactions | -| 1288616 | 2017-04-15 | v5 | v0.10.3.0 | v0.10.3.1 | Adjusted minimum blocksize and fee algorithm | -| 1400000 | 2017-09-16 | v6 | v0.11.0.0 | v0.11.0.0 | Allow only RingCT transactions, allow only >= ringsize 5 | -| 1546000 | 2018-04-06 | v7 | v0.12.0.0 | v0.12.3.0 | Cryptonight variant 1, ringsize >= 7, sorted inputs -| 1685555 | 2018-10-18 | v8 | v0.13.0.0 | v0.13.0.0 | max transaction size at half the penalty free block size, bulletproofs enabled, cryptonight variant 2, fixed ringsize [11](https://youtu.be/KOO5S4vxi0o) -| 1686275 | 2018-10-19 | v9 | v0.13.0.0 | v0.13.0.0 | bulletproofs required -| 1788000 | 2019-03-09 | v10 | v0.14.0.0 | v0.14.0.0 | Cryptonight-R PoW, new block weight algorithm, slightly more efficient RingCT format -| 1788720 | 2019-03-10 | v11 | v0.14.0.0 | v0.14.0.0 | forbid old RingCT transaction format +| 1 | 2018-04-01 | Awesome Akita | v0.1.0.0 | v0.1.0.0 | Cryptonight variant 1, ringsize >= 8, sorted inputs +| 6969 | 2018-04-24 | Busty Brazzers | v0.2.0.0 | v0.2.0.0 | Bulletproofs, LWMA difficulty algorithm, ringsize >= 10, reduce unlock to 4 +| 53666 | 2018-10-06 | Cool Cage | v0.3.0.0 | v0.3.1.3 | Cryptonight variant 2, LWMA v2, ringsize = 22, MMS +| 63469 | 2018-11-11 | Dank Doge | v0.4.0.0 | v0.4.0.0 | LWMA v4 +| 81769 | 2019-02-19 | Erotic EggplantEmoji | v0.5.0.0 | v0.5.0.2 | Cryptonight/wow, LWMA v1 with N=144, Updated Bulletproofs, Fee Per Byte, Auto-churn X's indicate that these details have not been determined as of commit date. -## Release staging schedule and protocol +## Release staging and Contributing -Approximately three months prior to a scheduled software upgrade, a branch from Master will be created with the new release version tag. Pull requests that address bugs should then be made to both Master and the new release branch. Pull requests that require extensive review and testing (generally, optimizations and new features) should *not* be made to the release branch. +**Anyone is welcome to contribute to Wownero's codebase!** -## Compiling Monero from source +If you have a fix or code change, feel free to submit it as a pull request. Ahead of a scheduled software upgrade, a development branch will be created with the new release version tag. Pull requests that address bugs should be made to Master. Pull requests that require review and testing (generally, optimizations and new features) should be made to the development branch. All pull requests will be considered safe until the US dollar valuation of 1 Wownero equals $1000. After this valuation has been reached, more research will be needed to introduce experimental cryptography and/or code into the codebase. -### Dependencies - -The following table summarizes the tools and libraries required to build. A -few of the libraries are also included in this repository (marked as -"Vendored"). By default, the build uses the library installed on the system, -and ignores the vendored sources. However, if no library is found installed on -the system, then the vendored source will be built and used. The vendored -sources are also used for statically-linked builds because distribution -packages often include only shared library binaries (`.so`) but not static -library archives (`.a`). - -| Dep | Min. version | Vendored | Debian/Ubuntu pkg | Arch pkg | Fedora | Optional | Purpose | -| ------------ | ------------- | -------- | ------------------ | ------------ | ----------------- | -------- | -------------- | -| GCC | 4.7.3 | NO | `build-essential` | `base-devel` | `gcc` | NO | | -| CMake | 3.5 | NO | `cmake` | `cmake` | `cmake` | NO | | -| pkg-config | any | NO | `pkg-config` | `base-devel` | `pkgconf` | NO | | -| Boost | 1.58 | NO | `libboost-all-dev` | `boost` | `boost-devel` | NO | C++ libraries | -| OpenSSL | basically any | NO | `libssl-dev` | `openssl` | `openssl-devel` | NO | sha256 sum | -| libzmq | 3.0.0 | NO | `libzmq3-dev` | `zeromq` | `cppzmq-devel` | NO | ZeroMQ library | -| OpenPGM | ? | NO | `libpgm-dev` | `libpgm` | `openpgm-devel` | NO | For ZeroMQ | -| libunbound | 1.4.16 | YES | `libunbound-dev` | `unbound` | `unbound-devel` | NO | DNS resolver | -| libsodium | ? | NO | `libsodium-dev` | `libsodium` | `libsodium-devel` | NO | cryptography | -| libunwind | any | NO | `libunwind8-dev` | `libunwind` | `libunwind-devel` | YES | Stack traces | -| liblzma | any | NO | `liblzma-dev` | `xz` | `xz-devel` | YES | For libunwind | -| libreadline | 6.3.0 | NO | `libreadline6-dev` | `readline` | `readline-devel` | YES | Input editing | -| ldns | 1.6.17 | NO | `libldns-dev` | `ldns` | `ldns-devel` | YES | SSL toolkit | -| expat | 1.1 | NO | `libexpat1-dev` | `expat` | `expat-devel` | YES | XML parsing | -| GTest | 1.5 | YES | `libgtest-dev`^ | `gtest` | `gtest-devel` | YES | Test suite | -| Doxygen | any | NO | `doxygen` | `doxygen` | `doxygen` | YES | Documentation | -| Graphviz | any | NO | `graphviz` | `graphviz` | `graphviz` | YES | Documentation | - - -[^] On Debian/Ubuntu `libgtest-dev` only includes sources and headers. You must -build the library binary manually. This can be done with the following command ```sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv libg* /usr/lib/ ``` - -Debian / Ubuntu one liner for all dependencies -``` sudo apt update && sudo apt install build-essential cmake pkg-config libboost-all-dev libssl-dev libzmq3-dev libunbound-dev libsodium-dev libunwind8-dev liblzma-dev libreadline6-dev libldns-dev libexpat1-dev doxygen graphviz libpgm-dev``` - -### Cloning the repository - -Clone recursively to pull-in needed submodule(s): - -`$ git clone --recursive https://github.com/monero-project/monero` - -If you already have a repo cloned, initialize and update: - -`$ cd monero && git submodule init && git submodule update` - -### Build instructions - -Monero uses the CMake build system and a top-level [Makefile](Makefile) that -invokes cmake commands as needed. - -#### On Linux and OS X - -* Install the dependencies -* Change to the root of the source code directory, change to the most recent release branch, and build: - - cd monero - git checkout v0.14.0.1 - make - - *Optional*: If your machine has several cores and enough memory, enable - parallel build by running `make -j` instead of `make`. For - this to be worthwhile, the machine should have one core and about 2GB of RAM - available per thread. - - *Note*: If cmake can not find zmq.hpp file on OS X, installing `zmq.hpp` from - https://github.com/zeromq/cppzmq to `/usr/local/include` should fix that error. - - *Note*: The instructions above will compile the most stable release of the - Monero software. If you would like to use and test the most recent software, - use ```git checkout master```. The master branch may contain updates that are - both unstable and incompatible with release software, though testing is always - encouraged. - -* The resulting executables can be found in `build/release/bin` - -* Add `PATH="$PATH:$HOME/monero/build/release/bin"` to `.profile` - -* Run Monero with `monerod --detach` - -* **Optional**: build and run the test suite to verify the binaries: - - make release-test - - *NOTE*: `core_tests` test may take a few hours to complete. - -* **Optional**: to build binaries suitable for debugging: - - make debug - -* **Optional**: to build statically-linked binaries: - - make release-static - -Dependencies need to be built with -fPIC. Static libraries usually aren't, so you may have to build them yourself with -fPIC. Refer to their documentation for how to build them. - -* **Optional**: build documentation in `doc/html` (omit `HAVE_DOT=YES` if `graphviz` is not installed): - - HAVE_DOT=YES doxygen Doxyfile - -#### On the Raspberry Pi - -Tested on a Raspberry Pi Zero with a clean install of minimal Raspbian Stretch (2017-09-07 or later) from https://www.raspberrypi.org/downloads/raspbian/. If you are using Raspian Jessie, [please see note in the following section](#note-for-raspbian-jessie-users). - -* `apt-get update && apt-get upgrade` to install all of the latest software - -* Install the dependencies for Monero from the 'Debian' column in the table above. - -* Increase the system swap size: -``` - sudo /etc/init.d/dphys-swapfile stop - sudo nano /etc/dphys-swapfile - CONF_SWAPSIZE=1024 - sudo /etc/init.d/dphys-swapfile start -``` -* Clone monero and checkout most recent release version: -``` - git clone https://github.com/monero-project/monero.git - cd monero - git checkout tags/v0.14.0.1 -``` -* Build: -``` - make release -``` -* Wait 4-6 hours - -* The resulting executables can be found in `build/release/bin` - -* Add `PATH="$PATH:$HOME/monero/build/release/bin"` to `.profile` - -* Run Monero with `monerod --detach` - -* You may wish to reduce the size of the swap file after the build has finished, and delete the boost directory from your home directory - -#### *Note for Raspbian Jessie users:* - -If you are using the older Raspbian Jessie image, compiling Monero is a bit more complicated. The version of Boost available in the Debian Jessie repositories is too old to use with Monero, and thus you must compile a newer version yourself. The following explains the extra steps, and has been tested on a Raspberry Pi 2 with a clean install of minimal Raspbian Jessie. - -* As before, `apt-get update && apt-get upgrade` to install all of the latest software, and increase the system swap size - -``` - sudo /etc/init.d/dphys-swapfile stop - sudo nano /etc/dphys-swapfile - CONF_SWAPSIZE=1024 - sudo /etc/init.d/dphys-swapfile start -``` - -* Then, install the dependencies for Monero except `libunwind` and `libboost-all-dev` - -* Install the latest version of boost (this may first require invoking `apt-get remove --purge libboost*` to remove a previous version if you're not using a clean install): -``` - cd - wget https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2 - tar xvfo boost_1_64_0.tar.bz2 - cd boost_1_64_0 - ./bootstrap.sh - sudo ./b2 -``` -* Wait ~8 hours -``` - sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a install -``` -* Wait ~4 hours - -* From here, follow the [general Raspberry Pi instructions](#on-the-raspberry-pi) from the "Clone monero and checkout most recent release version" step. - -#### On Windows: - -Binaries for Windows are built on Windows using the MinGW toolchain within -[MSYS2 environment](https://www.msys2.org). The MSYS2 environment emulates a -POSIX system. The toolchain runs within the environment and *cross-compiles* -binaries that can run outside of the environment as a regular Windows -application. - -**Preparing the build environment** - -* Download and install the [MSYS2 installer](https://www.msys2.org), either the 64-bit or the 32-bit package, depending on your system. -* Open the MSYS shell via the `MSYS2 Shell` shortcut -* Update packages using pacman: - - pacman -Syuu - -* Exit the MSYS shell using Alt+F4 -* Edit the properties for the `MSYS2 Shell` shortcut changing "msys2_shell.bat" to "msys2_shell.cmd -mingw64" for 64-bit builds or "msys2_shell.cmd -mingw32" for 32-bit builds -* Restart MSYS shell via modified shortcut and update packages again using pacman: - - pacman -Syuu - - -* Install dependencies: - - To build for 64-bit Windows: - - pacman -S mingw-w64-x86_64-toolchain make mingw-w64-x86_64-cmake mingw-w64-x86_64-boost mingw-w64-x86_64-openssl mingw-w64-x86_64-zeromq mingw-w64-x86_64-libsodium mingw-w64-x86_64-hidapi - - To build for 32-bit Windows: - - pacman -S mingw-w64-i686-toolchain make mingw-w64-i686-cmake mingw-w64-i686-boost mingw-w64-i686-openssl mingw-w64-i686-zeromq mingw-w64-i686-libsodium mingw-w64-i686-hidapi - -* Open the MingW shell via `MinGW-w64-Win64 Shell` shortcut on 64-bit Windows - or `MinGW-w64-Win64 Shell` shortcut on 32-bit Windows. Note that if you are - running 64-bit Windows, you will have both 64-bit and 32-bit MinGW shells. - -**Cloning** - -* To git clone, run: - - git clone --recursive https://github.com/monero-project/monero.git - -**Building** - -* Change to the cloned directory, run: - - cd monero - -* If you would like a specific [version/tag](https://github.com/monero-project/monero/tags), do a git checkout for that version. eg. 'v0.14.0.1'. If you dont care about the version and just want binaries from master, skip this step: - - git checkout v0.14.0.1 - -* If you are on a 64-bit system, run: - - make release-static-win64 - -* If you are on a 32-bit system, run: - - make release-static-win32 - -* The resulting executables can be found in `build/release/bin` - -* **Optional**: to build Windows binaries suitable for debugging on a 64-bit system, run: - - make debug-static-win64 - -* **Optional**: to build Windows binaries suitable for debugging on a 32-bit system, run: - - make debug-static-win32 - -* The resulting executables can be found in `build/debug/bin` - -### On FreeBSD: - -The project can be built from scratch by following instructions for Linux above. If you are running monero in a jail you need to add the flag: `allow.sysvipc=1` to your jail configuration, otherwise lmdb will throw the error message: `Failed to open lmdb environment: Function not implemented`. - -We expect to add Monero into the ports tree in the near future, which will aid in managing installations using ports or packages. - -### On OpenBSD: - -#### OpenBSD < 6.2 - -This has been tested on OpenBSD 5.8. - -You will need to add a few packages to your system. `pkg_add db cmake gcc gcc-libs g++ gtest`. - -The doxygen and graphviz packages are optional and require the xbase set. - -The Boost package has a bug that will prevent librpc.a from building correctly. In order to fix this, you will have to Build boost yourself from scratch. Follow the directions here (under "Building Boost"): -https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md - -You will have to add the serialization, date_time, and regex modules to Boost when building as they are needed by Monero. - -To build: `env CC=egcc CXX=eg++ CPP=ecpp DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/path/to/the/boost/you/built make release-static-64` - -#### OpenBSD >= 6.2 - -You will need to add a few packages to your system. `pkg_add cmake zeromq libiconv`. - -The doxygen and graphviz packages are optional and require the xbase set. - - -Build the Boost library using clang. This guide is derived from: https://github.com/bitcoin/bitcoin/blob/master/doc/build-openbsd.md - -We assume you are compiling with a non-root user and you have `doas` enabled. - -Note: do not use the boost package provided by OpenBSD, as we are installing boost to `/usr/local`. - -``` -# Create boost building directory -mkdir ~/boost -cd ~/boost - -# Fetch boost source -ftp -o boost_1_64_0.tar.bz2 https://netcologne.dl.sourceforge.net/project/boost/boost/1.64.0/boost_1_64_0.tar.bz2 - -# MUST output: (SHA256) boost_1_64_0.tar.bz2: OK -echo "7bcc5caace97baa948931d712ea5f37038dbb1c5d89b43ad4def4ed7cb683332 boost_1_64_0.tar.bz2" | sha256 -c -tar xfj boost_1_64_0.tar.bz2 - -# Fetch and apply boost patches, required for OpenBSD -ftp -o boost_test_impl_execution_monitor_ipp.patch https://raw.githubusercontent.com/openbsd/ports/bee9e6df517077a7269ff0dfd57995f5c6a10379/devel/boost/patches/patch-boost_test_impl_execution_monitor_ipp -ftp -o boost_config_platform_bsd_hpp.patch https://raw.githubusercontent.com/openbsd/ports/90658284fb786f5a60dd9d6e8d14500c167bdaa0/devel/boost/patches/patch-boost_config_platform_bsd_hpp - -# MUST output: (SHA256) boost_config_platform_bsd_hpp.patch: OK -echo "1f5e59d1154f16ee1e0cc169395f30d5e7d22a5bd9f86358f738b0ccaea5e51d boost_config_platform_bsd_hpp.patch" | sha256 -c -# MUST output: (SHA256) boost_test_impl_execution_monitor_ipp.patch: OK -echo "30cec182a1437d40c3e0bd9a866ab5ddc1400a56185b7e671bb3782634ed0206 boost_test_impl_execution_monitor_ipp.patch" | sha256 -c - -cd boost_1_64_0 -patch -p0 < ../boost_test_impl_execution_monitor_ipp.patch -patch -p0 < ../boost_config_platform_bsd_hpp.patch - -# Start building boost -echo 'using clang : : c++ : "-fvisibility=hidden -fPIC" "" "ar" "strip" "ranlib" "" : ;' > user-config.jam -./bootstrap.sh --without-icu --with-libraries=chrono,filesystem,program_options,system,thread,test,date_time,regex,serialization,locale --with-toolset=clang -./b2 toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" -sICONV_PATH=/usr/local -doas ./b2 -d0 runtime-link=shared threadapi=pthread threading=multi link=static variant=release --layout=tagged --build-type=complete --user-config=user-config.jam -sNO_BZIP2=1 -sICONV_PATH=/usr/local --prefix=/usr/local install -``` - -Build cppzmq - -Build the cppzmq bindings. - -We assume you are compiling with a non-root user and you have `doas` enabled. - -``` -# Create cppzmq building directory -mkdir ~/cppzmq -cd ~/cppzmq - -# Fetch cppzmq source -ftp -o cppzmq-4.2.3.tar.gz https://github.com/zeromq/cppzmq/archive/v4.2.3.tar.gz - -# MUST output: (SHA256) cppzmq-4.2.3.tar.gz: OK -echo "3e6b57bf49115f4ae893b1ff7848ead7267013087dc7be1ab27636a97144d373 cppzmq-4.2.3.tar.gz" | sha256 -c -tar xfz cppzmq-4.2.3.tar.gz - -# Start building cppzmq -cd cppzmq-4.2.3 -mkdir build -cd build -cmake .. -doas make install -``` - -Build monero: `env DEVELOPER_LOCAL_TOOLS=1 BOOST_ROOT=/usr/local make release-static` - -### On Solaris: - -The default Solaris linker can't be used, you have to install GNU ld, then run cmake manually with the path to your copy of GNU ld: - - mkdir -p build/release - cd build/release - cmake -DCMAKE_LINKER=/path/to/ld -D CMAKE_BUILD_TYPE=Release ../.. - cd ../.. - -Then you can run make as usual. - -### On Linux for Android (using docker): - - # Build image (for ARM 32-bit) - docker build -f utils/build_scripts/android32.Dockerfile -t monero-android . - # Build image (for ARM 64-bit) - docker build -f utils/build_scripts/android64.Dockerfile -t monero-android . - # Create container - docker create -it --name monero-android monero-android bash - # Get binaries - docker cp monero-android:/src/build/release/bin . - -### Building portable statically linked binaries (Cross Compiling) - -By default, in either dynamically or statically linked builds, binaries target the specific host processor on which the build happens and are not portable to other processors. Portable binaries can be built using the following targets: - -* ```make release-static-linux-x86_64``` builds binaries on Linux on x86_64 portable across POSIX systems on x86_64 processors -* ```make release-static-linux-i686``` builds binaries on Linux on x86_64 or i686 portable across POSIX systems on i686 processors -* ```make release-static-linux-armv8``` builds binaries on Linux portable across POSIX systems on armv8 processors -* ```make release-static-linux-armv7``` builds binaries on Linux portable across POSIX systems on armv7 processors -* ```make release-static-linux-armv6``` builds binaries on Linux portable across POSIX systems on armv6 processors -* ```make release-static-win64``` builds binaries on 64-bit Windows portable across 64-bit Windows systems -* ```make release-static-win32``` builds binaries on 64-bit or 32-bit Windows portable across 32-bit Windows systems - -## Installing Monero from a package - -**DISCLAIMER: These packages are not part of this repository or maintained by this project's contributors, and as such, do not go through the same review process to ensure their trustworthiness and security.** +## Installing from a package Packages are available for -* Ubuntu and [snap supported](https://snapcraft.io/docs/core/install) systems, via a community contributed build. +* Arch Linux/Manjaro - snap install monero --beta + yay -S wownero-git -Installing a snap is very quick. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto update when a new version is released. +* NixOS -* Arch Linux (via [AUR](https://aur.archlinux.org/)): - - Stable release: [`monero`](https://aur.archlinux.org/packages/monero) - - Bleeding edge: [`monero-git`](https://aur.archlinux.org/packages/monero-git) + nix-shell -p altcoins.wownero -* Void Linux: +* Ubuntu 18.04/Ubuntu 16.04/Debian 9/Debian 8 (amd64) - xbps-install -S monero - -* GuixSD - - guix package -i monero - -* Docker - - # Build using all available cores - docker build -t monero . - - # or build using a specific number of cores (reduce RAM requirement) - docker build --build-arg NPROC=1 -t monero . - - # either run in foreground - docker run -it -v /monero/chain:/root/.bitmonero -v /monero/wallet:/wallet -p 18080:18080 monero - - # or in background - docker run -it -d -v /monero/chain:/root/.bitmonero -v /monero/wallet:/wallet -p 18080:18080 monero - -* The build needs 3 GB space. -* Wait one hour or more + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B09DF0E4B0C56A94 + sudo add-apt-repository "deb http://ppa.wownero.com/ bionic main" + sudo apt-get update + sudo apt-get install wownero Packaging for your favorite distribution would be a welcome contribution! -You can also cross-compile binaries on linux for windows and macos with the depends system. Go to contrib/depends and type: +**DISCLAIMER: These packages are not part of this repository, and as such, do not go through the same review process to ensure their trustworthiness and security.** -* ```make HOST=x86_64-linux-gnu``` for 64-bit linux binaries. -* ```make HOST=x86_64-w64-mingw32``` for 64-bit windows binaries. Requires: python3 nsis g++-mingw-w64-x86-64 wine1.6 bc -* ```make HOST=x86_64-apple-darwin11``` for darwin binaries. Requires: cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools python-dev -* ```make HOST=i686-linux-gnu``` for 32-bit linux binaries. Requires: g++-multilib bc -* ```make HOST=i686-w64-mingw32``` for 32-bit windows binaries. Requires: python3 nsis g++-mingw-w64-i686 -* ```make HOST=arm-linux-gnueabihf``` for armv6 binaries. Requires: g++-arm-linux-gnueabihf -The required packages are the names for each toolchain on apt. Depending on your distro, they may have different names. -Then go back to the source dir and type for example for windows 64bit: +## Building from Source -* ```cmake -DCMAKE_TOOLCHAIN_FILE=`pwd`/contrib/depends/x86_64-w64-mingw32``` +* Arch Linux/Manjaro -Using depends might also be easier to compile monero on windows than using msys. Activate windows subsystem for linux (for example ubuntu) install the apt build-essentials and follow the depends steps as depicted above. + sudo pacman -Syu && sudo pacman -S base-devel cmake boost openssl zeromq libpgm unbound libsodium git + git clone https://github.com/wownero/wownero + cd wownero + make -## Running monerod + +* Debian/Ubuntu + + sudo apt update && sudo apt install build-essential cmake pkg-config libboost-all-dev libssl-dev libzmq3-dev libunbound-dev libsodium-dev libpgm-dev git + git clone https://github.com/wownero/wownero + cd wownero + make + + +## Running Binaries The build places the binary in `bin/` sub-directory within the build directory from which cmake was invoked (repository root by default). To run in foreground: - ./bin/monerod + ./bin/wownerod -To list all available options, run `./bin/monerod --help`. Options can be +To list all available options, run `./bin/wownerod --help`. Options can be specified either on the command line or in a configuration file passed by the `--config-file` argument. To specify an option in the configuration file, add a line with the syntax `argumentname=value`, where `argumentname` is the name @@ -568,130 +109,39 @@ of the argument without the leading dashes, for example `log-level=1`. To run in background: - ./bin/monerod --log-file monerod.log --detach + ./bin/wownerod --log-file wownerod.log --detach To run as a systemd service, copy -[monerod.service](utils/systemd/monerod.service) to `/etc/systemd/system/` and -[monerod.conf](utils/conf/monerod.conf) to `/etc/`. The [example -service](utils/systemd/monerod.service) assumes that the user `monero` exists +[wownerod.service](utils/systemd/wownerod.service) to `/etc/systemd/system/` and +[wownerod.conf](utils/conf/wownerod.conf) to `/etc/`. The [example +service](utils/systemd/wownerod.service) assumes that the user `wownero` exists and its home is the data directory specified in the [example -config](utils/conf/monerod.conf). +config](utils/conf/wownerod.conf). -If you're on Mac, you may need to add the `--max-concurrency 1` option to -monero-wallet-cli, and possibly monerod, if you get crashes refreshing. +Once node is synced to network, run the CLI wallet by entering: -## Internationalization + ./bin/wownero-wallet-cli -See [README.i18n.md](README.i18n.md). +Type `help` in CLI wallet to see standard commands (for advanced options, type `help_advanced`). -## Using Tor +## Wownero Graphical Wallets -While Monero isn't made to integrate with Tor, it can be used wrapped with torsocks, by -setting the following configuration parameters and environment variables: +* [Wownero-Light-Wallet](https://github.com/wownero/Wownero-Light-Wallet) -* `--p2p-bind-ip 127.0.0.1` on the command line or `p2p-bind-ip=127.0.0.1` in - monerod.conf to disable listening for connections on external interfaces. -* `--no-igd` on the command line or `no-igd=1` in monerod.conf to disable IGD - (UPnP port forwarding negotiation), which is pointless with Tor. -* `DNS_PUBLIC=tcp` or `DNS_PUBLIC=tcp://x.x.x.x` where x.x.x.x is the IP of the - desired DNS server, for DNS requests to go over TCP, so that they are routed - through Tor. When IP is not specified, monerod uses the default list of - servers defined in [src/common/dns_utils.cpp](src/common/dns_utils.cpp). -* `TORSOCKS_ALLOW_INBOUND=1` to tell torsocks to allow monerod to bind to interfaces - to accept connections from the wallet. On some Linux systems, torsocks - allows binding to localhost by default, so setting this variable is only - necessary to allow binding to local LAN/VPN interfaces to allow wallets to - connect from remote hosts. On other systems, it may be needed for local wallets - as well. -* Do NOT pass `--detach` when running through torsocks with systemd, (see - [utils/systemd/monerod.service](utils/systemd/monerod.service) for details). -* If you use the wallet with a Tor daemon via the loopback IP (eg, 127.0.0.1:9050), - then use `--untrusted-daemon` unless it is your own hidden service. +![](https://light.wownero.com/wowlight.png) -Example command line to start monerod through Tor: - DNS_PUBLIC=tcp torsocks monerod --p2p-bind-ip 127.0.0.1 --no-igd +* [Wownerujo Android Wallet](https://github.com/wownero/wownerujo) -### Using Tor on Tails +![](https://fossdroid.com/images/screenshots/com.wownero.wownerujo/wownerujo-1.png) +![](https://fossdroid.com/images/screenshots/com.wownero.wownerujo/wownerujo-2.png) -TAILS ships with a very restrictive set of firewall rules. Therefore, you need -to add a rule to allow this connection too, in addition to telling torsocks to -allow inbound connections. Full example: +## Donating to Wownero Project - sudo iptables -I OUTPUT 2 -p tcp -d 127.0.0.1 -m tcp --dport 18081 -j ACCEPT - DNS_PUBLIC=tcp torsocks ./monerod --p2p-bind-ip 127.0.0.1 --no-igd --rpc-bind-ip 127.0.0.1 \ - --data-dir /home/amnesia/Persistent/your/directory/to/the/blockchain +Developers are volunteers doing this mostly for shits and giggles. If you would like to support our shenanigans and stimulant addictions, please consider donating to [WFS proposals](https://funding.wownero.com/proposals) or the [dev slush fund](https://funding.wownero.com/donate). -## Debugging +Donations may also be sent to: -This section contains general instructions for debugging failed installs or problems encountered with Monero. First ensure you are running the latest version built from the Github repo. +XMR: `44SQVPGLufPasUcuUQSZiF5c9BFzjcP8ucDxzzFDgLf1VkCEFaidJ3u2AhSKMhPLKA3jc2iS8wQHFcaigM6fXmo6AnFRn5B` -### Obtaining stack traces and core dumps on Unix systems - -We generally use the tool `gdb` (GNU debugger) to provide stack trace functionality, and `ulimit` to provide core dumps in builds which crash or segfault. - -* To use gdb in order to obtain a stack trace for a build that has stalled: - -Run the build. - -Once it stalls, enter the following command: - -``` -gdb /path/to/monerod `pidof monerod` -``` - -Type `thread apply all bt` within gdb in order to obtain the stack trace - -* If however the core dumps or segfaults: - -Enter `ulimit -c unlimited` on the command line to enable unlimited filesizes for core dumps - -Enter `echo core | sudo tee /proc/sys/kernel/core_pattern` to stop cores from being hijacked by other tools - -Run the build. - -When it terminates with an output along the lines of "Segmentation fault (core dumped)", there should be a core dump file in the same directory as monerod. It may be named just `core`, or `core.xxxx` with numbers appended. - -You can now analyse this core dump with `gdb` as follows: - -`gdb /path/to/monerod /path/to/dumpfile` - -Print the stack trace with `bt` - -* To run monero within gdb: - -Type `gdb /path/to/monerod` - -Pass command-line options with `--args` followed by the relevant arguments - -Type `run` to run monerod - -### Analysing memory corruption - -There are two tools available: - -* ASAN - -Configure Monero with the -D SANITIZE=ON cmake flag, eg: - - cd build/debug && cmake -D SANITIZE=ON -D CMAKE_BUILD_TYPE=Debug ../.. - -You can then run the monero tools normally. Performance will typically halve. - -* valgrind - -Install valgrind and run as `valgrind /path/to/monerod`. It will be very slow. - -### LMDB - -Instructions for debugging suspected blockchain corruption as per @HYC - -There is an `mdb_stat` command in the LMDB source that can print statistics about the database but it's not routinely built. This can be built with the following command: - -`cd ~/monero/external/db_drivers/liblmdb && make` - -The output of `mdb_stat -ea ` will indicate inconsistencies in the blocks, block_heights and block_info table. - -The output of `mdb_dump -s blocks ` and `mdb_dump -s block_info ` is useful for indicating whether blocks and block_info contain the same keys. - -These records are dumped as hex data, where the first line is the key and the second line is the data. +BTC: `bc1qcw9zglp3fxyl25zswemw7jczlqryms2lsmu464` diff --git a/src/blockchain_db/blockchain_db.cpp b/src/blockchain_db/blockchain_db.cpp index 682857157..0d25762d2 100644 --- a/src/blockchain_db/blockchain_db.cpp +++ b/src/blockchain_db/blockchain_db.cpp @@ -372,582 +372,7 @@ void BlockchainDB::fixup() LOG_PRINT_L1("Database is opened read only - skipping fixup check"); return; } - - // There was a bug that would cause key images for transactions without - // any outputs to not be added to the spent key image set. There are two - // instances of such transactions, in blocks 202612 and 685498. - // The key images below are those from the inputs in those transactions. - // On testnet, there are no such transactions - // See commit 533acc30eda7792c802ea8b6417917fa99b8bc2b for the fix - static const char * const mainnet_genesis_hex = "418015bb9ae982a1975da7d79277c2705727a56894ba0fb246adaabb1f4632e3"; - crypto::hash mainnet_genesis_hash; - epee::string_tools::hex_to_pod(mainnet_genesis_hex, mainnet_genesis_hash ); set_batch_transactions(true); - batch_start(); - - if (get_block_hash_from_height(0) == mainnet_genesis_hash) - { - // block 202612 (511 key images in 511 transactions) - static const char * const key_images_202612[] = - { - "51fc647fb27439fbb3672197d2068e4110391edf80d822f58607bd5757cba7f3", - "d8cf1c1bd41f13c4553186e130e6e2c1cd80135ddb418f350088926997a95ca9", - "95d2556c8acd1457dce7bfd9c83b1d82b821a55a9c9588b04b7b5cf562a65949", - "4b5d987fee1bb563a162d23e41741ad73560c003e26a09b6655f09496538daac", - "1d25ea86323d1578579d3894a54b99ea1c3e2dca547c6726c44aef67db958b02", - "92e46fb70be5d9df39ca83c4fc6ae26c594118314bb75502a9c9752a781d0b33", - "924d0cb9060d429be7e59d164a0f80a4dabc3607d44401b26fb93e7182ab435d", - "f63e4a23fec860fd4c3734623891330ac1ff5af251e83a0e6247287818b8a72f", - "5b14c5ef13738d015619b61dacefc2ade3660d25b35ef96330a8f4e2afc26526", - "d5016b012a2fb6ca23fd56ece544d847962264b4aee15efe1465805fd824a8fb", - "0a7f3da1d9dd341cd96829e484b07163099763ac7bd60603b7ee14f7dbcb278d", - "d716c03d7447d2b693f6f61b6ad36bd57344033fc1a11feaf60d569f40014530", - "23154a812e99ce226f6a87087e0812f419aed51289f1c0c359b0b61303b53a36", - "03940341e1a99d5b0c68eacfdf5a20df90d7d0a3d6089d39709cdd964490755c", - "ef09648814cfe071f5d8e9cfde57247ad09409265c4b6c84697bbb046809bd7e", - "8843ec52b0496ca4e895813cfe00bb18ea777d3618e9bd2e200287e888e2f5c7", - "8558bf39baf3df62b5d33cdf97163a365e6c44f4d6deef920730b4982b66449f", - "504d9380ce581de0af97d5800d5ca9e61d78df368907151ab1e567eb6445332a", - "673797763593c23b3ee07b43bd8760365e2c251a8a60a275528ff34a477110cc", - "25178c95e4d402c58d79c160d2c52dd3c45db2c78e6aaa8d24d35c64f19d4957", - "407c3a05dcc8bdcb0446b5d562cf05b4536fc7337344765215130d5f1e7ee906", - "4e7fa771a5455d8ee8295f01181a360cdc6467cc185c2834c7daf9fbf85b6f1d", - "6beb64cb024f9c5c988f942177fc9c1ec5ecfa85b7db0f13a17f9f98e8e46fe7", - "6406bfc4e486e64c889ea15577d66e5835c65c6a39ec081af8ac5acdc153b4b5", - "1b1da638709f9f85898af70ffaa5b88d5a4c9f2663ca92113c400ab25caf553c", - "da49407a9e1ed27abd28076a647177157c42517e2542e9b6a4921fdadf4e8742", - "3c3fdba2a792fddaeb033605163991a09933e8f05c6c934d718e50a613b64d69", - "82c60429171173739fa67c4807cab359620299e6ed2a9da80139b5b1e23c5456", - "0a19e5767e1381ac16f57cfa5aabd8463551d19f069f7f3465c11a8583253f3e", - "d0fae6ffdd4818399eae6224978f170f696150eaf699f2f218abc00c68530f96", - "0937889aeb3af5c64608d9a9f88229a068e53417448f00f9aa5e28c570cca8f8", - "d6072d269753020912524961ce8c6930cf35abe5c4b2bdc7fd678338d20a68fb", - "0e8bc9b06fcc842bdaa7df029bfd1f252d5defc014d58a006c10ab678ecf543f", - "9d42f90520f02c9258be53b123d69ddbce5f33f92a903d3fb4cf3358ff0e07b5", - "1cc05416b12cbe719617158773c3e6173435fc64e1ee44310dc696baecaeaa95", - "266b15222913c11ef6403ee15dc42c8c0e16bc5fa2f49110447802236e045797", - "791b123af3b71ac9497a010610f72207ff8ec642969b5cf0d2891b21e7eee562", - "946d4d7b084dc32495f22b35fc30394144c8e0ba04f3ad6e2c2bfb0173a2266d", - "2c015cb990c1583228d08b2d5de9227b950c3f57364fc1033bca5c0fbfd08c58", - "13fdc41862fd85507f579c69accb9cc6a40f5971bfa41e3caff598a3dcffd2fc", - "64b06d9874a83917c583c9439d1c736083377d67fda2961b623f7124663134c3", - "2fa49cd19e0aa02989991a4c3760f44be800fe8fb4d58b23aca382e10dc0d2d6", - "377628f265f799772e9fb6065be8b6eee200c329f729fe36c25ee179e4d20df9", - "ba94fa79134ce383b6a98b04dc6ad3d1b950e410d50a292bc770f9685e59fe91", - "875c924329f0733e31fe8d8aed70dc1906335b8a9984932b6368ea24edb39765", - "f31f4abb3f5ee42a5aae86d70b3bd9a9c1934933641893864dd333f89719d608", - "2bcd629e125514a780f568d3c2e8b12a2e7fbbee06e652bbeed3e7825508e31c", - "918b43581163ca1963de21bb9ac401756e75c3f00ac8dcfafc139f1ad5d7d998", - "5730dd57fa52749a0d6502b11c9d802ac495875542431310c674a65655b7c2a3", - "03f84b990683e569e2f6143bb963a2a8de411e7c4b7923117b94c7afcb4b43ea", - "b298c8510d35bd2be0ff0753ad7d98d480f4c6490bb67fb93cd4632ea726e8a7", - "0a771afbf9be104c01b89eaeb57073297d35ac8fbbcc0816820fdb9a29d26625", - "713d90d6ca1be1a4e05a5f8441dc528c699caa09eda49c09072f5f8291354c2e", - "988827f45c19330d9404309f63d536a447803cca7cb182ef005b074def09ab7d", - "9dcaa105b4def895f3faee704c250bdc924316f153cb972f3fb565beec0b7942", - "1c06c30afe65b59e9e22d6bb454e4209a03efe53cdbf27b3945d5d75b1b90427", - "49e08c13d1da209ec1aea7b7fbe0daa648e30febeb2aa5ffbaaabdd71a278ac2", - "e1c2e49ab7b829854c46a64772ded35459908e0f563edbcf5c612913b7767046", - "e08bb7d133490ca85a6325d46807170cd07618b6a5f6e1d069e44890cc366fab", - "5c73ca0691cde2f35b7933d6db33f0b642ec70d0bd3f2b0ebbd97754ca67e248", - "6404399151872a521dae767311712225dba65d810ba2feba209204221b5d772d", - "4a0c3aa6cef36f44edf08ad8fb1533d7e1186e317da8a3afb3d81af072043233", - "104b3e1af37cf10b663a7ec8452ea882082018c4d5be4cd49e7f532e2fea64e5", - "e723a46bf9684b4476c3005eb5c26511c58b7eb3c708ddf7470ee30a40834b32", - "18e6f0fa3aa779a73ceefabea27bff3202003fd2c558ec5f5d07920528947d57", - "c97e73eb593ff39e63307220796cc64974c0c8adac860a2559ab47c49bc0c860", - "13c363a962955b00db6d5a68b8307cd900ae9202d9b2deb357b8d433545244ac", - "76a488865151fab977d3639bac6cba4ba9b52aa17d28ac3580775ed0bff393e4", - "a14de587c9f4cd50bb470ecffd10026de97b9b5e327168a0a8906891d39d4319", - "b1d38ee1c4ca8ae2754a719706e6f71865e8c512310061b8d26438fedf78707e", - "772bb8a3f74be96fa84be5fa8f9a8ef355e2df54869c2e8ae6ad2bf54ed5057e", - "3083a7011da36be63e3f7cacd70ab52e364dd58783302f1cb07535a66b5735f5", - "2b1d892e3002aa3201deb4ffe28c0c43b75b8f30c96b5d43f6d5829049ecbd94", - "cb738aabe44c6fb17ade284bf27db0169e309bf8cf9c91c4e4e62856619a4c64", - "1707e04b792f4953f460f217b9bb94c84cef60736a749fb01277cfe0eaaa48c7", - "ab8b6bac9b8a4f00b78acb4bd50ed2758e0fa100964b6f298d2a943eb2af2b30", - "dd317193fef72490f3be01293b29e9c2f94eda10824a76ca74bf39dd7cb40ab2", - "4fb3d995b087af7517fcb79e71f43bac0c4fbda64d89417a40ca4a708f2e8bc1", - "549ba38c31bf926b2cb7e8f7f15d15df6388dce477a3aff0245caa44606849fc", - "7585c14ab9abbffb89d0fa9f00c78ecae9f7c9062e5d4f1fae8453b3951fc60b", - "953f855323f72461b7167e3df0f4fd746a06f5a7f98aa42acdce2eef822a0b2f", - "0931932d57dde94dcfb017179a5a0954b7d671422149738260a365ca44f50eb8", - "a3d179d16a4a275a3bb0f260cee9284db243abad637a9dbe92d02940f1c7ee8c", - "959843f1e76ff0785dafe312c2ea66380fdc32b9d6180920f05f874c74599a80", - "fbc36b3e1718fe6c338968b04caa01a7adb315d206abc63e56768d69e008a65d", - "f054de7eac5e2ea48072e7fb4db93594c5f5d2dfa0afe8266042b6adc80dfdca", - "39dfc68dc6ba8c457b2995562c867cef2f2cf994e8d6776a6b20869e25053f70", - "19ad7ca7629758c22ac83643605c8a32a6665bae8e35dbc9b4ad90343756ebb3", - "e89e80ea5c64cf7840f614f26e35a12c9c3091fa873e63b298835d9eda31a9ea", - "572c1b9a83c947f62331b83009cc2ec9e62eab7260b49929388e6500c45cd917", - "df0b21f679e6c0bf97f7b874e9f07c93c3467b092f3d9e1484e5646fda6eca5f", - "8f3b7c0f4b403af62fe83d3cfac3f1e2572af8afa4cea3f3e2e04291efe84cf6", - "aae8b8db243009d021d8c9897d52ee8125a17212f0a8b85f681ad8950ae45f0e", - "3d45a4957d27447dea83d9ae2ef392a3a86619bfcf8dda2db405a7b304997797", - "a5b0a619a8e3030b691bdba1ed951cd54e4bc2063602eae26d9791fb18e60301", - "14650df217dd64a2905cd058114e761502dff37d40e80789200bc53af29b265f", - "fd6a245ab5e4e6e18d7ba9b37478ce38248f0ab864e5511d2208ae3d25017e5f", - "fbe0be6dd42a11feb5db5ae56fcbbac41041ab04a35f1df075580e960c8eeab0", - "72f3f1213d9bec92ba9705b447d99cd0a6a446e37a3c1c50bb8ece1090bfe56e", - "20df836554e1534f62b2a6df9ce58e11c1b9b4746ce8ee3c462300a8c01f5e76", - "5c3d2a81b7331c86420ad32b6e9a212b73b1c3413724a0f91bf073eba18e2f1f", - "63264ddfb29cd36fc18f3ee6614c4101ba7229bc5ac375f912590d3f0df982f4", - "5ec4eb637761c1c9dbc6aa6649d4410508ef8d25d61ad6caa40c6ee3236d5515", - "270c70940536017915e1cdbc003de7279ec1c94cba1ef6130f4236f7e306e4f0", - "c1d1d57a7c03f6ddeeab5230a4910db8355e2143f473dea6e1d57c2f8d882b76", - "218c030a7fdc9917e9f87e2921e258d34d7740a68b5bee48a392b8a2acf1f347", - "ac47861c01c89ea64abee14cf6e1f317859ed56b69ae66377dc63e6575b7b1eb", - "23bf549c8a03f9870983c8098e974308ec362354b0dcf636c242a88f24fc2718", - "a3ce8b817e5212c851c6b95e693849a396c79b0d04b2a554de9b78933fbea2b7", - "7310120c1cc1961b0d3fce13743c8a7075ae426fe6cccaf83600f24cee106236", - "8fa0630f193777dcc4f5eccd1ad9ceacf80acdf65e52e4e01bf3a2b2fdd0dac6", - "4a5f5c87f67d573d0673f01abaebc26eaa62e6d04627588549cc9e6c142dc994", - "78971cccacc645116f9d380c167f955d54b386a22af112233f7de004fc0c8316", - "badc67216868e1de1bbe044bf0e6070e6ee0353d05c13fa0c43b1897db5219a2", - "c45b2a168bc51cbb615a79f97432cc4bb6b104da9cdc1fc640c930657452f71b", - "c17eda13541d14554c5db542155b08b6bf9cb403d425745b662ebc2b2b9b3a3b", - "313210cd9d2efc1603f07859bae7bd5fb5914f4a631b943f2f6ff5927a4e681a", - "6ee94ec8af4e6828f9b46c590ea55da640ef50e810a247d3e8cdf4b91c42d2c2", - "505b7a4d9f1ba6577aa2a941843f86c205b23b1ea21035925e587022e2f0aeed", - "98e6a7cd687e8192e300a8202999ec31ad57bc34f656f2ae90d148607ff6d29f", - "1be5db002c0a446cc2c1da363e5d08ae045cd8f5e76c8cccd65d5166393c0bdf", - "17c02ac6d390c5c735e1e873c40294220e89071fca08a5da396a131fa1ba8670", - "2540507c39ae6fdcd90de826077f0ca390da126166a25c15c048a60606a27367", - "5ab9328e525c7a017ef4f591d995ad4595d74cbf8ff4112af33b08c70661a304", - "9c105587a96c51d81422f64e46016564d22329760648c95dcac7218f3733f915", - "525afb1b94a75f1edc2b55c700071e14a2166acda003370047c30dba8ea80278", - "745d4a5d9f95ca4efa6261b6bcd4ecacd504b5b901a2ce1353c522a5c0c15dcc", - "5a5a568cd87ba34252ba254e6a320e1a7f52f13e7451bb887efb34ff881785f2", - "1ec50a80198cd830b51f4f7a0222015a268d9b40f04e7f838c7b8dc7abf63b01", - "68836b662d79349cb42f5cef54e6a066157d398cc87d3b13f29fc04e5cf364a5", - "658db317f355a9cbd86f673775cac0c308fe14967428fd283a36e300a6a53b2f", - "677d79a8c467dd9db38f0ef45c2787dd368f701a6b47bf7a5f06112c38da643e", - "2baa455d4066f5d628f9ecd315cb57deca71069db5d0d112ae0aa18a84b6f0d7", - "5e7b0889f351560081360ac2b1429b48b2f7d886227f144e3b198e2f1fa56ed9", - "c3d317fbf26e15add8b4f8f93df9de9b22297b8e4945ebab9ee249d4f72f4e45", - "3c0b705a5c1e31abc7e46d8ff3c148a033f6875454cfb67f8d2a2b9a57a5ba7e", - "a0ab74663561af2adc2d38be3569fbe7aa2454346416ac96e5eb26b1e01b1e2f", - "53526cffdb74327670566c1dacacffb7d30a43a7f1862ff8bab87737bfa5edb6", - "24c5d36ab98d88f87b2c71afb4ea8562e05c7aa0b50f3bc0f9ed50a4cd52989b", - "c3ce4de5f94dff65d11e33a865855a4404259cf45263914c884f79db4f35169d", - "f1009b6dcf30030cff872d636fb96ed233eb6ecb8ffed003c7da64e4f5a02f4c", - "e3729f58614d3b42450d1599d863983ab7e3e5c29fb57aad7958c8923a2627c4", - "31cf4792f7b5ce01b217ec80184edd2a7c49c0b21701f5494ee2c9bac67c28ca", - "b42a5c9c92a656c5bb2b759ce160fdfd245243aeb1786338faea63b62e9a60ce", - "a1efc8d5d0855933d5ac8fe5960c7acacb92fcb09bfbc929e5002f168251e648", - "c4322c7f3682ec94b0dcb42f13b498c36cf575d505aacc8ec8bf67a6a2abf4c9", - "684ee5aa3c98357aeaddcc30c6620939b52aeef729e24b4a46ccafc44f24d831", - "36180f2ae11d105e0efbfbddb94e6b45b08609a383e4e1a8fa3b06d7a8051de9", - "96c2d183eacc87581a0b17b8d07878bc10d436728510715109a7565d9972f8b5", - "3068c9d04d561c7e29e3f621280b61a61885de0e9ec35a66a3116ca7a9e09627", - "2eb94b9673ad6f8f88288fddfceae4baaeccb37bed88a35611d826ba06a5363b", - "fc8cd5fae8b81121001f7767dcd5f185c0fdcc88cce1fbb184ddbcfad697ba54", - "51521da1ecedea6d588d774eb155d936b32a14913c2f11d989bcc5116e65bf41", - "3d23542e597a83dd6307700d79058b920f281c65f832333734d8a0adec510495", - "11d2e01913ff0d4bd21970d709d88e63289492c0bbad7bff99c0d36858a841ca", - "de674f1eee3068d2bc8c2f2897d8556e5deb872869652f7d3a4e5dbc6f1063c8", - "e722d7f728526110c0921791b417afde4af1e87ae48ccc01911786197843104b", - "aaba3a4e2a7d20ab76edfbcccefc27acfd509db3638582c28230e73ffd71d340", - "1385a7209dafb9622dd4274179832e40c7fae19445383c34ef79adb0e4de0c98", - "108408531fca288d74de4a2c596eab8569e355d9ab2f8380f4d24073a6b3fa95", - "294476a86fcd39351ae452cdb8af9584067ec4501ec6182d0062bb154559fed3", - "e64b175e0284c5cb69c8db46344ed43b5ced8abfe3cbf0c197103cfd116944cd", - "cdd73a0f1fa7c14ed2177ae2163035333718847e49dd5cca6775bd20fc7553ad", - "d423d2a374bc66a4587a5e3affa327ca75b8116051320759a3b88a868a7b80d4", - "f13ad1e5b1315557d5497b58516eb3b0759d909725ddd0eb8a0dee439c6c0a48", - "3a600b547a6061186a54e491344fd50cc7d4f0566a386a40aba6545254773728", - "37a6f3f221fe17cc04a65aa544d5135e8297ecaf0853ba784dffacb74feb481b", - "0ca42d67d0f84b28861d63e919e6ce5ad527447fdc53a03d8497a0241bee9376", - "c7dbda42459e6fadb92c416eaef3e04674fc57915a93f3be4e656634c9654075", - "0e34d728ae4fe347a5afecdf886fbd4d48a65c5d0dfab807da6ae95b6b2d7a3a", - "f1bc69257ed510db5b2ed370010b037f452a29c49e36337264b3011ce2516216", - "33f98f6b8a8e202463955998fba3b790199daa893e5471554826cfd9daa5c02f", - "f8a0a37a2c9ebd7022d7cded1ee0318fd363020070b4cdaea800e44dcc1300d2", - "6862714daedb908a4d86a3a3f1e65ec2c29ae61501b4ddcaf184243dd095d71b", - "555cd19a6d21941c1174129b8bbcc70edcf0d6874262ce9e1e542351990d523d", - "2cd6b44326828f23a2aa33699754bfa072c4883f39d53616f6a6b74149b664b6", - "127f45d2eacb565c21c1030fe8054fd0a3a75705bc368924712aa145d414fa47", - "19225e2dae6e1166f21cdab1290194470ded09df9b66f3faad3c1cc9ebcf340f", - "b7b3f53f0539b2b4837b8bb9dae0ccbd200c8d36126d9f50199d68a4293a46d3", - "6b6323be01f27d6d759d9670825e8ebb9c4cd8016351702328df91cef36cfec8", - "020c31cfdfc5b22b10235745b89b311d271cf82f2ba16d03fdf7a8bc8538694b", - "62573218530182b79e40d0113b7d281dace6da33bfcd0f9318558de5e5c76f08", - "37d928416b15982f5bb8be40c5b62fae0b664e412c25891f8860c4242927e610", - "b07ad11134a5c0542d2b418ef3863e8ea8477de68d9310681818ddd40825fdb0", - "4af77cb76bab845b56470c95ce7b8cd84ce49a095984c1f3eed67b0ee344316e", - "e3fdd4668d8726ba6adc401ac662c0cf6b5c1872082c488ed7da966d425fb1c0", - "3dec71c81c7e78e879abc8da8b30e2446edbe98eeb8df9dafe9201ebb4c6a834", - "7105467d9c5e855f1362fbddf820ed5e757997862efc9000317d3830a2f60ef3", - "2821df94b021d3e77e8d9c0f3972340210f5ea2c0935cbf125cfc578d4d6722f", - "114e5807accc337a22598bded30ebf3e0cfd75877e239f10cb043f829c315ab5", - "d658a1c0354628cd7312593ab25d5b9083de8f0def6e8425f188101d256cd136", - "4818d3be9b2a38fcc8c85d6c46f69b502943f79cf2462dfb0b6499e761bcc836", - "92b8c943cb017b5f2d39264640c069f1ecced1d3ce9b3fd755d6df2fddb99458", - "6edbd0fdf064fcbccd4a9e7a8ea520b87cb7faf867f7fe8a5f53625beb575119", - "bf3b49c477dafb06af65bf09851c0fbef9dbc3152a7268d31b55a8e7a9a95860", - "0e234dbadfda1393be2f068182615dbb83736f84f87710b5c7965bdce9f4a26a", - "df5ceae34429e47b92bbd5505ba27666552e0eb619997f359c55699c3252b1ff", - "08c1c7d940d699a91a83249bd578772e8958ffe23179e6150f07b96f1b47ce1e", - "6f919a429270da0022d70062537bdc1b21c43a8abc552d8e366647e5b719d310", - "63c66e5fd5d27f6fda87912ce46fa91a5e5b3634ed147fa2986330fc2696d3fa", - "bde070b75296bca3aa494e7f549cd2bd1ff003776712bc98a3164b139b2054ab", - "66694196dac5b60cf5e0ae05db8f3894fe04d65910686806551f471a0a0472e9", - "0d2e97524b7ce4cf30b54e61b2689df036d099c53d42e2977b1671834bac39e7", - "e081af76e923455f408127862be5c9baf7de6b19b952aa2a1da997d4dfe594c0", - "121bf6ae1596983b703d62fecf60ea7dd3c3909acf1e0911652e7dadb420ed12", - "a25e7b17464df71cd84ad08b17c5268520923bc33fe78c21b756f17353ea39a0", - "e985f078fb44dbfdf3f4f34388f0f233a4e413e02297ee9a7dcc3fcceacd44f9", - "b9184cf45e6e6b112cd863b1719de1bcab2137eb957e8028edca3a204a9ebb96", - "157d177d5e4bcce0040eb4bddb681eacf9e2942e1c542a57ce851b4742a9cc4f", - "0823e06635c9a1a69fd8833d1e48df98d711c1c47c06f27bb384932db1bbe9ee", - "8beeec1fd1bcdecba235b449cc49abca69b6486ed1c0861a2bfb6a43c970b86f", - "349f61a1cfc9112e537522858a0edae732a2f8434cf4780d3d2ec1e96f581cca", - "587cdf72b5914d364f7e214a70481cf1131ee4a09e6b43e52428d2e56b000c13", - "a6aa0c179316534c7b9ffb5f42a2af98d1d3a166bfb413199579f259c7b5e6df", - "f9f3bb1ba8da5899b79186008ecfbd416b49f3b86d94045b91e34a40e41d5cff", - "0cdda65a60b7b4d94e794c9397e01f69fb29309ce4fac83e7392dbba6bc497f9", - "8fa5fce5ad09d43af7218ea5724cff2c4849a59ff73caf3bbca466e3c8538ba8", - "8874ef46008753fcc0b77eb7a4a8560e35966bf5a12bcad4203ad2b4c1f8bfbe", - "a8ee9a3aa2d0c08a951439ffb0e6d10315fc4776997b275de1ec19663e88c2c2", - "9c184cbbff464ab4d5f6bfa78c39bf0880fb93b1574139306a97acb940d415c9", - "5493a38c255c91ca49b958ed417f6c57e5bc444779d8f536f290596a31bc63d3", - "3e1e82b96cc599d9fc55ae74330692ccbfb538a4cc923975fd8876efe4b81552", - "16aaaf820c24c2726e349b0e49bbab72ca6eef7b3a2835de88d0cececa4da684", - "7fa52ba349f7203c3dbc2249f9881101a3318d21869dd59f17abf953d234db65", - "713d8018bb9ba3ab55c3a110120b9d7593514111075ef05f0fdb233ff2ceddc8", - "56063afb495759a0942f1c33f28a4fb8320c6d376cb3c9513249453e45f24a04", - "f9a6bacd9e055749b45174ecf3c3db18b78f3474761948a68adf601f54e59660", - "7ddd7c6d41572f93fe07c0300c34e455b6d1f4372204933bf45035241c8b060c", - "f81021b893a36b201de71330a2ea050b59dbf7560c62fa9cbea9261ab47a0ba2", - "a01fbe4114c18fd534ae1621404d25c08e3b6775a2631ff40279bafd8c9304f4", - "350fad8ebc938c6eb508a1483f385f577794a002bc1229db70a1b0131d174b9d", - "570cb8bce87f532c5051d8c4c864012408e672a7d492669e660251fb1e066bec", - "8cb6efbb129c84eba26d894c4293b476a6e9a1fe969c6ad18b554d2a57885f36", - "f384a98467bf7f084ca31bea121a4ec76e530f523d3225c21ed25a18544a9916", - "da127ab58ce557c2c95c20d6a291c2e5d880fff09dc28927b7bdfec97b995d72", - "a4d95b4f74366ec920d0a0c5d81265688cc18733ffc444cac9b01ae2431568aa", - "5ae2a71470570733422468bb733d53c85b1c8a6e7e6df5c05941556bcf342d1a", - "65a2d161ff0e095d3afe37584dbbe649f1e9cd440755b5a3c5b2a252d5c0b8bc", - "25ef70a8e41bb422ed7996a41160294e33238d6af17a532232f0a50b123431a2", - "f1f0f76ee901664a65b97104296babb9c7422370e99bb677ae07c2ee420e7f40", - "c3c66dda180b0330e75c8139b9f315a8c6b937f55d87d7be42e172bbac60d71e", - "5881786695a9e58e19d79f790c7d9243a847c0269c5770bdd01f5149c2a62a88", - "f2f816d3c8ebc7df06ab68d39223181aacc7be04364d1d4e69a56c33949bb983", - "80a1c3b6b2778d4846ad9fe0bb2dd5afd99aa897f8231bfaac45fde43d602d9f", - "72ad67cb043aa5df0c3dcc2464953a66893259d81c9cc7778c12bca3447fbd58", - "ad72420a7963b8d4536d8eba00b4b989992247cd8c01660e242a8e71edaf0e19", - "999d603d1cf6068e3bb6abe1bca976fa0ab84c4660b29ea8973de8b5cf5fd283", - "e137a5910f02a764c3a3d8f1579ac0c7e3cc34e58933216868efe010332c1e6e", - "10e0fa2362f59317626ae989bd1f962c583339d8d74d76c3e585243d152b91e8", - "1951c652704962f5c6e33a4d4aadfee5d53ce2253644d1ed542da3e278524a07", - "c938bccb7ba6c0217d8ba35ed91502aee051c8ae5bff05e88aab3b322aec936f", - "4d6386c689785edd5beb55911a3a9fc8914838c8192184199589beef8b6ddf9f", - "26f6f45a6468bc4b1f085fd28d63c264ee17564f9e247fc03ee179a0b579dcda", - "235b7bb82b72c61acd5979ca5f2ca740aee805a780ba22e11aae5cd34f6ec760", - "c027ffb585a1e4844b4907490b621b08c7e40a5e6f93e97bd4bb1b615bba9908", - "aa77fc8053d139b998577319de29457b78b1cc8b35a5f3526c0621eaa42ce6e8", - "afd0af9a11c5ae2a7c4a4571ce39ad57d8df70ef146ed83ad8eaff97b2387fb8", - "a1f8fee9f1da9a2b306489d00edf754187b55e97f4fe6f249432fe6c7f44d6be", - "4f12e8a123465a862060efb656299e6bef732e5954b02194308817b243e84d32", - "6a1ca62f7d6952ad2eba1c64035260319baf03deabf856ca860744fc886b3d3a", - "c72dd1fe890d6e4c1f7325a4f224e85aef6cdca8bf9441d228efaf126e02ba63", - "2f6ddcea18d891ef4252e657989de68adcc43c2175d49c0c059c5e49b9dd5aed", - "24efac0f240ed183c30398ee40307623f52113598f66c5864c90fc62643a2aec", - "6ba3ebc935e7cf7fbb446e7f5c12b19c4455e6894412b0eedee4fc945e429e9a", - "3519d6e5bc9649f97d07a07ef5471a553ffce35c7619f4f63e91a2ba38cbb729", - "65e073df352fa9917e5c2475167e6c523b68c1406e1b6e81109e2d4cc87c740d", - "d73bf816c3648a7d53d34be938c454e515efb0c974d5a225f33635540b2db90d", - "bce167790fc86a273db011757d09e2d1148521ce242c2ded58f26cc49993aacb", - "2d4286ed4039916f29602e86f47ea4c5b05998c0198509ca7799fcadfb337e8d", - "9837c495b1af4f76b09177514a0f3e1dceb509c52b91712f3c7d29dc1b91d09b", - "5c848b8291f39759903ce77f151acf40f3ab5afa2d4a45af62b320371c29a697", - "b92df5016ee947ce6a21365d3361977f7f2f6c14025a983c44e13d3e8cc72152", - "71d2f57222a39b1a7ed2df5e6fb23a964439b5a8e7d49b49d87e5cd5354baa75", - "88b44d0198fb15b0c20a97f87e021c744606bfd35eae2874f35c447aa4ac3cd4", - "29bb4c2557714119cd684da2867e689e37e3ca9c912db83ab84746816f6092ab", - "b1836d98a288752675b133b9018fa1edf174f311921d01926c1e1a5900c21029", - "a00645e090c7d96f3155ffbcfc41e526a763b0f53a98151ac4a7d4a5b14066b6", - "78aab09919d17773b0d62799b37bd2e2970f72f5d1eb6472489c367b6135374f", - "eb6123aeb28608f1c97b2bf62ef69f977cd0658a0ab491deebb1e972caa938c5", - "8dd7ef1650b1b30cdf7814ae4d61a237eb0acc3ec3ce0f72b1c25780329c2d7d", - "b1998419be3172858b990eea84fe10bb24b76c219cde277cb4305955fc7e0b65", - "1b10560016c4bc506eef9056dedc2943a17179081e6eaf85b48d37dc20eac3cc", - "1fb1d9d4d408a6734234910f554d272739a0d6fa401918d79b57be62c3f23ba2", - "dec878f54ce36788289b61d32de0d9539032aba22cd15522752f729659c7cc5c", - "fdbfd0773f5a66637b093dabf812197940d1134619a7e60a931b19915b7dab0a", - "21bd2c9aae052a1c187947d2964f2be4afa7b30248409c41a75522e88a4e7977", - "59326adab03416ec1d36699c18e5e4fa13ca1f2212d48c23bfdecb0be7263616", - "bcf263d39457c0aef8ef42fd98f8131198ec4fb203155dd5bcd759e499a9ca5c", - "f1ad083bcd8c7630eef93336d8a971ae8ae37166a6a00ac39684420c5f9afef8", - "d82ee2ac41b36e3c1787a01835bf054070486dc20f6565efedbbc37cd3bf5fa5", - "eba91a0dcbd3986299b0a3e66c116f77bd3421829291fd769522f01da26f107b", - "11016558b7e8c6386c6a3e862691dcba47e33e257f0e7df38901ea7c0eba894c", - "04f02795e34a0030e5186c8e700da8a46b1aa6bc0abed6b35c9c1cd6a73776b9", - "2628dc8ad7fb731d59456b2755a99c6701467125fa69816c21bfccabc31edf6b", - "9b7ca249ee5b45cd264492f30df09f708a7d9caed7beb9a5c6292f22e4c31f85", - "5c42e7caedf382092faaf392174792b3cf5f2fe29cb586387ee55611af0617c9", - "373f2fd5940a01feb79659c8b9099477f6d3e7b570ebb749c2ac336ea4be583d", - "fea22887147adc3a659a14902080b03e86b4b8b16985fdf0bbacaed00d812422", - "6a3e51a1443cff62af9fa12fafc8ea78ae74dac7792c9ae0f436f570ab33eb71", - "796be21e213d6d0cd6fbe2de1555fb73d1cf9edc041a9f1ff1ad583c4ca92460", - "03fcbcb31d3fd17f0eedb45ac5a51678c7c8b2b8498225d05f74e2892f017f72", - "d28da07c6c22daf9ae987b3033c33d3140e5a56fa1ffd7dc5c7853d55a45bcc7", - "fbb0ce02f50018741a12fc08eea80a18067d7bb0fcd96153d40bb8c808473aae", - "2bf7c05a0209b4ea31314f04bd754cd01c58102d7cde8c496c655b6494924354", - "1968a9e6e14ae86a1e02e6078fc4631851fce5dbac6aa34f860defd1ccfd0ded", - "d886181329c9e06462a1407f547d77b38ff2c868b86d8976aa478e1cbb3d66d4", - "0d465e02ff2f8eb0b5fb2fa9a38579c5d66337d4a16b58f8ed28d2d89fc02392", - "3196419015289807880ef24b6781734822d654dc260c0560d00bac65eacd5219", - "fa08390ddc333a2a12248d5ec3e51fff9b782227069fe5a0afbd8eba967ae8d1", - "49ae36a791cb84516688d59a1ed3e5112851d65f265078aa2d433b45fa984c8a", - "35daa428e12c59da6730760979aca3444d8b31149c6febd99fbfefa4b2372082", - "5ef1d697beba612ff31d1dc139817c313a4e2ad3977775943b635c141ef0f2a1", - "674256037ec00edb66b9355fb1d33a30a47a5d1f4bce2dd5475d89f1ea6502db", - "7b6f017bc550933af91eec32a79464f540c5e0c208703e175843ee4e9ffc0a50", - "bf0eb91da1d18dbb18fd9ff36c837387887ba142961176a44889718b2becb9dc", - "3e5ac43a05164b074a2ff6353e9882917c5a3dbe168c2695de895f7decf1a56c", - "35e8f004965347c2b18a000a83dd3a8084b8a4bf00522061ed1179aa1107c413", - "fccb0fff3a24e555ec96f702ec11d420338910d148fc7b039d67568ad3a0e032", - "5cab231048032dbf921b4fafa1951dd2da93bc3740667f31d5a1d5665b141261", - "ffedb24be73441fbcd069f7785ebb865870e0f3ed228190732e4ffd5962bb82d", - "a4fcfec18adf92f4ed822f64d2da9f5ae630885a1bfa626530f641db99aa7a30", - "f98bcee41b0e3deafa1efaa1863750dbfd9bd7430b82529b670867d852230b5d", - "8ab8d5fca047a52364a737c1af57bf656c9ad5049f08ef4c5aa252e61aa72123", - "91318b39ad94c1d58143586b6d90dd6092a9d7487e321f4976967b6ac445ff43", - "fabfbd4569ab018e12d5ffa9b1a40ca8eb2ca60a685817351d90eaa770d5eccb", - "bbc5ef34428d980e2401942ceecfe07cdf21bfb1acae0596ea1d43fccf504f69", - "26943e4201ea407a5667103fe07ca6e08ef76940f274349b0e2e776bcfb0acb6", - "e3b305ffe33e72841f8e2a8688cc5cc27d42aee7624b33b7b6399b42db392437", - "17c5a763dd57e6bcc7c4cf2db0eb5cf3e97116b67fe0dd519c97e4a4d55d5a62", - "bbd260216879ce86af8318ffcf73c9e063ca76dd8bc35d3b6be45b2b4184888b", - "41285591d0595bc42ab663051b410d51af39fe1720592e27acb1a8af72360a76", - "f29acd6068ce494d0c0fe294cad91bb8968e3fff3f595a113227ab545c3ca3e6", - "ec9013c6394528e7dd788ce7cc085ca79fcdfbb37565999d5b4b5a4e39452ecc", - "27829bd7f1a8fcddcad0cc34a3b3fc67d62a2f3e09f8e75d35035c2281e83afd", - "666bea9db4e15087204d076294d221d4cf5864f5d94de38f29132b1934a17ace", - "a3a30924cad3dbda3446e5a6324e0a1390c70f795d5ecfe17ee5c70b14f7d87d", - "19567fe5fdb10711d60aa4d9843e1c49c2a6d2fd1b5cf662e2105606bb7815d3", - "b139f1c3a2f15596b9320334e37e4184d5d584c4a81e72d821a7edcad3aa62d5", - "08f1531e0e3e8f8bae313b2c60a72d5601bf8b60d7a4d2f60e8481650340d250", - "c5895669e1ff182bf1dd6c00dc955265e08ded0952b8ca62a1c63ba11c99f4ca", - "84d1c28153f66c1a4eb5fa0df695e936d83294df31a08d8d8e2d4798d19d8ce0", - "b8699f6af853fdbe897848feb46a05d733363f304eac4c8c1932e6ea4bc062cb", - "10eb3f6c1d0661468d9ed83593e5e9c0b43c6feec6a5405a498194905ea6ed48", - "509e215a600d9cadcbf5d62632ba321d7314764218db00ce8c907e425fccc445", - "e62119b7be84c8eaad41ba7f4a35da403f4ed96b967a3134e89ee8b78f8792c2", - "f790754a95d59ea5ffe6b9b5cc386c600a9e19e8bec997c192764365f1d05376", - "990121b5aa4d6badfb7154db4cdbb4512124bc2f442bebac71ea90b5cc86f203", - "b6983dedaa891eb14c964d84461e5cd37ed27b61771c64978ba83e3ecea194fa", - "00fba1ceaa6aa1e378cd5b22a771d6070250ac37f4e17d7bf1a70b3139e9a860", - "429854e7738abf2ecf46909454039e2fc5a080eb9a3c0c5ea13b07426dac3ad9", - "ceb3e017944b0dd787be219d8629930b3f2e20e22b12dc88fd838488ebb896f3", - "eb9e5d14424c63e675fe771b73ca865f7d38cf334d65e2426e12a0b88c1a2236", - "556ee713449e6e59ac4b8b2e8310180c8f6280484e9db23456526cceb9216168", - "bc89c3aa889e0144ac526a1f861227430dde7e439cc6a7e9b25c9a049c3ca7b3", - "56d070c62ea99be66fff741a8e45fafda5f9ff783e84d5395b251f356ce4e16f", - "ace15859c399e5ecd13b1420d3c3703c6a88dfb4a084f7225e7ba40a4b444fc8", - "f03f1261ab6eb879fe9c5b0028cd400b3ffdfac4344e4c75f6cde3c05ded1f26", - "955b2fda8d0068226f89270028b316b5adac871f1c1c85435479aba14a381b0f", - "422509a98d7461a6b8ec87cbb173b2486577b59ea9b269e01c20567b38b3b3b2", - "007d4de62ad89a4f5985f0cd9b76a7293acf383b4e9e734e813b9df1d57f986f", - "13a04e32948225b7e22aa0137341ebbb811e0743032fac16be9d691a652db2eb", - "8244b11d880a52f9f9e1830a822e6eeeaf0b12fc759f8261bc2f490cb0794f3b", - "27d3415f8f8fd3048a1ee0d9487256dd1b0f9e31be663778efa5b3add63868ec", - "0053f888db916a8905320e253fe2f0666355e6fb6de36f897231920a3edfe39f", - "0bc5c0a2ea47fa3bb8be107e3b9d6b7226b1c8bd16ca1bab8f51b8e1de08aa8b", - "4ca13aaa161c79025b5cd6c9a8ac33554f5ceb479fe293d9a342c865cd9c9948", - "333afbe82e2a3df38bd1ef998f39c5feef2554697aa21b5410c0e95ef9156249", - "587c4fcabd18ff890064171fce3d5be0c4aa1bba46893fb6a827a85ab54d20f3", - "964328e4d51d67c4e2f1fd102a66b861d98199f81d18d660b1b4b52504cd772a", - "196aad5594651efd679d30b9feb0f0d172cf977b4f89aa670ec741a8bf21e669", - "9137bfd66bbf47bfa0bfcbb9f6e71b6eb3fd9776530e9fd30d3dab19e182f35d", - "8217392c4ed2313188f295d94148a027a7f43824a5f5fba33a0b8c1045d509b4", - "be9e12761519a4836e73015544163254877e1c4912fcea67a10e7026421dde75", - "7b5220421a520b876cc6cdba0d3895104d7fac914dca5b93f9fe8b226566b71e", - "5c83fccfeb4bf0eb8a94d43ebc84a81639a32f26c7ef77d0a2b626b7de7befdb", - "132fd6c92cf176f975efdb5ded53470b462a48a2815c6f54a93ce4f935784cc7", - "46a3dba364022d11aa616a2bc20e3be5c4390f38b9446edfa464d90d9af5d48f", - "34b3f3fd8a83905a37762060f51d0b116377b4820b031b8e668e16f46c5b0285", - "f0e397e033dabec859a4b9a9043c5f1fb0dba504764d6bcf2fe9bf2ffd318474", - "85ecf59c7dd3b24ad17f591bc4737f32f1384c370a7a6f2add06a811dc824b6c", - "4d03cdb1e6ad8e066a83654626d8c221433e8d4fd901c671300af37e000177f2", - "61cb9c651893e6401b25f2bdf79c9f3ddc9ffe69cf6c791c420462bd73e347e1", - "85f2686a42158cd5ad327781ecccd1bdcd346941dd4b4edc45f717de6a011800", - "92de2ab82cac528e6d4ccd61e5b7c79591dcad9909c8ad3c8276ece6d48c0f08", - "23a878a06bb94bff33083349149f3c860f2b00bc3fb28f04cbaf717c08af19a3", - "1b1cce18ff0323566b192885d7ced30f9a9531a2580240f2c593a7d5b8580974", - "08fcdec7ea1376d84f3b13a47a4b73c7781c9c7890bb28f712b58af4fd3f24fe", - "03cc08fc4ece807c6495272c412be23b045622cc6b786ed8d5c94156ae678a0e", - "c4d8a61dc3f5dcf4b83f27a90cbc37e816cf4754e12309626ec5679c99087c46", - "b29d00681e29001cdd63c4bc50e5e25715faef692aeebb678c8050e1c095e888", - "ac154617e93f2bb1afa232675f2135437a9cc9700c14c51c40084946596ba11a", - "ce9549de8e68ae89f424dd9e1cde8a4eea2069da667cfcfbe837691d37366668", - "426c45a98e2af35cc9708149f6c086ff5a3972e77d62c627d5e20de5d731cad8", - "7e21bfe240a3d9b77a129c734a1d428dbc890379fbaf862853f48b2f7470b2b0", - "fa090a71f77223a7210de6db18d9aa809e89fb15253aea28131df6c5a7639140", - "7094ad044c5ab025e088b43aa0b947601fabe58ed700a412fd96e4b917ced0c8", - "936d5cdc4f081b6fe36c356af4378d472cd7990303f2ea44da645afd7d5d7f9c", - "05342037d3b69349dce7b95529d4b2a63ceb9d9393217a68f7cc8c958a96c3ea", - "ff9e1c414ef27b1178b1de296526f50520b7ddb06286bf9c47792bfb449e40b6", - "2f2b7bedb34d2854b17ccb702cddd8bc0157e39721d58be0b2ad54ee291fc9f1", - "0d8db1f34140bbf7eb809137018a74af08cb3345b8a3e368cdda8521dab45791", - "b109e4bfabcfe4a1c38be1156d9ca851c75e6aa2e57c0869e40cd9056f571e07", - "5cb363547ca077c806fc69bc8c2006831ab89e72fd778ac1a48fa810934e350e", - "85ee928bb110fd64eae54a91fc8548883e7fc4c60a3c61b505c31cea2d295c86", - "1ec3df7d10ee6fd5f0532ad4fe771e6befc28b0bed0250bf523695d6d49a8246", - "de9db2fc07c866bd7b885fb41522b63d550d0ce2e8ac5e14464a41733c2319e6", - "9a27136422a8f56768db29ba172a7ba26c3c7aa910324e78e5ab3a3268ac3674", - "60213c315119bf9005cb533d1a5b403b4a13c59982fe7773d30fdd8f519f4205", - "40eb61ef1812eb8a4d389599bf449fc86653b2c4986061b952f46fc049de53f4", - "658ef0d8140162b5f04591be13b47456245f531208bbca3260b857ca09b803c5", - "02270fa66255048d724894e2206b4e773cc6a7b6d17ca090cdc25f317d5f53b9", - "2ec6a0147f419161f7198d05be5f93152d9ccc10672db0ea47ff1687c0f0dd15", - "4be1d8ceb96eb80ef7ce30079ded31163272aeccff5c18fe3aaa32ea2f5bed9d", - "04ecaf48f44de87243b17b4c71ebff00020738639336010fa57435a54b623798", - "e313a9feb7cfd1d56ec87b1f1062ff9a80da498f7b761af4bef0cecd1b4c385b", - "ede3748f971f22341f7f5844dc60fc03cdb30c7cc720ebe13ae588c17a78aa94", - "d90c0faa70e39b7c0a8c55457ed6e6478a4e4bf3707b08104326a1ee8377c3ab", - "c79ffd0bbc8d004cc542e212990df6498abddd3deb50fd00ed00a2ff690974d6", - "35c37d88cf73a89c4124b0ee537347c37fdb47156c8b0ecc509efc58236ed3f0", - "a99182f343ccf05e557ffa6df71f03688b2afcf314c59daa774fe78db6f47add", - "01115397a78af8a4ae2727ca7a01843235b626bd3db80888d3dfd0020d4135e2", - "4a55aced578470d2f7280096d7fe8095f294095fba4778d1977d6db9270472f0", - "4624adf8a5633f65b213b8ca46b55cb0ee36c41495f39b1ae70cbd545779b1a0", - "d72bcd5b57a9c47e7bd5e9a1103657d10beb7b6c6d41f2b2985bc3bd3cc74860", - "48baadb9a46293c92f29e7617846171356a42c3b5d18d49a05a7e173993785f7", - "3da927737af8cb0e1c77097e35c54158d18aabfb3051c45bcc7ddfe00b157b1f", - "b4a24bfdb2cb802c8d48a3a18fbfe18622a767fe7eddfca57d4555550ccd1643", - "c58f82ac7c49dcba1721a88358f07636c9df60d3fd383e5789b808dc57a1dc9d", - "5e1f756eff5155df073d30f4452bdafc4adaf4f35960771bf2c1e30137fd7a79", - "be4a332f289338d67bd4834eae3128c488a61d255e972da484b6252b67a46b89", - "d496e4a36238d03a83d8b45cf33d9388aa7568a279b034d1cdd87b457356cc5b", - "a1c5212730ccda34de393210e276bbd44720dda777bcfd602315a3eee582f7dc", - "08914ec63f6ef7fe1d678937dc0f6178883440b26b4aca29fce79068947e8397", - "49e2cd2bd9b974074d9814f93eed371620bd4ea5fbf97a625065704e8fb382d7", - "047c194111818b48ce93a4b006e4a09b9a2650757a87357111796e11e847bf23", - "5955b0baa8265341f35a6f24fdc79066ba3ca9c5354c69b6b37a9ef3a26be556", - "d7c962f3ea1938c5267cca4072548acf3afcce4d438ed62027caa211a5f98e8b", - "c8cfba67cb4ce7e291b35154a50476d9a5c6bbb5d6cbaaa5d2408547fea7b02b", - "de8a940d8a69a64ce264d2ab7320662aef2e391c587cb2aae22a86718d5dffbb", - "94176f1310b26e54d4de48f87b74aa0b60532f184a2268508dece86dd7f85d36", - "9ce6ee3fca56c9256a69df404782301300a6e5e7f5a25a1f6d68c0e9e42584c9", - "7c423c4a220c6ff43ab6432f92b166323c58ee77f8c096ba0b00d52d7bd507e8", - "0b62b9c1ae4d4988720e8d41d980b334458189de0a3dd01699338d7b07c3894e", - "64f45f6f75110624506c53716f2fc1d5fe5f88f82a5bc6a7459ce70eae56dbb3", - "12ffbeb8e52fed161af4d8a015d1a5c45dcb8240e5c8933ce3a88ba2c58f97e8", - "2ee6b7b96043c8ded9fb52f87cdd0d0580ca6f8cef183c8a656394a11c0aa393", - "aaef26b1f5726258bf9ce305a3e54bca65cf68779f90f9d24287245c27362e27", - "ef59588dce57c35d010bea4d209f44c62f0b7c7e65bc0226c0e4971934da9435", - "0e606c2f6f8dcd579faf4739312bd7327ac7796fa44a81780fe0d66fc7761fb9", - "2f307198afdbde5f95989a17e06ce1bb9ff36c441cf3b2248431534fe13bb9fe", - "51418e6df23d450aaacc74ef2df53a6b1693727b70bda9ebc43acfc23d8fb5ea", - "6e9e3ac46705ed80520695b924435b00d2b3079598bf7faca7fd1524be777e5e", - "1e96241e2876aad29ce64f5d7e7fbb8db7265449df816c0d30a96633778c5cb6", - "81788f00eb72696d811f946e65d2c96528c45590874a1defdd46651e9b79a3a1", - "d9aa5a9f1df50e933d7105a5d72b5fe96bfbb9fd4b5b0eaa5e80af12e72d497a", - "e1b6976a732d27fc5d6a96b6d3d0d1d5eaa6ec46bae4665f17e7a43aefc75280", - "9151c75edcec1cc90aa2d2c240ff657b0eef3f5f1ec37418c8854b2493114f1d", - "3e7c12d0132421f08ea0a390cfa325e422a6b35120fb2eb650f108a165237934", - "1ee0e85c7d8a91089c03f37318cdc9127026bf789e3ce4b75046eaa3eebd3458", - "4ae64a3ef66cad847409ce175bd5365c9097fd21647a05730ac6b45841add3c8", - "f0ea0f334cf1d64678a6dab08c07e2f94f339e8389bd17ebc882b5c8b736cbf2", - "da904db96060546ff69e28993ce8183766da9402ac10fae9fc1f1d67ebd83c90", - "db11820615f7b5e47778c45d2e083e77f49b608b587dc09ec26f077aba07a242", - "ff5c726a83bd785484de75bb03b421f9e8e382bf2740120a2fcf72326aa01c75", - "f8643a7efd6304980db323303ab73a6fd4f4ee1047520d39d571580395b97f21", - "8facf9737d07838aedf6030593bfb247d8c29fe8d9b18b2913408627a4424d7e", - "f0672964aa6e4c7dd4768e18827023787386927f4db89fd661444979afb43c18", - "6fd3649c8401f2704ed2be18518b870eb6bf2b9a6689d1b336f05bd8b49017f6", - "ed172dac7de827493e0c0fdd8d3299333acb678e72ed499e0224b389cc1e0fba", - "7f9a8a8cc8e34add11934a1a5882be5978a6d28405cb0a053ec5699a502b1cef", - "6ca829ebd2a0a40994f68c1db7978ec274b45c46e9b351df869a2bfe0630bbd4", - "0bbb017c437573a55db88258a9d9a01188bdd23bb6b26903b137814871661f47", - "9a6358d2541f46b6d05b80fe25a2cb025fbe9e4b227a6275908d5ee31c948569", - "a75d26c6d4ce944024f10e6d23e8b5b888d680120e15dc0e4fee8d8833ee0c6a", - "1d43d33556699b42c124b46e41243abf48727fe488428056fdd174a3861c1e3c", - "7b5bd3fecbaa093f005c4f806ea67846c0df6b04df7729925cb14724f6a8b582", - "6bdf2b54f2f5ab90191261d33dee80fede75896994016422b28db8ba62327d82", - "1a16181b250085a91ccecc118473fa2ab98515e894a7b63b347c24b5be560c7a", - "22d24891755910b48ad632358c26245bdcc375abc41f7e2c9fb3c7773dbf4e22", - "5b70c5d4a373d541619c944fcc3b61259550b0e9fba3eca16f0879e5845b43b9", - "b78f9098c9d76987b7409e63426a8d49972bb4e75289576c680cf96513d44b6d", - "916b53b8e85eb7e0a2a76d6fc8d2163430e7183ccb103d6705f54af4bb070907", - "dc3d78f43110d2aa9df83c5485ec33663ad5452b8cdeb1aeeac9d6b1487fb781", - "3975539ed5402cb9f5ab503584524dd141cc4296b666ec66d807f94f62b1c026", - "bd1f97fd89183643423073f22733880616456ca41960699f18e868cb9ac35508", - "90b468ff0f83460c3dd8cfe778c39d32c6bb1eeff9ac5de7804a4050d3b8073e", - "0e886d49d88b82c9f8dbdd2f38a535992f35ab16629724d746394db3898235fa", - "76c22e965242d1ca5614e829d9028dcad9c4b09393bcbdd318b0365557335fb9", - "59b168488ec8629f820a1efd8fc5a0c2adec4253e61d6a2945a68a9a43be9035", - "ff172b42854eaf2865caa985d2fb6283c5ab19574126623ffd615a761a5bce72", - "cb46ac9ccc024ee74c96e3cf1c13a6949a432e855dfa881b6a307c0e6daac59e", - "9971574924c0f413bf4c0f96bb9c2fbdfea8f475e33a8fb6f15fa40903b63444", - "1a95567deb0f45a8941e2248f33286485984a5e9d86d16c37d42169ad864dc36", - "205fc7f7ec7a83f0bc22d5269c91762cd00adc7428456d799be5a0cd76f08b0f", - "849dd41ef59a722901b7a0deb2c1fd3c110a91a726120a0a119cb7a15cf98438", - "a32880917c714612101af95e5c8d8eb5fb046fdcc68bae76c05b829b3fa73c2e", - "70b38d6d510d13b359dffa910329952c620a4bce4ee7a8552b9bb3a14572394d", - "ef257ab2f4226faa6ba288a6793f026609068effb866c18496a847e8b60b102d", - "e5196ab42ff53c8352288bde6b6b7312cd6f39f7d21b556b0db178d8470d5790", - "ca98f128bf085f2b718f2b3c12da7c4d98887cc94251a2b1705b637611bd83bb", - "79508f0b93a49ec19c5cb05906ca1ba3d3db8ed4f9c6884873d0d7e3e985ea51", - "9088be3f47f9debc63e928739f7163182b49eab044518b151f0b89f6b6aefdd0", - "46b2782fd669b6288a4d7348cf6671360277ba4864cc69bce3497369ac2ec31e", - "0fa5131557db67b430d516530be939ff25882adf68a076602f3dfad8c77c963a", - "3404302cc097d5457244453a4c9990804201ee8161188df811bcb32404998c71", - "856939710dbb90a8eeda875a31f9a52af759bd932b88e7b08df35414c54d4721", - "72569573b9b41d0ac5ce17764a139c6b8b36ef3ca6d92cec625dbcdae758ba22", - "9746da344e435a008d6acb4847211bb676376ecc76c825b5d44a28b89ceeb40e", - "3eafded1595516f032e33ec975f4c9c3a1055d13aa5575cf8a801d6103fdbeb4", - "e88a6d2daa863c0787cc523a2cab45c546fad788951b10d75e2b0954db24cca7", - "38f531e67f88f66de44d3357c8e8f2db456160ca31dd2024c9562f6afd260278", - }; - // block 685498 (13 key images in one transaction) - static const char * const key_images_685498[] = - { - "749b7277aa21c70c417f255fb181c3a30b44277edf657eaaebf28a2709dd2a90", - "5a9b3e1a87332d735cedaa2b5623a6a5e99d99f5a2887c8fc84293577e8bf25c", - "bea438768445eb3650cf619bf6758e94035abfe0ccda91d4a58c582df143d835", - "376e237ff4da5e5cbd6e1bba4b01412fa751f2959c0c57006589f382413df429", - "14ac2f2e044f8635a3a42ecb46c575424073c1f6e5ed5e905f516d57f63184b5", - "2d1d2ecb77b69a2901de00897d0509c1b7855a3b2f8eb1afe419008fc03cd15a", - "ea01658f0972b77ae9112d525ec073e3ec5c3b98d5ad912d95ab2636354b70b6", - "d3934864a46101d8c242415282e7fc9ee73ad16cd40355535d226ab45ecdb61a", - "ee379b05c5d02432330ebd4ea9c4f1c87d14c388568d526a0f8a22649a14e453", - "aeb7b842b410b13ca4af7a5ffd5ae6caddc8bfec653df1b945e478839a2e0057", - "451806929d9f5c3a7f365472703871abadc25b2a5a2d75472a45e86cd76c610b", - "272d9b9fcc9e253c08da9caf8233471150019582eaefef461c1f9ceff7e2c337", - "633cdedeb3b96ec4f234c670254c6f721e0b368d00b48c6b26759db7d62cf52d", - }; - - if (height() > 202612) - { - for (const auto &kis: key_images_202612) - { - crypto::key_image ki; - epee::string_tools::hex_to_pod(kis, ki); - if (!has_key_image(ki)) - { - LOG_PRINT_L1("Fixup: adding missing spent key " << ki); - add_spent_key(ki); - } - } - } - if (height() > 685498) - { - for (const auto &kis: key_images_685498) - { - crypto::key_image ki; - epee::string_tools::hex_to_pod(kis, ki); - if (!has_key_image(ki)) - { - LOG_PRINT_L1("Fixup: adding missing spent key " << ki); - add_spent_key(ki); - } - } - } - } - batch_stop(); } } // namespace cryptonote diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp index 37907175f..e671f8862 100644 --- a/src/blockchain_db/lmdb/db_lmdb.cpp +++ b/src/blockchain_db/lmdb/db_lmdb.cpp @@ -742,7 +742,7 @@ void BlockchainLMDB::add_block(const block& blk, size_t block_weight, uint64_t l bi.bi_diff = cumulative_difficulty; bi.bi_hash = blk_hash; bi.bi_cum_rct = num_rct_outs; - if (blk.major_version >= 4) + if (m_height > 0 && blk.major_version >= 4) { uint64_t last_height = m_height-1; MDB_val_set(h, last_height); @@ -1224,7 +1224,7 @@ void BlockchainLMDB::open(const std::string& filename, const int db_flags) if (is_hdd_result) { if (is_hdd_result.value()) - MCLOG_RED(el::Level::Warning, "global", "The blockchain is on a rotating drive: this will be very slow, use a SSD if possible"); + MCLOG_RED(el::Level::Debug, "global", "The blockchain is on a rotating drive: this will be very slow, use a SSD if possible"); } m_folder = filename; diff --git a/src/blockchain_utilities/CMakeLists.txt b/src/blockchain_utilities/CMakeLists.txt index 24a750eb0..fcef05c56 100644 --- a/src/blockchain_utilities/CMakeLists.txt +++ b/src/blockchain_utilities/CMakeLists.txt @@ -141,7 +141,7 @@ endif() set_property(TARGET blockchain_import PROPERTY - OUTPUT_NAME "monero-blockchain-import") + OUTPUT_NAME "wownero-blockchain-import") install(TARGETS blockchain_import DESTINATION bin) monero_add_executable(blockchain_export @@ -162,7 +162,7 @@ target_link_libraries(blockchain_export set_property(TARGET blockchain_export PROPERTY - OUTPUT_NAME "monero-blockchain-export") + OUTPUT_NAME "wownero-blockchain-export") install(TARGETS blockchain_export DESTINATION bin) monero_add_executable(blockchain_blackball @@ -184,7 +184,7 @@ target_link_libraries(blockchain_blackball set_property(TARGET blockchain_blackball PROPERTY - OUTPUT_NAME "monero-blockchain-mark-spent-outputs") + OUTPUT_NAME "wownero-blockchain-mark-spent-outputs") install(TARGETS blockchain_blackball DESTINATION bin) @@ -206,7 +206,7 @@ target_link_libraries(blockchain_usage set_property(TARGET blockchain_usage PROPERTY - OUTPUT_NAME "monero-blockchain-usage") + OUTPUT_NAME "wownero-blockchain-usage") install(TARGETS blockchain_usage DESTINATION bin) monero_add_executable(blockchain_ancestry @@ -227,7 +227,7 @@ target_link_libraries(blockchain_ancestry set_property(TARGET blockchain_ancestry PROPERTY - OUTPUT_NAME "monero-blockchain-ancestry") + OUTPUT_NAME "wownero-blockchain-ancestry") install(TARGETS blockchain_ancestry DESTINATION bin) monero_add_executable(blockchain_depth @@ -248,6 +248,6 @@ target_link_libraries(blockchain_depth set_property(TARGET blockchain_depth PROPERTY - OUTPUT_NAME "monero-blockchain-depth") + OUTPUT_NAME "wownero-blockchain-depth") install(TARGETS blockchain_depth DESTINATION bin) diff --git a/src/blockchain_utilities/blockchain_ancestry.cpp b/src/blockchain_utilities/blockchain_ancestry.cpp index 2f0bbffd6..351db4e1d 100644 --- a/src/blockchain_utilities/blockchain_ancestry.cpp +++ b/src/blockchain_utilities/blockchain_ancestry.cpp @@ -282,12 +282,12 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } - mlog_configure(mlog_get_default_log_path("monero-blockchain-ancestry.log"), true); + mlog_configure(mlog_get_default_log_path("wownero-blockchain-ancestry.log"), true); if (!command_line::is_arg_defaulted(vm, arg_log_level)) mlog_set_log(command_line::get_arg(vm, arg_log_level).c_str()); else diff --git a/src/blockchain_utilities/blockchain_blackball.cpp b/src/blockchain_utilities/blockchain_blackball.cpp index d2ce5cf76..998196286 100644 --- a/src/blockchain_utilities/blockchain_blackball.cpp +++ b/src/blockchain_utilities/blockchain_blackball.cpp @@ -1029,7 +1029,7 @@ int main(int argc, char* argv[]) const command_line::arg_descriptor arg_rct_only = {"rct-only", "Only work on ringCT outputs", false}; const command_line::arg_descriptor arg_check_subsets = {"check-subsets", "Check ring subsets (very expensive)", false}; const command_line::arg_descriptor arg_verbose = {"verbose", "Verbose output)", false}; - const command_line::arg_descriptor > arg_inputs = {"inputs", "Path to Monero DB, and path to any fork DBs"}; + const command_line::arg_descriptor > arg_inputs = {"inputs", "Path to Wownero DB, and path to any fork DBs"}; const command_line::arg_descriptor arg_db_sync_mode = { "db-sync-mode" , "Specify sync option, using format [safe|fast|fastest]:[nrecords_per_sync]." @@ -1071,12 +1071,12 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } - mlog_configure(mlog_get_default_log_path("monero-blockchain-find-spent-outputs.log"), true); + mlog_configure(mlog_get_default_log_path("wownero-blockchain-find-spent-outputs.log"), true); if (!command_line::is_arg_defaulted(vm, arg_log_level)) mlog_set_log(command_line::get_arg(vm, arg_log_level).c_str()); else diff --git a/src/blockchain_utilities/blockchain_depth.cpp b/src/blockchain_utilities/blockchain_depth.cpp index dd2387e5b..4dc6f6cef 100644 --- a/src/blockchain_utilities/blockchain_depth.cpp +++ b/src/blockchain_utilities/blockchain_depth.cpp @@ -97,12 +97,12 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } - mlog_configure(mlog_get_default_log_path("monero-blockchain-depth.log"), true); + mlog_configure(mlog_get_default_log_path("wownero-blockchain-depth.log"), true); if (!command_line::is_arg_defaulted(vm, arg_log_level)) mlog_set_log(command_line::get_arg(vm, arg_log_level).c_str()); else diff --git a/src/blockchain_utilities/blockchain_export.cpp b/src/blockchain_utilities/blockchain_export.cpp index 5a49f3478..1fe6d8360 100644 --- a/src/blockchain_utilities/blockchain_export.cpp +++ b/src/blockchain_utilities/blockchain_export.cpp @@ -97,12 +97,12 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } - mlog_configure(mlog_get_default_log_path("monero-blockchain-export.log"), true); + mlog_configure(mlog_get_default_log_path("wownero-blockchain-export.log"), true); if (!command_line::is_arg_defaulted(vm, arg_log_level)) mlog_set_log(command_line::get_arg(vm, arg_log_level).c_str()); else diff --git a/src/blockchain_utilities/blockchain_import.cpp b/src/blockchain_utilities/blockchain_import.cpp index b78b8b5c9..a268415e9 100644 --- a/src/blockchain_utilities/blockchain_import.cpp +++ b/src/blockchain_utilities/blockchain_import.cpp @@ -643,7 +643,7 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } @@ -681,7 +681,7 @@ int main(int argc, char* argv[]) m_config_folder = command_line::get_arg(vm, cryptonote::arg_data_dir); db_arg_str = command_line::get_arg(vm, arg_database); - mlog_configure(mlog_get_default_log_path("monero-blockchain-import.log"), true); + mlog_configure(mlog_get_default_log_path("wownero-blockchain-import.log"), true); if (!command_line::is_arg_defaulted(vm, arg_log_level)) mlog_set_log(command_line::get_arg(vm, arg_log_level).c_str()); else diff --git a/src/blockchain_utilities/blockchain_usage.cpp b/src/blockchain_utilities/blockchain_usage.cpp index 38a0b2648..61be42b44 100644 --- a/src/blockchain_utilities/blockchain_usage.cpp +++ b/src/blockchain_utilities/blockchain_usage.cpp @@ -129,12 +129,12 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } - mlog_configure(mlog_get_default_log_path("monero-blockchain-usage.log"), true); + mlog_configure(mlog_get_default_log_path("wownero-blockchain-usage.log"), true); if (!command_line::is_arg_defaulted(vm, arg_log_level)) mlog_set_log(command_line::get_arg(vm, arg_log_level).c_str()); else diff --git a/src/checkpoints/checkpoints.cpp b/src/checkpoints/checkpoints.cpp index 3f2563e90..abf6d62be 100644 --- a/src/checkpoints/checkpoints.cpp +++ b/src/checkpoints/checkpoints.cpp @@ -163,54 +163,59 @@ namespace cryptonote { if (nettype == TESTNET) { - ADD_CHECKPOINT(0, "48ca7cd3c8de5b6a4d53d2861fbdaedca141553559f9be9520068053cda8430b"); - ADD_CHECKPOINT(1000000, "46b690b710a07ea051bc4a6b6842ac37be691089c0f7758cfeec4d5fc0b4a258"); - ADD_CHECKPOINT(1058600, "12904f6b4d9e60fd875674e07147d2c83d6716253f046af7b894c3e81da7e1bd"); return true; } if (nettype == STAGENET) { - ADD_CHECKPOINT(0, "76ee3cc98646292206cd3e86f74d88b4dcc1d937088645e9b0cbca84b7ce74eb"); - ADD_CHECKPOINT(10000, "1f8b0ce313f8b9ba9a46108bfd285c45ad7c2176871fd41c3a690d4830ce2fd5"); return true; } - ADD_CHECKPOINT(1, "771fbcd656ec1464d3a02ead5e18644030007a0fc664c0a964d30922821a8148"); - ADD_CHECKPOINT(10, "c0e3b387e47042f72d8ccdca88071ff96bff1ac7cde09ae113dbb7ad3fe92381"); - ADD_CHECKPOINT(100, "ac3e11ca545e57c49fca2b4e8c48c03c23be047c43e471e1394528b1f9f80b2d"); - ADD_CHECKPOINT(1000, "5acfc45acffd2b2e7345caf42fa02308c5793f15ec33946e969e829f40b03876"); - ADD_CHECKPOINT(10000, "c758b7c81f928be3295d45e230646de8b852ec96a821eac3fea4daf3fcac0ca2"); - ADD_CHECKPOINT(22231, "7cb10e29d67e1c069e6e11b17d30b809724255fee2f6868dc14cfc6ed44dfb25"); - ADD_CHECKPOINT(29556, "53c484a8ed91e4da621bb2fa88106dbde426fe90d7ef07b9c1e5127fb6f3a7f6"); - ADD_CHECKPOINT(50000, "0fe8758ab06a8b9cb35b7328fd4f757af530a5d37759f9d3e421023231f7b31c"); - ADD_CHECKPOINT(80000, "a62dcd7b536f22e003ebae8726e9e7276f63d594e264b6f0cd7aab27b66e75e3"); - ADD_CHECKPOINT(202612, "bbd604d2ba11ba27935e006ed39c9bfdd99b76bf4a50654bc1e1e61217962698"); - ADD_CHECKPOINT(202613, "e2aa337e78df1f98f462b3b1e560c6b914dec47b610698b7b7d1e3e86b6197c2"); - ADD_CHECKPOINT(202614, "c29e3dc37d8da3e72e506e31a213a58771b24450144305bcba9e70fa4d6ea6fb"); - ADD_CHECKPOINT(205000, "5d3d7a26e6dc7535e34f03def711daa8c263785f73ec1fadef8a45880fde8063"); - ADD_CHECKPOINT(220000, "9613f455933c00e3e33ac315cc6b455ee8aa0c567163836858c2d9caff111553"); - ADD_CHECKPOINT(230300, "bae7a80c46859db355556e3a9204a337ae8f24309926a1312323fdecf1920e61"); - ADD_CHECKPOINT(230700, "93e631240ceac831da1aebfc5dac8f722c430463024763ebafa888796ceaeedf"); - ADD_CHECKPOINT(231350, "b5add137199b820e1ea26640e5c3e121fd85faa86a1e39cf7e6cc097bdeb1131"); - ADD_CHECKPOINT(232150, "955de8e6b6508af2c24f7334f97beeea651d78e9ade3ab18fec3763be3201aa8"); - ADD_CHECKPOINT(249380, "654fb0a81ce3e5caf7e3264a70f447d4bd07586c08fa50f6638cc54da0a52b2d"); - ADD_CHECKPOINT(460000, "75037a7aed3e765db96c75bcf908f59d690a5f3390baebb9edeafd336a1c4831"); - ADD_CHECKPOINT(500000, "2428f0dbe49796be05ed81b347f53e1f7f44aed0abf641446ec2b94cae066b02"); - ADD_CHECKPOINT(600000, "f5828ebf7d7d1cb61762c4dfe3ccf4ecab2e1aad23e8113668d981713b7a54c5"); - ADD_CHECKPOINT(700000, "12be9b3d210b93f574d2526abb9c1ab2a881b479131fd0d4f7dac93875f503cd"); - ADD_CHECKPOINT(825000, "56503f9ad766774b575be3aff73245e9d159be88132c93d1754764f28da2ff60"); - ADD_CHECKPOINT(900000, "d9958d0e7dcf91a5a7b11de225927bf7efc6eb26240315ce12372be902cc1337"); - ADD_CHECKPOINT(913193, "5292d5d56f6ba4de33a58d9a34d263e2cb3c6fee0aed2286fd4ac7f36d53c85f"); - ADD_CHECKPOINT(1000000, "a886ef5149902d8342475fee9bb296341b891ac67c4842f47a833f23c00ed721"); - ADD_CHECKPOINT(1100000, "3fd720c5c8b3072fc1ccda922dec1ef25f9ed88a1e6ad4103d0fe00b180a5903"); - ADD_CHECKPOINT(1150000, "1dd16f626d18e1e988490dfd06de5920e22629c972c58b4d8daddea0038627b2"); - ADD_CHECKPOINT(1200000, "fa7d13a90850882060479d100141ff84286599ae39c3277c8ea784393f882d1f"); - ADD_CHECKPOINT(1300000, "31b34272343a44a9f4ac7de7a8fcf3b7d8a3124d7d6870affd510d2f37e74cd0"); - ADD_CHECKPOINT(1390000, "a8f5649dd4ded60eedab475f2bec8c934681c07e3cf640e9be0617554f13ff6c"); - ADD_CHECKPOINT(1450000, "ac94e8860093bc7c83e4e91215cba1d663421ecf4067a0ae609c3a8b52bcfac2"); - ADD_CHECKPOINT(1530000, "01759bce497ec38e63c78b1038892169203bb78f87e488172f6b854fcd63ba7e"); - ADD_CHECKPOINT(1579000, "7d0d7a2346373afd41ed1e744a939fc5d474a7dbaa257be5c6fff4009e789241"); - ADD_CHECKPOINT(1668900, "ac2dcaf3d2f58ffcf8391639f0f1ebafcb8eac43c49479c7c37f611868d07568"); - ADD_CHECKPOINT(1775600, "1c6e01c661dc22cab939e79ec6a5272190624ce8356d2f7b958e4f9a57fdb05e"); + ADD_CHECKPOINT(1, "97f4ce4d7879b3bea54dcec738cd2ebb7952b4e9bb9743262310cd5fec749340"); + ADD_CHECKPOINT(10, "305472c87ff86d8afb3ec42634828462b0ed3d929fc05fa1ae668c3bee04837a"); + ADD_CHECKPOINT(100, "a92b9deae26e19322041cbc2f850fa905748ae1e5bf69b35ca90b247c5cbfc04"); + ADD_CHECKPOINT(1000, "62921e13030b29264439cafaf8320cf8aa039ee6ba7ba29c72f11b50a079269a"); + ADD_CHECKPOINT(2000, "b3e1d73e3d0243239481aa76cb075cf2428556f5dc4f2e30428ea2ba36693e97"); + ADD_CHECKPOINT(3000, "83a6e1ab394e80b8442b7b70b0e4c3a9fa0143e0ca51a33e829537ef5dd1bf13"); + ADD_CHECKPOINT(4000, "7c70722d8cb8106b4bec67e1790614cc6e98db7afd0843b96cdff6960a0e0073"); + ADD_CHECKPOINT(5000, "331ee74008e174e5fd1956f64c52793961b321a1366f7c6f7d324e8265df34f6"); + ADD_CHECKPOINT(6969, "aa7b66e8c461065139b55c29538a39c33ceda93e587f84d490ed573d80511c87"); //Hard fork to v8 + ADD_CHECKPOINT(7000, "2711bd33b107f744ad8bf98c1acefa18658780079496bd2f3a36f2e20b261f8e"); + ADD_CHECKPOINT(7500, "5975967c4624f13f058acafe7adf9355e03e8e802eeadc84ccb22ea588bc0762"); + ADD_CHECKPOINT(7900, "d9bc18cb35feb6b26bc5a19bbdbf7c852d9cc02883acb5bbce2e87d8b2c86069"); + ADD_CHECKPOINT(10000, "bc5bfbf1b26c8f976d1d792ece4c6a7e93064bec62b72f1d5beae74c3f273b3b"); + ADD_CHECKPOINT(20000, "52cc7edcb49eb02f28a653b824089a726f4050eb210263ee6f4180d388a1e5cc"); + ADD_CHECKPOINT(30000, "d22fde5dd240ade16d3250eb0aa5d1c16dc7cb51c20484e05eb274911032b3fa"); + ADD_CHECKPOINT(40000, "aee0d642322542ba069cb1c58ab2acd3560f108d4682c3dc3cb15a54d442d91f"); + ADD_CHECKPOINT(50000, "5286ac2a0f39b3aefcba363cd71f2760bd1e0d763cbc81026ebdc3f80a86541f"); + ADD_CHECKPOINT(53666, "3f43f56f66ef0c43cf2fd14d0d28fa2aae0ef8f40716773511345750770f1255"); //Hard fork to v9 + ADD_CHECKPOINT(54500, "8ed3078b389c2b44add007803d741b58d3fbed2e1ba4139bda702152d8773c9b"); + ADD_CHECKPOINT(55000, "4b662ceccefc3247edb4d654dd610b8fb496e85b88a5de43cc2bdd28171b15ff"); + ADD_CHECKPOINT(57000, "08a79f09f12bb5d230b63963356a760d51618e526cfc636047a6f3798217c177"); + ADD_CHECKPOINT(59000, "180b51ee2c5fbcd4362eb7a29df9422481310dd77d10bccdf8930724c31e007e"); + ADD_CHECKPOINT(59900, "18cc0653ef39cb304c68045dba5eb6b885f936281cd939dea04d0e6c9cd4ae2e"); + ADD_CHECKPOINT(60000, "0f02aa57a63f79f63dafed9063abe228a37cb19f00430dc3168b8a8f4ae8016c"); + ADD_CHECKPOINT(61000, "509aca8c54eb5fe44623768757b6e890ae39d512478c75f614cbff3d91809350"); + ADD_CHECKPOINT(62000, "7fe91ad256c08dbd961e04738968be22fb481093fbfa7959bde7796ccceba0e2"); + ADD_CHECKPOINT(62150, "1a7c75f8ebeda0e20eb5877181eafd7db0fc887e3fed43e0b27ab2e7bccafd10"); + ADD_CHECKPOINT(62269, "4969555d60742afb93925fd96d83ac28f45e6e3c0e583c9fb3c92d9b2100d38f"); + ADD_CHECKPOINT(62405, "4d0ae890cf9f875f231c7069508ad28dc429d14814b52db114dfab7519a27584"); + ADD_CHECKPOINT(62419, "bd8bf5ac4c4fb07ab4d0d492bd1699def5c095ab6943ad3b63a89d1d8b1ce748"); + ADD_CHECKPOINT(62425, "41a922dba6f3906871b2ccaf31ec9c91033470c503959093dae796deda8940ea"); + ADD_CHECKPOINT(62479, "a2e8ff4205ba2980eb70921b0b21b5fc656ee273664ea94b860c68ca069b60dd"); + ADD_CHECKPOINT(62503, "25fa115962988b4b8f8cfd22744a3e653b22ead8c8468e64caf334fc75a97d08"); + ADD_CHECKPOINT(62550, "bde522a8a81c392c98c979434aa1dd9d20b4ca52230ba6ae0362872757808a48"); + ADD_CHECKPOINT(62629, "8368e1ce1d421f1fc969364558433e2b2363d0ffcb5f2d946633095e3e6734f5"); + ADD_CHECKPOINT(62720, "f871cddd75951e2fe24c282d2bd28396fc922ea519b354ace992a0162cb333ff"); + ADD_CHECKPOINT(62733, "8331dbeeaf23173d2235a062373a437befadb6492cceb7640127bf18653a9e61"); + ADD_CHECKPOINT(62877, "62d44adc05d7d4fd9d15239c5575612207beab0bcf2da49158bf89e365441ca1"); + ADD_CHECKPOINT(63469, "4e33a9343fc5b86661ec0affaeb5b5a065290602c02d817337e4a979fe5747d8"); //Hard fork to v10 + ADD_CHECKPOINT(69800, "5c65428a664738bc083d1ccd6a1b5ff4305f98e7633f44033816801429b33ce1"); + ADD_CHECKPOINT(75000, "e93492f79b5344e7edb31537ee65b3e908bf71110cff8188c0c62fefc015d342"); + ADD_CHECKPOINT(79500, "9bbfd6f2257ce9084de30179944b7695c9b918c9c03a8a63306ab6c5828ff857"); + ADD_CHECKPOINT(80920, "8fca818344f97ea3912557cbd8be659cf6a5bc1203514c27338e234251d72dfb"); + ADD_CHECKPOINT(81769, "41db9fef8d0ccfa78b570ee9525d4f55de77b510c3ae4b08a1d51b9aec9ade1d"); //Hard fork to v11 + ADD_CHECKPOINT(82069, "fdea800d23d0b2eea19dec8af31e453e883e8315c97e25c8bb3e88ca164f8369"); //Hard fork to v12 + ADD_CHECKPOINT(85000, "31d62ab75470b15aedee6674b78767b53f10951786e991c26035743c267b247a"); + return true; } @@ -255,22 +260,13 @@ namespace cryptonote std::vector records; // All four MoneroPulse domains have DNSSEC on and valid - static const std::vector dns_urls = { "checkpoints.moneropulse.se" - , "checkpoints.moneropulse.org" - , "checkpoints.moneropulse.net" - , "checkpoints.moneropulse.co" + static const std::vector dns_urls = { }; - static const std::vector testnet_dns_urls = { "testpoints.moneropulse.se" - , "testpoints.moneropulse.org" - , "testpoints.moneropulse.net" - , "testpoints.moneropulse.co" + static const std::vector testnet_dns_urls = { }; - static const std::vector stagenet_dns_urls = { "stagenetpoints.moneropulse.se" - , "stagenetpoints.moneropulse.org" - , "stagenetpoints.moneropulse.net" - , "stagenetpoints.moneropulse.co" + static const std::vector stagenet_dns_urls = { }; if (!tools::dns_utils::load_txt_records_from_dns(records, nettype == TESTNET ? testnet_dns_urls : nettype == STAGENET ? stagenet_dns_urls : dns_urls)) diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp index f2b270981..e1e9e8a5b 100644 --- a/src/common/dns_utils.cpp +++ b/src/common/dns_utils.cpp @@ -103,8 +103,6 @@ get_builtin_ds(void) { static const char * const ds[] = { - ". IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5\n", - ". IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D\n", NULL }; return ds; diff --git a/src/common/updates.cpp b/src/common/updates.cpp index 9f12f8dbc..391cc65e8 100644 --- a/src/common/updates.cpp +++ b/src/common/updates.cpp @@ -46,10 +46,6 @@ namespace tools // All four MoneroPulse domains have DNSSEC on and valid static const std::vector dns_urls = { - "updates.moneropulse.org", - "updates.moneropulse.net", - "updates.moneropulse.co", - "updates.moneropulse.se" }; if (!tools::dns_utils::load_txt_records_from_dns(records, dns_urls)) @@ -99,7 +95,7 @@ namespace tools std::string get_update_url(const std::string &software, const std::string &subdir, const std::string &buildtag, const std::string &version, bool user) { - const char *base = user ? "https://downloads.getmonero.org/" : "https://updates.getmonero.org/"; + const char *base = user ? "" : ""; #ifdef _WIN32 static const char *extension = strncmp(buildtag.c_str(), "install-", 8) ? ".zip" : ".exe"; #else diff --git a/src/cryptonote_basic/cryptonote_basic_impl.cpp b/src/cryptonote_basic/cryptonote_basic_impl.cpp index b18ef1c5c..f000a8dab 100644 --- a/src/cryptonote_basic/cryptonote_basic_impl.cpp +++ b/src/cryptonote_basic/cryptonote_basic_impl.cpp @@ -93,7 +93,7 @@ namespace cryptonote { const int emission_speed_factor = EMISSION_SPEED_FACTOR_PER_MINUTE - (target_minutes-1); uint64_t base_reward = (MONEY_SUPPLY - already_generated_coins) >> emission_speed_factor; - if (base_reward < FINAL_SUBSIDY_PER_MINUTE*target_minutes) + if (base_reward <= FINAL_SUBSIDY_PER_MINUTE*target_minutes) { base_reward = FINAL_SUBSIDY_PER_MINUTE*target_minutes; } diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp index 5fcfa33f6..7f1dc19cc 100644 --- a/src/cryptonote_basic/cryptonote_format_utils.cpp +++ b/src/cryptonote_basic/cryptonote_format_utils.cpp @@ -767,7 +767,7 @@ namespace cryptonote { switch (decimal_point) { - case 12: + case 11: case 9: case 6: case 3: @@ -790,8 +790,8 @@ namespace cryptonote decimal_point = default_decimal_point; switch (std::atomic_load(&default_decimal_point)) { - case 12: - return "monero"; + case 11: + return "wownero"; case 9: return "millinero"; case 6: @@ -991,29 +991,7 @@ namespace cryptonote //--------------------------------------------------------------- bool calculate_block_hash(const block& b, crypto::hash& res) { - // EXCEPTION FOR BLOCK 202612 - const std::string correct_blob_hash_202612 = "3a8a2b3a29b50fc86ff73dd087ea43c6f0d6b8f936c849194d5c84c737903966"; - const std::string existing_block_id_202612 = "bbd604d2ba11ba27935e006ed39c9bfdd99b76bf4a50654bc1e1e61217962698"; - crypto::hash block_blob_hash = get_blob_hash(block_to_blob(b)); - - if (string_tools::pod_to_hex(block_blob_hash) == correct_blob_hash_202612) - { - string_tools::hex_to_pod(existing_block_id_202612, res); - return true; - } - bool hash_result = get_object_hash(get_block_hashing_blob(b), res); - - if (hash_result) - { - // make sure that we aren't looking at a block with the 202612 block id but not the correct blobdata - if (string_tools::pod_to_hex(res) == existing_block_id_202612) - { - LOG_ERROR("Block with block id for 202612 but incorrect block blob hash found!"); - res = null_hash; - return false; - } - } - return hash_result; + return get_object_hash(get_block_hashing_blob(b), res); } //--------------------------------------------------------------- bool get_block_hash(const block& b, crypto::hash& res) @@ -1045,13 +1023,6 @@ namespace cryptonote //--------------------------------------------------------------- bool get_block_longhash(const block& b, crypto::hash& res, uint64_t height) { - // block 202612 bug workaround - const std::string longhash_202612 = "84f64766475d51837ac9efbef1926486e58563c95a19fef4aec3254f03000000"; - if (height == 202612) - { - string_tools::hex_to_pod(longhash_202612, res); - return true; - } blobdata bd = get_block_hashing_blob(b); const int cn_variant = b.major_version >= 7 ? b.major_version - 6 : 0; crypto::cn_slow_hash(bd.data(), bd.size(), res, cn_variant); diff --git a/src/cryptonote_basic/difficulty.cpp b/src/cryptonote_basic/difficulty.cpp index cb2a00a12..43147a07f 100644 --- a/src/cryptonote_basic/difficulty.cpp +++ b/src/cryptonote_basic/difficulty.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "common/int-util.h" #include "crypto/hash.h" @@ -162,4 +163,149 @@ namespace cryptonote { return (low + time_span - 1) / time_span; } + // LWMA difficulty algorithm + // Background: https://github.com/zawy12/difficulty-algorithms/issues/3 + // Copyright (c) 2017-2018 Zawy + difficulty_type next_difficulty_v2(std::vector timestamps, std::vector cumulative_difficulties, size_t target_seconds) { + + const int64_t T = static_cast(target_seconds); + size_t N = DIFFICULTY_WINDOW_V2; + if (timestamps.size() < 4) { + return 1; + } else if ( timestamps.size() < N+1 ) { + N = timestamps.size() - 1; + } else { + timestamps.resize(N+1); + cumulative_difficulties.resize(N+1); + } + const double adjust = 0.998; + const double k = N * (N + 1) / 2; + double LWMA(0), sum_inverse_D(0), harmonic_mean_D(0), nextDifficulty(0); + int64_t solveTime(0); + uint64_t difficulty(0), next_difficulty(0); + for (size_t i = 1; i <= N; i++) { + solveTime = static_cast(timestamps[i]) - static_cast(timestamps[i - 1]); + solveTime = std::min((T * 7), std::max(solveTime, (-7 * T))); + difficulty = cumulative_difficulties[i] - cumulative_difficulties[i - 1]; + LWMA += (int64_t)(solveTime * i) / k; + sum_inverse_D += 1 / static_cast(difficulty); + } + harmonic_mean_D = N / sum_inverse_D; + if (static_cast(boost::math::round(LWMA)) < T / 20) + LWMA = static_cast(T / 20); + + nextDifficulty = harmonic_mean_D * T / LWMA * adjust; + next_difficulty = static_cast(nextDifficulty); + return next_difficulty; + } + + // LWMA-2 + difficulty_type next_difficulty_v3(std::vector timestamps, std::vector cumulative_difficulties) { + + int64_t T = DIFFICULTY_TARGET_V2; + int64_t N = DIFFICULTY_WINDOW_V2; + int64_t L(0), ST, sum_3_ST(0), next_D, prev_D; + assert(timestamps.size() == cumulative_difficulties.size() && timestamps.size() <= static_cast(N+1) ); + for ( int64_t i = 1; i <= N; i++ ) { + ST = static_cast(timestamps[i]) - static_cast(timestamps[i-1]); + ST = std::max(-4*T, std::min(ST, 6*T)); + L += ST * i ; + if ( i > N-3 ) { + sum_3_ST += ST; + } + } + next_D = (static_cast(cumulative_difficulties[N] - cumulative_difficulties[0])*T*(N+1)*99)/(100*2*L); + prev_D = cumulative_difficulties[N] - cumulative_difficulties[N-1]; + next_D = std::max((prev_D*67)/100, std::min(next_D, (prev_D*150)/100)); + if ( sum_3_ST < (8*T)/10) { + next_D = std::max(next_D,(prev_D*108)/100); + } + return static_cast(next_D); + } + + // LWMA-4 + difficulty_type next_difficulty_v4(std::vector timestamps, std::vector cumulative_difficulties, size_t height) { + + uint64_t T = DIFFICULTY_TARGET_V2; + uint64_t N = DIFFICULTY_WINDOW_V2; + uint64_t L(0), ST(0), next_D, prev_D, avg_D, i; + assert(timestamps.size() == cumulative_difficulties.size() && timestamps.size() <= N+1 ); + if ( height <= 63469 + 1 ) { return 100000069; } + std::vectorTS(N+1); + TS[0] = timestamps[0]; + for ( i = 1; i <= N; i++) { + if ( timestamps[i] > TS[i-1] ) { TS[i] = timestamps[i]; } + else { TS[i] = TS[i-1]; } + } + for ( i = 1; i <= N; i++) { + if ( i > 4 && TS[i]-TS[i-1] > 5*T && TS[i-1] - TS[i-4] < (14*T)/10 ) { ST = 2*T; } + else if ( i > 7 && TS[i]-TS[i-1] > 5*T && TS[i-1] - TS[i-7] < 4*T ) { ST = 2*T; } + else { + ST = std::min(5*T ,TS[i] - TS[i-1]); + } + L += ST * i ; + } + if (L < N*N*T/20 ) { L = N*N*T/20; } + avg_D = ( cumulative_difficulties[N] - cumulative_difficulties[0] )/ N; + if (avg_D > 2000000*N*N*T) { + next_D = (avg_D/(200*L))*(N*(N+1)*T*97); + } + else { next_D = (avg_D*N*(N+1)*T*97)/(200*L); } + prev_D = cumulative_difficulties[N] - cumulative_difficulties[N-1] ; + if ( ( TS[N] - TS[N-1] < (2*T)/10 ) || + ( TS[N] - TS[N-2] < (5*T)/10 ) || + ( TS[N] - TS[N-3] < (8*T)/10 ) ) + { + next_D = std::max( next_D, std::min( (prev_D*110)/100, (105*avg_D)/100 ) ); + } + i = 1000000000; + while (i > 1) { + if ( next_D > i*100 ) { next_D = ((next_D+i/2)/i)*i; break; } + else { i /= 10; } + } + if ( next_D > 100000 ) { + next_D = ((next_D+500)/1000)*1000 + std::min(static_cast(999), (TS[N]-TS[N-10])/10); + } + return static_cast(next_D); + } + + difficulty_type next_difficulty_v5(std::vector timestamps, std::vector cumulative_difficulties, size_t target_seconds) { + + if(timestamps.size() > DIFFICULTY_WINDOW_V3) + { + timestamps.resize(DIFFICULTY_WINDOW_V3); + cumulative_difficulties.resize(DIFFICULTY_WINDOW_V3); + } + + size_t length = timestamps.size(); + assert(length == cumulative_difficulties.size()); + if (length < DIFFICULTY_FORK_HEIGHT + 72) { + return DIFFICULTY_RESET; + } + static_assert(DIFFICULTY_WINDOW_V3 >= 2, "Window is too small"); + assert(length <= DIFFICULTY_WINDOW_V3); + sort(timestamps.begin(), timestamps.end()); + size_t cut_begin, cut_end; + static_assert(2 * DIFFICULTY_CUT_V2 <= DIFFICULTY_WINDOW_V3 - 2, "Cut length is too large"); + if (length <= DIFFICULTY_WINDOW_V3 - 2 * DIFFICULTY_CUT_V2) { + cut_begin = 0; + cut_end = length; + } else { + cut_begin = (length - (DIFFICULTY_WINDOW_V3 - 2 * DIFFICULTY_CUT_V2) + 1) / 2; + cut_end = cut_begin + (DIFFICULTY_WINDOW_V3 - 2 * DIFFICULTY_CUT_V2); + } + assert(/*cut_begin >= 0 &&*/ cut_begin + 2 <= cut_end && cut_end <= length); + uint64_t time_span = timestamps[cut_end - 1] - timestamps[cut_begin]; + if (time_span == 0) { + time_span = 1; + } + difficulty_type total_work = cumulative_difficulties[cut_end - 1] - cumulative_difficulties[cut_begin]; + assert(total_work > 0); + uint64_t low, high; + mul(total_work, target_seconds, low, high); + if (high != 0 || low + time_span - 1 < low) { + return 0; + } + return (low + time_span - 1) / time_span; + } } diff --git a/src/cryptonote_basic/difficulty.h b/src/cryptonote_basic/difficulty.h index b06538467..65c5956b1 100644 --- a/src/cryptonote_basic/difficulty.h +++ b/src/cryptonote_basic/difficulty.h @@ -53,4 +53,8 @@ namespace cryptonote */ bool check_hash(const crypto::hash &hash, difficulty_type difficulty); difficulty_type next_difficulty(std::vector timestamps, std::vector cumulative_difficulties, size_t target_seconds); + difficulty_type next_difficulty_v2(std::vector timestamps, std::vector cumulative_difficulties, size_t target_seconds); + difficulty_type next_difficulty_v3(std::vector timestamps, std::vector cumulative_difficulties); + difficulty_type next_difficulty_v4(std::vector timestamps, std::vector cumulative_difficulties, size_t height); + difficulty_type next_difficulty_v5(std::vector timestamps, std::vector cumulative_difficulties, size_t target_seconds); } diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h index 147e1e7ce..b1ca88466 100644 --- a/src/cryptonote_config.h +++ b/src/cryptonote_config.h @@ -42,17 +42,20 @@ #define CRYPTONOTE_PUBLIC_ADDRESS_TEXTBLOB_VER 0 #define CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW 60 #define CURRENT_TRANSACTION_VERSION 2 -#define CURRENT_BLOCK_MAJOR_VERSION 1 -#define CURRENT_BLOCK_MINOR_VERSION 0 +#define CURRENT_BLOCK_MAJOR_VERSION 7 +#define CURRENT_BLOCK_MINOR_VERSION 7 +#define CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT_V2 300*2 #define CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT 60*60*2 -#define CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE 10 +#define CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE 4 +#define BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V3 12 +#define BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V2 11 #define BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW 60 // MONEY_SUPPLY - total number coins to be generated #define MONEY_SUPPLY ((uint64_t)(-1)) -#define EMISSION_SPEED_FACTOR_PER_MINUTE (20) -#define FINAL_SUBSIDY_PER_MINUTE ((uint64_t)300000000000) // 3 * pow(10, 11) +#define EMISSION_SPEED_FACTOR_PER_MINUTE (24) +#define FINAL_SUBSIDY_PER_MINUTE ((uint64_t)(0)) #define CRYPTONOTE_REWARD_BLOCKS_WINDOW 100 #define CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE_V2 60000 //size of block (bytes) after which reward for block calculated using block size @@ -61,9 +64,9 @@ #define CRYPTONOTE_LONG_TERM_BLOCK_WEIGHT_WINDOW_SIZE 100000 // size in blocks of the long term block weight median window #define CRYPTONOTE_SHORT_TERM_BLOCK_WEIGHT_SURGE_FACTOR 50 #define CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE 600 -#define CRYPTONOTE_DISPLAY_DECIMAL_POINT 12 +#define CRYPTONOTE_DISPLAY_DECIMAL_POINT 11 // COIN - number of smallest units in one coin -#define COIN ((uint64_t)1000000000000) // pow(10, 12) +#define COIN ((uint64_t)100000000000) // pow(10, 11) #define FEE_PER_KB_OLD ((uint64_t)10000000000) // pow(10, 10) #define FEE_PER_KB ((uint64_t)2000000000) // 2 * pow(10, 9) @@ -76,13 +79,20 @@ #define ORPHANED_BLOCKS_MAX_COUNT 100 -#define DIFFICULTY_TARGET_V2 120 // seconds -#define DIFFICULTY_TARGET_V1 60 // seconds - before first fork +#define DIFFICULTY_TARGET_V2 300 +#define DIFFICULTY_TARGET_V1 300 +#define DIFFICULTY_WINDOW_V3 144 +#define DIFFICULTY_WINDOW_V2 60 #define DIFFICULTY_WINDOW 720 // blocks +#define DIFFICULTY_LAG_V2 3 #define DIFFICULTY_LAG 15 // !!! +#define DIFFICULTY_CUT_V2 12 #define DIFFICULTY_CUT 60 // timestamps to cut after sorting +#define DIFFICULTY_BLOCKS_COUNT_V3 DIFFICULTY_WINDOW_V3 + DIFFICULTY_LAG_V2 +#define DIFFICULTY_BLOCKS_COUNT_V2 DIFFICULTY_WINDOW_V2 + 1 // added +1 to make N=N #define DIFFICULTY_BLOCKS_COUNT DIFFICULTY_WINDOW + DIFFICULTY_LAG - +#define DIFFICULTY_FORK_HEIGHT 81769 // ~14 February 2019 +#define DIFFICULTY_RESET 10000000 // 10 million #define CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_SECONDS_V1 DIFFICULTY_TARGET_V1 * CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_BLOCKS #define CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_SECONDS_V2 DIFFICULTY_TARGET_V2 * CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_BLOCKS @@ -125,7 +135,7 @@ #define ALLOW_DEBUG_COMMANDS -#define CRYPTONOTE_NAME "bitmonero" +#define CRYPTONOTE_NAME "wownero" #define CRYPTONOTE_POOLDATA_FILENAME "poolstate.bin" #define CRYPTONOTE_BLOCKCHAINDATA_FILENAME "data.mdb" #define CRYPTONOTE_BLOCKCHAINDATA_LOCK_FILENAME "lock.mdb" @@ -136,12 +146,12 @@ #define HF_VERSION_DYNAMIC_FEE 4 #define HF_VERSION_MIN_MIXIN_4 6 -#define HF_VERSION_MIN_MIXIN_6 7 -#define HF_VERSION_MIN_MIXIN_10 8 +#define HF_VERSION_MIN_MIXIN_7 7 +#define HF_VERSION_MIN_MIXIN_21 9 #define HF_VERSION_ENFORCE_RCT 6 -#define HF_VERSION_PER_BYTE_FEE 8 -#define HF_VERSION_LONG_TERM_BLOCK_WEIGHT 10 -#define HF_VERSION_SMALLER_BP 10 +#define HF_VERSION_PER_BYTE_FEE 12 +#define HF_VERSION_LONG_TERM_BLOCK_WEIGHT 13 +#define HF_VERSION_SMALLER_BP 13 #define PER_KB_FEE_QUANTIZATION_DECIMALS 8 @@ -160,31 +170,31 @@ namespace config uint64_t const BASE_REWARD_CLAMP_THRESHOLD = ((uint64_t)100000000); // pow(10, 8) std::string const P2P_REMOTE_DEBUG_TRUSTED_PUB_KEY = "0000000000000000000000000000000000000000000000000000000000000000"; - uint64_t const CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 18; - uint64_t const CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX = 19; - uint64_t const CRYPTONOTE_PUBLIC_SUBADDRESS_BASE58_PREFIX = 42; - uint16_t const P2P_DEFAULT_PORT = 18080; - uint16_t const RPC_DEFAULT_PORT = 18081; - uint16_t const ZMQ_RPC_DEFAULT_PORT = 18082; + uint64_t const CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 4146; + uint64_t const CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX = 6810; + uint64_t const CRYPTONOTE_PUBLIC_SUBADDRESS_BASE58_PREFIX = 12208; + uint16_t const P2P_DEFAULT_PORT = 34567; + uint16_t const RPC_DEFAULT_PORT = 34568; + uint16_t const ZMQ_RPC_DEFAULT_PORT = 34569; boost::uuids::uuid const NETWORK_ID = { { - 0x12 ,0x30, 0xF1, 0x71 , 0x61, 0x04 , 0x41, 0x61, 0x17, 0x31, 0x00, 0x82, 0x16, 0xA1, 0xA1, 0x10 + 0x11, 0x33, 0xFF, 0x77 , 0x61, 0x04 , 0x41, 0x61, 0x17, 0x31, 0x00, 0x82, 0x16, 0xA1, 0xA1, 0x10 } }; // Bender's nightmare - std::string const GENESIS_TX = "013c01ff0001ffffffffffff03029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121017767aafcde9be00dcfd098715ebcf7f410daebc582fda69d24a28e9d0bc890d1"; - uint32_t const GENESIS_NONCE = 10000; + std::string const GENESIS_TX = "013c01ff0001ffffffffff1f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121012a1a936be5d91c01ee876e38c13fab0ee11cbe86011a2bf7740fb5ebd39d267d"; + uint32_t const GENESIS_NONCE = 70; namespace testnet { uint64_t const CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX = 53; uint64_t const CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX = 54; uint64_t const CRYPTONOTE_PUBLIC_SUBADDRESS_BASE58_PREFIX = 63; - uint16_t const P2P_DEFAULT_PORT = 28080; - uint16_t const RPC_DEFAULT_PORT = 28081; - uint16_t const ZMQ_RPC_DEFAULT_PORT = 28082; + uint16_t const P2P_DEFAULT_PORT = 11180; + uint16_t const RPC_DEFAULT_PORT = 11181; + uint16_t const ZMQ_RPC_DEFAULT_PORT = 11182; boost::uuids::uuid const NETWORK_ID = { { - 0x12 ,0x30, 0xF1, 0x71 , 0x61, 0x04 , 0x41, 0x61, 0x17, 0x31, 0x00, 0x82, 0x16, 0xA1, 0xA1, 0x11 + 0x11, 0x33, 0xFF, 0x77 , 0x61, 0x04 , 0x41, 0x61, 0x17, 0x31, 0x00, 0x82, 0x16, 0xA1, 0xA1, 0x11 } }; // Bender's daydream - std::string const GENESIS_TX = "013c01ff0001ffffffffffff03029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd08807121017767aafcde9be00dcfd098715ebcf7f410daebc582fda69d24a28e9d0bc890d1"; - uint32_t const GENESIS_NONCE = 10001; + std::string const GENESIS_TX = "013c01ff0001ffffffffff1f029b2e4c0281c0b02e7c53291a94d1d0cbff8883f8024f5142ee494ffbbd088071210160eb755f618a2336055dee60f307fe0ded81c5b37b53d310175ca9ee69b0c8ad"; + uint32_t const GENESIS_NONCE = 70; } namespace stagenet diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index 94a66fb6b..3f6b7ce9b 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -90,34 +90,13 @@ static const struct { uint8_t threshold; time_t time; } mainnet_hard_forks[] = { - // version 1 from the start of the blockchain - { 1, 1, 0, 1341378000 }, - - // version 2 starts from block 1009827, which is on or around the 20th of March, 2016. Fork time finalised on 2015-09-20. No fork voting occurs for the v2 fork. - { 2, 1009827, 0, 1442763710 }, - - // version 3 starts from block 1141317, which is on or around the 24th of September, 2016. Fork time finalised on 2016-03-21. - { 3, 1141317, 0, 1458558528 }, - - // version 4 starts from block 1220516, which is on or around the 5th of January, 2017. Fork time finalised on 2016-09-18. - { 4, 1220516, 0, 1483574400 }, - - // version 5 starts from block 1288616, which is on or around the 15th of April, 2017. Fork time finalised on 2017-03-14. - { 5, 1288616, 0, 1489520158 }, - - // version 6 starts from block 1400000, which is on or around the 16th of September, 2017. Fork time finalised on 2017-08-18. - { 6, 1400000, 0, 1503046577 }, - - // version 7 starts from block 1546000, which is on or around the 6th of April, 2018. Fork time finalised on 2018-03-17. - { 7, 1546000, 0, 1521303150 }, - - // version 8 starts from block 1685555, which is on or around the 18th of October, 2018. Fork time finalised on 2018-09-02. - { 8, 1685555, 0, 1535889547 }, - - // version 9 starts from block 1686275, which is on or around the 19th of October, 2018. Fork time finalised on 2018-09-02. - { 9, 1686275, 0, 1535889548 }, + { 7, 1, 0, 1519605000 }, + { 8, 6969, 0, 1524214739 }, + { 9, 53666, 0, 1538689773 }, + { 10, 63469, 0, 1541700352 }, + { 11, 81769, 0, 1549238400 }, + { 12, 82069, 0, 1549318761 }, }; -static const uint64_t mainnet_hard_fork_version_1_till = 1009826; static const struct { uint8_t version; @@ -125,23 +104,14 @@ static const struct { uint8_t threshold; time_t time; } testnet_hard_forks[] = { - // version 1 from the start of the blockchain - { 1, 1, 0, 1341378000 }, - - // version 2 starts from block 624634, which is on or around the 23rd of November, 2015. Fork time finalised on 2015-11-20. No fork voting occurs for the v2 fork. - { 2, 624634, 0, 1445355000 }, - - // versions 3-5 were passed in rapid succession from September 18th, 2016 - { 3, 800500, 0, 1472415034 }, - { 4, 801219, 0, 1472415035 }, - { 5, 802660, 0, 1472415036 + 86400*180 }, // add 5 months on testnet to shut the update warning up since there's a large gap to v6 - - { 6, 971400, 0, 1501709789 }, - { 7, 1057027, 0, 1512211236 }, - { 8, 1057058, 0, 1533211200 }, - { 9, 1057778, 0, 1533297600 }, + { 7, 1, 0, 1341378000 }, + { 8, 10, 0, 1522624244 }, + { 9, 20, 0, 1543754910 }, + { 10, 30, 0, 1543795200 }, + { 11, 40, 0, 1543922445 }, + { 12, 50, 0, 1551916800 }, + { 13, 60, 0, 1551993902 }, }; -static const uint64_t testnet_hard_fork_version_1_till = 624633; static const struct { uint8_t version; @@ -149,18 +119,13 @@ static const struct { uint8_t threshold; time_t time; } stagenet_hard_forks[] = { - // version 1 from the start of the blockchain - { 1, 1, 0, 1341378000 }, - - // versions 2-7 in rapid succession from March 13th, 2018 - { 2, 32000, 0, 1521000000 }, - { 3, 33000, 0, 1521120000 }, - { 4, 34000, 0, 1521240000 }, - { 5, 35000, 0, 1521360000 }, - { 6, 36000, 0, 1521480000 }, - { 7, 37000, 0, 1521600000 }, - { 8, 176456, 0, 1537821770 }, - { 9, 177176, 0, 1537821771 }, + { 7, 1, 0, 1341378000 }, + { 8, 10, 0, 1522624244 }, + { 9, 20, 0, 1543754910 }, + { 10, 30, 0, 1543795200 }, + { 11, 40, 0, 1543922445 }, + { 12, 50, 0, 1551916800 }, + { 13, 60, 0, 1551993902 }, }; //------------------------------------------------------------------ @@ -371,9 +336,9 @@ bool Blockchain::init(BlockchainDB* db, const network_type nettype, bool offline if (m_nettype == FAKECHAIN || m_nettype == STAGENET) m_hardfork = new HardFork(*db, 1, 0); else if (m_nettype == TESTNET) - m_hardfork = new HardFork(*db, 1, testnet_hard_fork_version_1_till); + m_hardfork = new HardFork(*db, 1, 0); else - m_hardfork = new HardFork(*db, 1, mainnet_hard_fork_version_1_till); + m_hardfork = new HardFork(*db, 1, 0); } if (m_nettype == FAKECHAIN) { @@ -837,20 +802,31 @@ difficulty_type Blockchain::get_difficulty_for_next_block() std::vector timestamps; std::vector difficulties; auto height = m_db->height(); + + uint8_t version = get_current_hard_fork_version(); + uint64_t difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT; + if (version >= 11) { + difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT_V3; + } else if (version <= 10 && version >= 8) { + difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT_V2; + } else { + difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT; + } + // ND: Speedup // 1. Keep a list of the last 735 (or less) blocks that is used to compute difficulty, // then when the next block difficulty is queried, push the latest height data and // pop the oldest one from the list. This only requires 1x read per height instead // of doing 735 (DIFFICULTY_BLOCKS_COUNT). - if (m_timestamps_and_difficulties_height != 0 && ((height - m_timestamps_and_difficulties_height) == 1) && m_timestamps.size() >= DIFFICULTY_BLOCKS_COUNT) + if (m_timestamps_and_difficulties_height != 0 && ((height - m_timestamps_and_difficulties_height) == 1) && m_timestamps.size() >= difficulty_blocks_count) { uint64_t index = height - 1; m_timestamps.push_back(m_db->get_block_timestamp(index)); m_difficulties.push_back(m_db->get_block_cumulative_difficulty(index)); - while (m_timestamps.size() > DIFFICULTY_BLOCKS_COUNT) + while (m_timestamps.size() > difficulty_blocks_count) m_timestamps.erase(m_timestamps.begin()); - while (m_difficulties.size() > DIFFICULTY_BLOCKS_COUNT) + while (m_difficulties.size() > difficulty_blocks_count) m_difficulties.erase(m_difficulties.begin()); m_timestamps_and_difficulties_height = height; @@ -859,7 +835,7 @@ difficulty_type Blockchain::get_difficulty_for_next_block() } else { - size_t offset = height - std::min < size_t > (height, static_cast(DIFFICULTY_BLOCKS_COUNT)); + size_t offset = height - std::min < size_t > (height, static_cast(difficulty_blocks_count)); if (offset == 0) ++offset; @@ -883,6 +859,18 @@ difficulty_type Blockchain::get_difficulty_for_next_block() size_t target = get_difficulty_target(); difficulty_type diff = next_difficulty(timestamps, difficulties, target); + if (version >= 11) { + difficulty_type diff = next_difficulty_v5(timestamps, difficulties, target); + } else if (version == 10) { + difficulty_type diff = next_difficulty_v4(timestamps, difficulties, height); + } else if (version == 9) { + difficulty_type diff = next_difficulty_v3(timestamps, difficulties); + } else if (version == 8) { + difficulty_type diff = next_difficulty_v2(timestamps, difficulties, target); + } else { + difficulty_type diff = next_difficulty(timestamps, difficulties, target); + } + CRITICAL_REGION_LOCAL1(m_difficulty_lock); m_difficulty_for_next_block_top_hash = top_hash; m_difficulty_for_next_block = diff; @@ -1057,15 +1045,26 @@ difficulty_type Blockchain::get_next_difficulty_for_alternative_chain(const std: std::vector timestamps; std::vector cumulative_difficulties; + uint8_t version = get_current_hard_fork_version(); + size_t height = m_db->height(); + size_t difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT; + if (version >= 11) { + difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT_V3; + } else if (version <= 10 && version >= 8) { + difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT_V2; + } else { + difficulty_blocks_count = DIFFICULTY_BLOCKS_COUNT; + } + // if the alt chain isn't long enough to calculate the difficulty target // based on its blocks alone, need to get more blocks from the main chain - if(alt_chain.size()< DIFFICULTY_BLOCKS_COUNT) + if(alt_chain.size()< difficulty_blocks_count) { CRITICAL_REGION_LOCAL(m_blockchain_lock); // Figure out start and stop offsets for main chain blocks size_t main_chain_stop_offset = alt_chain.size() ? alt_chain.front()->second.height : bei.height; - size_t main_chain_count = DIFFICULTY_BLOCKS_COUNT - std::min(static_cast(DIFFICULTY_BLOCKS_COUNT), alt_chain.size()); + size_t main_chain_count = difficulty_blocks_count - std::min(static_cast(difficulty_blocks_count), alt_chain.size()); main_chain_count = std::min(main_chain_count, main_chain_stop_offset); size_t main_chain_start_offset = main_chain_stop_offset - main_chain_count; @@ -1080,7 +1079,7 @@ difficulty_type Blockchain::get_next_difficulty_for_alternative_chain(const std: } // make sure we haven't accidentally grabbed too many blocks...maybe don't need this check? - CHECK_AND_ASSERT_MES((alt_chain.size() + timestamps.size()) <= DIFFICULTY_BLOCKS_COUNT, false, "Internal error, alt_chain.size()[" << alt_chain.size() << "] + vtimestampsec.size()[" << timestamps.size() << "] NOT <= DIFFICULTY_WINDOW[]" << DIFFICULTY_BLOCKS_COUNT); + CHECK_AND_ASSERT_MES((alt_chain.size() + timestamps.size()) <= difficulty_blocks_count, false, "Internal error, alt_chain.size()[" << alt_chain.size() << "] + vtimestampsec.size()[" << timestamps.size() << "] NOT <= DIFFICULTY_WINDOW[]" << difficulty_blocks_count); for (auto it : alt_chain) { @@ -1092,8 +1091,8 @@ difficulty_type Blockchain::get_next_difficulty_for_alternative_chain(const std: // and timestamps from it alone else { - timestamps.resize(static_cast(DIFFICULTY_BLOCKS_COUNT)); - cumulative_difficulties.resize(static_cast(DIFFICULTY_BLOCKS_COUNT)); + timestamps.resize(static_cast(difficulty_blocks_count)); + cumulative_difficulties.resize(static_cast(difficulty_blocks_count)); size_t count = 0; size_t max_i = timestamps.size()-1; // get difficulties and timestamps from most recent blocks in alt chain @@ -1102,7 +1101,7 @@ difficulty_type Blockchain::get_next_difficulty_for_alternative_chain(const std: timestamps[max_i - count] = it->second.bl.timestamp; cumulative_difficulties[max_i - count] = it->second.cumulative_difficulty; count++; - if(count >= DIFFICULTY_BLOCKS_COUNT) + if(count >= difficulty_blocks_count) break; } } @@ -1111,7 +1110,17 @@ difficulty_type Blockchain::get_next_difficulty_for_alternative_chain(const std: size_t target = get_ideal_hard_fork_version(bei.height) < 2 ? DIFFICULTY_TARGET_V1 : DIFFICULTY_TARGET_V2; // calculate the difficulty target for the block and return it - return next_difficulty(timestamps, cumulative_difficulties, target); + if (version >= 11) { + return next_difficulty_v5(timestamps, cumulative_difficulties, target); + } else if (version == 10) { + return next_difficulty_v4(timestamps, cumulative_difficulties, height); + } else if (version == 9) { + return next_difficulty_v3(timestamps, cumulative_difficulties); + } else if (version == 8) { + return next_difficulty_v2(timestamps, cumulative_difficulties, target); + } else { + return next_difficulty(timestamps, cumulative_difficulties, target); + } } //------------------------------------------------------------------ // This function does a sanity check on basic things that all miner @@ -1422,12 +1431,13 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m bool Blockchain::complete_timestamps_vector(uint64_t start_top_height, std::vector& timestamps) { LOG_PRINT_L3("Blockchain::" << __func__); - - if(timestamps.size() >= BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW) + uint8_t version = get_current_hard_fork_version(); + size_t blockchain_timestamp_check_window = version >= 11 ? BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V3 : version == 11 ? BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V2 : BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW; + if(timestamps.size() >= blockchain_timestamp_check_window) return true; CRITICAL_REGION_LOCAL(m_blockchain_lock); - size_t need_elements = BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW - timestamps.size(); + size_t need_elements = blockchain_timestamp_check_window - timestamps.size(); CHECK_AND_ASSERT_MES(start_top_height < m_db->height(), false, "internal error: passed start_height not < " << " m_db->height() -- " << start_top_height << " >= " << m_db->height()); size_t stop_offset = start_top_height > need_elements ? start_top_height - need_elements : 0; timestamps.reserve(timestamps.size() + start_top_height - stop_offset); @@ -2381,26 +2391,26 @@ bool Blockchain::check_tx_outputs(const transaction& tx, tx_verification_context } } - // from v8, allow bulletproofs - if (hf_version < 8) { + // from v11, allow bulletproofs + if (hf_version < 11) { if (tx.version >= 2) { const bool bulletproof = rct::is_rct_bulletproof(tx.rct_signatures.type); if (bulletproof || !tx.rct_signatures.p.bulletproofs.empty()) { - MERROR_VER("Bulletproofs are not allowed before v8"); + MERROR_VER("New Bulletproofs are not allowed before v11"); tvc.m_invalid_output = true; return false; } } } - // from v9, forbid borromean range proofs - if (hf_version > 8) { + // from v12, forbid borromean range proofs + if (hf_version > 11) { if (tx.version >= 2) { const bool borromean = rct::is_rct_borromean(tx.rct_signatures.type); if (borromean) { - MERROR_VER("Borromean range proofs are not allowed after v8"); + MERROR_VER("Borromean range proofs are not allowed after v11"); tvc.m_invalid_output = true; return false; } @@ -2539,7 +2549,7 @@ bool Blockchain::check_tx_inputs(transaction& tx, tx_verification_context &tvc, { size_t n_unmixable = 0, n_mixable = 0; size_t mixin = std::numeric_limits::max(); - const size_t min_mixin = hf_version >= HF_VERSION_MIN_MIXIN_10 ? 10 : hf_version >= HF_VERSION_MIN_MIXIN_6 ? 6 : hf_version >= HF_VERSION_MIN_MIXIN_4 ? 4 : 2; + const size_t min_mixin = hf_version >= HF_VERSION_MIN_MIXIN_21 ? 21 : hf_version >= HF_VERSION_MIN_MIXIN_7 ? 7 : hf_version >= HF_VERSION_MIN_MIXIN_4 ? 4 : 2; for (const auto& txin : tx.vin) { // non txin_to_key inputs will be rejected below @@ -2568,9 +2578,9 @@ bool Blockchain::check_tx_inputs(transaction& tx, tx_verification_context &tvc, } } - if (((hf_version == HF_VERSION_MIN_MIXIN_10 || hf_version == HF_VERSION_MIN_MIXIN_10+1) && mixin != 10) || (hf_version >= HF_VERSION_MIN_MIXIN_10+2 && mixin > 10)) + if (hf_version >= HF_VERSION_MIN_MIXIN_21 && mixin != 21) { - MERROR_VER("Tx " << get_transaction_hash(tx) << " has invalid ring size (" << (mixin + 1) << "), it should be 11"); + MERROR_VER("Tx " << get_transaction_hash(tx) << " has invalid ring size (" << (mixin + 1) << "), it should be 22"); tvc.m_low_mixin = true; return false; } @@ -2895,13 +2905,13 @@ bool Blockchain::check_tx_inputs(transaction& tx, tx_verification_context &tvc, // for bulletproofs, check they're only multi-output after v8 if (rct::is_rct_bulletproof(rv.type)) { - if (hf_version < 8) + if (hf_version < 11) { for (const rct::Bulletproof &proof: rv.p.bulletproofs) { if (proof.V.size() > 1) { - MERROR_VER("Multi output bulletproofs are invalid before v8"); + MERROR_VER("Multi output bulletproofs are invalid before v11"); return false; } } @@ -3168,10 +3178,11 @@ bool Blockchain::check_block_timestamp(std::vector& timestamps, const { LOG_PRINT_L3("Blockchain::" << __func__); median_ts = epee::misc_utils::median(timestamps); - + uint8_t version = get_current_hard_fork_version(); + size_t blockchain_timestamp_check_window = version >= 11 ? BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V3 : version == 11 ? BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V2 : BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW; if(b.timestamp < median_ts) { - MERROR_VER("Timestamp of block with id: " << get_block_hash(b) << ", " << b.timestamp << ", less than median of last " << BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW << " blocks, " << median_ts); + MERROR_VER("Timestamp of block with id: " << get_block_hash(b) << ", " << b.timestamp << ", less than median of last " << blockchain_timestamp_check_window << " blocks, " << median_ts); return false; } @@ -3188,14 +3199,18 @@ bool Blockchain::check_block_timestamp(std::vector& timestamps, const bool Blockchain::check_block_timestamp(const block& b, uint64_t& median_ts) const { LOG_PRINT_L3("Blockchain::" << __func__); - if(b.timestamp > get_adjusted_time() + CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT) + uint8_t version = get_current_hard_fork_version(); + uint64_t cryptonote_block_future_time_limit = version >= 8 ? CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT_V2 : CRYPTONOTE_BLOCK_FUTURE_TIME_LIMIT; + size_t blockchain_timestamp_check_window = version >= 11 ? BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V3 : version == 11 ? BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW_V2 : BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW; + + if(b.timestamp > get_adjusted_time() + cryptonote_block_future_time_limit) { - MERROR_VER("Timestamp of block with id: " << get_block_hash(b) << ", " << b.timestamp << ", bigger than adjusted time + 2 hours"); + MERROR_VER("Timestamp of block with id: " << get_block_hash(b) << ", " << b.timestamp << ", bigger than adjusted time + 10 minutes"); return false; } // if not enough blocks, no proper median yet, return true - if(m_db->height() < BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW) + if(m_db->height() < blockchain_timestamp_check_window) { return true; } @@ -3204,7 +3219,7 @@ bool Blockchain::check_block_timestamp(const block& b, uint64_t& median_ts) cons auto h = m_db->height(); // need most recent 60 blocks, get index of first of those - size_t offset = h - BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW; + size_t offset = h - blockchain_timestamp_check_window; timestamps.reserve(h - offset); for(;offset < h; ++offset) { @@ -4540,7 +4555,7 @@ void Blockchain::cancel() } #if defined(PER_BLOCK_CHECKPOINT) -static const char expected_block_hashes_hash[] = "570ce2357b08fadac6058e34f95c5e08323f9325de260d07b091a281a948a7b0"; +static const char expected_block_hashes_hash[] = "57465b2e1d648df696dc02b4aeddc357493678e9e5b145226fd4af1aceb02165"; void Blockchain::load_compiled_in_block_hashes() { const bool testnet = m_nettype == TESTNET; diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp index b0ed7d941..1bfefb42d 100644 --- a/src/cryptonote_core/cryptonote_core.cpp +++ b/src/cryptonote_core/cryptonote_core.cpp @@ -449,8 +449,8 @@ namespace cryptonote if (boost::filesystem::exists(old_files / "blockchain.bin")) { MWARNING("Found old-style blockchain.bin in " << old_files.string()); - MWARNING("Monero now uses a new format. You can either remove blockchain.bin to start syncing"); - MWARNING("the blockchain anew, or use monero-blockchain-export and monero-blockchain-import to"); + MWARNING("Wownero now uses a new format. You can either remove blockchain.bin to start syncing"); + MWARNING("the blockchain anew, or use wownero-blockchain-export and wownero-blockchain-import to"); MWARNING("convert your existing blockchain.bin to the new format. See README.md for instructions."); return false; } diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl index c2c660e8c..1f4c5f466 100644 --- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl +++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl @@ -302,7 +302,7 @@ namespace cryptonote int64_t diff = static_cast(hshd.current_height) - static_cast(m_core.get_current_blockchain_height()); uint64_t abs_diff = std::abs(diff); uint64_t max_block_height = std::max(hshd.current_height,m_core.get_current_blockchain_height()); - uint64_t last_block_v1 = m_core.get_nettype() == TESTNET ? 624633 : m_core.get_nettype() == MAINNET ? 1009826 : (uint64_t)-1; + uint64_t last_block_v1 = m_core.get_nettype() == TESTNET ? 0 : m_core.get_nettype() == MAINNET ? 0 : (uint64_t)-1; uint64_t diff_v2 = max_block_height > last_block_v1 ? std::min(abs_diff, max_block_height - last_block_v1) : 0; MCLOG(is_inital ? el::Level::Info : el::Level::Debug, "global", context << "Sync data returned a new top block candidate: " << m_core.get_current_blockchain_height() << " -> " << hshd.current_height << " [Your node is " << abs_diff << " blocks (" << ((abs_diff - diff_v2) / (24 * 60 * 60 / DIFFICULTY_TARGET_V1)) + (diff_v2 / (24 * 60 * 60 / DIFFICULTY_TARGET_V2)) << " days) " @@ -1592,7 +1592,7 @@ skip: if(m_synchronized.compare_exchange_strong(val_expected, true)) { MGINFO_YELLOW(ENDL << "**********************************************************************" << ENDL - << "You are now synchronized with the network. You may now start monero-wallet-cli." << ENDL + << "You are now synchronized with the network. You may now start wownero-wallet-cli." << ENDL << ENDL << "Use the \"help\" command to see the list of available commands." << ENDL << "**********************************************************************"); diff --git a/src/daemon/CMakeLists.txt b/src/daemon/CMakeLists.txt index f645836a4..65dd7fd15 100644 --- a/src/daemon/CMakeLists.txt +++ b/src/daemon/CMakeLists.txt @@ -109,5 +109,5 @@ target_link_libraries(daemon ${EXTRA_LIBRARIES}) set_property(TARGET daemon PROPERTY - OUTPUT_NAME "monerod") + OUTPUT_NAME "wownerod") install(TARGETS daemon DESTINATION bin) diff --git a/src/daemon/command_parser_executor.cpp b/src/daemon/command_parser_executor.cpp index 1638cf505..7253f830e 100644 --- a/src/daemon/command_parser_executor.cpp +++ b/src/daemon/command_parser_executor.cpp @@ -676,7 +676,7 @@ bool t_command_parser_executor::sync_info(const std::vector& args) bool t_command_parser_executor::version(const std::vector& args) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl; return true; } diff --git a/src/daemon/command_server.cpp b/src/daemon/command_server.cpp index 35504f2c9..74b4f0a53 100644 --- a/src/daemon/command_server.cpp +++ b/src/daemon/command_server.cpp @@ -335,7 +335,7 @@ bool t_command_server::help(const std::vector& args) std::string t_command_server::get_commands_str() { std::stringstream ss; - ss << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl; + ss << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl; ss << "Commands: " << std::endl; std::string usage = m_command_lookup.get_usage(); boost::replace_all(usage, "\n", "\n "); diff --git a/src/daemon/executor.cpp b/src/daemon/executor.cpp index fbc7d04fd..d410dadb1 100644 --- a/src/daemon/executor.cpp +++ b/src/daemon/executor.cpp @@ -40,7 +40,7 @@ namespace daemonize { - std::string const t_executor::NAME = "Monero Daemon"; + std::string const t_executor::NAME = "Wownero Daemon"; void t_executor::init_options( boost::program_options::options_description & configurable_options @@ -58,7 +58,7 @@ namespace daemonize boost::program_options::variables_map const & vm ) { - LOG_PRINT_L0("Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ") Daemonised"); + LOG_PRINT_L0("Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ") Daemonised"); return t_daemon{vm}; } diff --git a/src/daemon/main.cpp b/src/daemon/main.cpp index f483ba6c9..47ce1d154 100644 --- a/src/daemon/main.cpp +++ b/src/daemon/main.cpp @@ -119,7 +119,7 @@ int main(int argc, char const * argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << "Usage: " + std::string{argv[0]} + " [options|settings] [daemon_command...]" << std::endl << std::endl; std::cout << visible_options << std::endl; return 0; @@ -128,7 +128,7 @@ int main(int argc, char const * argv[]) // Monero Version if (command_line::get_arg(vm, command_line::arg_version)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL; return 0; } @@ -284,7 +284,7 @@ int main(int argc, char const * argv[]) tools::set_max_concurrency(command_line::get_arg(vm, daemon_args::arg_max_concurrency)); // logging is now set up - MGINFO("Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"); + MGINFO("Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"); MINFO("Moving from main() into the daemonize now."); diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp index 3348989f2..d9b9de6b7 100644 --- a/src/daemon/rpc_command_executor.cpp +++ b/src/daemon/rpc_command_executor.cpp @@ -1165,10 +1165,10 @@ bool t_rpc_command_executor::print_status() bool daemon_is_alive = m_rpc_client->check_connection(); if(daemon_is_alive) { - tools::success_msg_writer() << "monerod is running"; + tools::success_msg_writer() << "wownerod is running"; } else { - tools::fail_msg_writer() << "monerod is NOT running"; + tools::fail_msg_writer() << "wownerod is NOT running"; } return true; diff --git a/src/debug_utilities/cn_deserialize.cpp b/src/debug_utilities/cn_deserialize.cpp index 3e2552230..2683be500 100644 --- a/src/debug_utilities/cn_deserialize.cpp +++ b/src/debug_utilities/cn_deserialize.cpp @@ -105,7 +105,7 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; + std::cout << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL << ENDL; std::cout << desc_options << std::endl; return 1; } diff --git a/src/gen_multisig/CMakeLists.txt b/src/gen_multisig/CMakeLists.txt index 18a6a9efe..83583e804 100644 --- a/src/gen_multisig/CMakeLists.txt +++ b/src/gen_multisig/CMakeLists.txt @@ -50,5 +50,5 @@ add_dependencies(gen_multisig version) set_property(TARGET gen_multisig PROPERTY - OUTPUT_NAME "monero-gen-trusted-multisig") + OUTPUT_NAME "wownero-gen-trusted-multisig") install(TARGETS gen_multisig DESTINATION bin) diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h index 90e2f78b1..af452dfad 100644 --- a/src/p2p/net_node.h +++ b/src/p2p/net_node.h @@ -127,10 +127,7 @@ namespace nodetool virtual std::map get_blocked_hosts() { CRITICAL_REGION_LOCAL(m_blocked_hosts_lock); return m_blocked_hosts; } private: const std::vector m_seed_nodes_list = - { "seeds.moneroseeds.se" - , "seeds.moneroseeds.ae.org" - , "seeds.moneroseeds.ch" - , "seeds.moneroseeds.li" + { }; bool islimitup=false; diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index 9390626a8..75cc7536a 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -391,30 +391,21 @@ namespace nodetool std::set full_addrs; if (nettype == cryptonote::TESTNET) { - full_addrs.insert("212.83.175.67:28080"); - full_addrs.insert("5.9.100.248:28080"); - full_addrs.insert("163.172.182.165:28080"); - full_addrs.insert("195.154.123.123:28080"); - full_addrs.insert("212.83.172.165:28080"); + full_addrs.insert("206.189.166.14:11180"); + full_addrs.insert("104.236.48.55:11180"); } else if (nettype == cryptonote::STAGENET) { - full_addrs.insert("162.210.173.150:38080"); - full_addrs.insert("162.210.173.151:38080"); } else if (nettype == cryptonote::FAKECHAIN) { } else { - full_addrs.insert("107.152.130.98:18080"); - full_addrs.insert("212.83.175.67:18080"); - full_addrs.insert("5.9.100.248:18080"); - full_addrs.insert("163.172.182.165:18080"); - full_addrs.insert("161.67.132.39:18080"); - full_addrs.insert("198.74.231.92:18080"); - full_addrs.insert("195.154.123.123:18080"); - full_addrs.insert("212.83.172.165:18080"); + full_addrs.insert("66.70.218.230:34567"); + full_addrs.insert("34.209.48.213:34567"); + full_addrs.insert("159.65.91.59:34567"); + full_addrs.insert("138.197.31.246:34567"); } return full_addrs; } diff --git a/src/simplewallet/CMakeLists.txt b/src/simplewallet/CMakeLists.txt index c31cdebde..02e25156c 100644 --- a/src/simplewallet/CMakeLists.txt +++ b/src/simplewallet/CMakeLists.txt @@ -60,5 +60,5 @@ target_link_libraries(simplewallet ${EXTRA_LIBRARIES}) set_property(TARGET simplewallet PROPERTY - OUTPUT_NAME "monero-wallet-cli") + OUTPUT_NAME "wownero-wallet-cli") install(TARGETS simplewallet DESTINATION bin) diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index 4a4754471..f6467152a 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -86,9 +86,9 @@ typedef cryptonote::simple_wallet sw; #define EXTENDED_LOGS_FILE "wallet_details.log" -#define DEFAULT_MIX 10 +#define DEFAULT_MIX 21 -#define MIN_RING_SIZE 11 // Used to inform user about min ring size -- does not track actual protocol +#define MIN_RING_SIZE 22 // Used to inform user about min ring size -- does not track actual protocol #define LOCK_IDLE_SCOPE() \ bool auto_refresh_enabled = m_auto_refresh_enabled.load(std::memory_order_relaxed); \ @@ -138,7 +138,7 @@ namespace const command_line::arg_descriptor arg_non_deterministic = {"non-deterministic", sw::tr("Generate non-deterministic view and spend keys"), false}; const command_line::arg_descriptor arg_allow_mismatched_daemon_version = {"allow-mismatched-daemon-version", sw::tr("Allow communicating with a daemon that uses a different RPC version"), false}; const command_line::arg_descriptor arg_restore_height = {"restore-height", sw::tr("Restore from specific blockchain height"), 0}; - const command_line::arg_descriptor arg_do_not_relay = {"do-not-relay", sw::tr("The newly created transaction will not be relayed to the monero network"), false}; + const command_line::arg_descriptor arg_do_not_relay = {"do-not-relay", sw::tr("The newly created transaction will not be relayed to the wownero network"), false}; const command_line::arg_descriptor arg_create_address_file = {"create-address-file", sw::tr("Create an address file for new wallets"), false}; const command_line::arg_descriptor arg_subaddress_lookahead = {"subaddress-lookahead", tools::wallet2::tr("Set subaddress lookahead sizes to :"), ""}; const command_line::arg_descriptor arg_use_english_language_names = {"use-english-language-names", sw::tr("Display English language names"), false}; @@ -339,7 +339,7 @@ namespace std::stringstream prompt; prompt << sw::tr("For URL: ") << url << ", " << dnssec_str << std::endl - << sw::tr(" Monero Address = ") << addresses[0] + << sw::tr(" Wownero Address = ") << addresses[0] << std::endl << sw::tr("Is this OK? (Y/n) ") ; @@ -1387,7 +1387,7 @@ bool simple_wallet::export_raw_multisig(const std::vector &args) for (auto &ptx: txs.m_ptx) { const crypto::hash txid = cryptonote::get_transaction_hash(ptx.tx); - const std::string filename = std::string("raw_multisig_monero_tx_") + epee::string_tools::pod_to_hex(txid); + const std::string filename = std::string("raw_multisig_wownero_tx_") + epee::string_tools::pod_to_hex(txid); if (!filenames.empty()) filenames += ", "; filenames += filename; @@ -1808,7 +1808,7 @@ bool simple_wallet::save_known_rings(const std::vector &args) bool simple_wallet::version(const std::vector &args) { - message_writer() << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; + message_writer() << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; return true; } @@ -2047,7 +2047,7 @@ bool simple_wallet::set_unit(const std::vector &args/* = std::vecto const std::string &unit = args[1]; unsigned int decimal_point = CRYPTONOTE_DISPLAY_DECIMAL_POINT; - if (unit == "monero") + if (unit == "wownero") decimal_point = CRYPTONOTE_DISPLAY_DECIMAL_POINT; else if (unit == "millinero") decimal_point = CRYPTONOTE_DISPLAY_DECIMAL_POINT - 3; @@ -2425,8 +2425,8 @@ simple_wallet::simple_wallet() " Set the fee to default/unimportant/normal/elevated/priority.\n " "confirm-missing-payment-id <1|0>\n " "ask-password <0|1|2 (or never|action|decrypt)>\n " - "unit \n " - " Set the default monero (sub-)unit.\n " + "unit \n " + " Set the default wownero (sub-)unit.\n " "min-outputs-count [n]\n " " Try to keep at least that many outputs of value at least min-outputs-value.\n " "min-outputs-value [n]\n " @@ -2442,12 +2442,12 @@ simple_wallet::simple_wallet() "auto-low-priority <1|0>\n " " Whether to automatically use the low priority fee level when it's safe to do so.\n " "segregate-pre-fork-outputs <1|0>\n " - " Set this if you intend to spend outputs on both Monero AND a key reusing fork.\n " + " Set this if you intend to spend outputs on both Wownero AND a key reusing fork.\n " "key-reuse-mitigation2 <1|0>\n " - " Set this if you are not sure whether you will spend on a key reusing Monero fork later.\n" + " Set this if you are not sure whether you will spend on a key reusing Wownero fork later.\n" "subaddress-lookahead :\n " " Set the lookahead sizes for the subaddress hash table.\n " - " Set this if you are not sure whether you will spend on a key reusing Monero fork later.\n " + " Set this if you are not sure whether you will spend on a key reusing Wownero fork later.\n " "segregation-height \n " " Set to the height of a key reusing fork you want to use, 0 to use default.")); m_cmd_binder.set_handler("encrypted_seed", @@ -2719,7 +2719,7 @@ bool simple_wallet::set_variable(const std::vector &args) CHECK_SIMPLE_VARIABLE("priority", set_default_priority, tr("0, 1, 2, 3, or 4, or one of ") << join_priority_strings(", ")); CHECK_SIMPLE_VARIABLE("confirm-missing-payment-id", set_confirm_missing_payment_id, tr("0 or 1")); CHECK_SIMPLE_VARIABLE("ask-password", set_ask_password, tr("0|1|2 (or never|action|decrypt)")); - CHECK_SIMPLE_VARIABLE("unit", set_unit, tr("monero, millinero, micronero, nanonero, piconero")); + CHECK_SIMPLE_VARIABLE("unit", set_unit, tr("wownero, millinero, micronero, nanonero, piconero")); CHECK_SIMPLE_VARIABLE("min-outputs-count", set_min_output_count, tr("unsigned integer")); CHECK_SIMPLE_VARIABLE("min-outputs-value", set_min_output_value, tr("amount")); CHECK_SIMPLE_VARIABLE("merge-destinations", set_merge_destinations, tr("0 or 1")); @@ -3667,7 +3667,7 @@ boost::optional simple_wallet::new_wallet(const boost::pr "To start synchronizing with the daemon, use the \"refresh\" command.\n" "Use the \"help\" command to see the list of available commands.\n" "Use \"help \" to see a command's documentation.\n" - "Always use the \"exit\" command when closing monero-wallet-cli to save \n" + "Always use the \"exit\" command when closing wownero-wallet-cli to save \n" "your current session's state. Otherwise, you might need to synchronize \n" "your wallet again (your wallet keys are NOT at risk in any case).\n") ; @@ -4871,7 +4871,7 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vectormultisig()) { - bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_monero_tx"); + bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_wownero_tx"; } } else if (m_wallet->watch_only()) { - bool r = m_wallet->save_tx(ptx_vector, "unsigned_monero_tx"); + bool r = m_wallet->save_tx(ptx_vector, "unsigned_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_wownero_tx"; } } else @@ -5216,26 +5216,26 @@ bool simple_wallet::sweep_unmixable(const std::vector &args_) // actually commit the transactions if (m_wallet->multisig()) { - bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_monero_tx"); + bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_wownero_tx"; } } else if (m_wallet->watch_only()) { - bool r = m_wallet->save_tx(ptx_vector, "unsigned_monero_tx"); + bool r = m_wallet->save_tx(ptx_vector, "unsigned_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_wownero_tx"; } } else @@ -5447,7 +5447,7 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vectorconfirm_missing_payment_id() && !info.is_subaddress) + if (m_long_payment_id_support && !payment_id_seen && m_wallet->confirm_missing_payment_id() && !info.is_subaddress && !is_wallet_address) { std::string accepted = input_line(tr("No payment id is included with this transaction. Is this okay? (Y/Yes/N/No): ")); if (std::cin.eof()) @@ -5520,26 +5520,26 @@ bool simple_wallet::sweep_main(uint64_t below, bool locked, const std::vectormultisig()) { - bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_monero_tx"); + bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_wownero_tx"; } } else if (m_wallet->watch_only()) { - bool r = m_wallet->save_tx(ptx_vector, "unsigned_monero_tx"); + bool r = m_wallet->save_tx(ptx_vector, "unsigned_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_wownero_tx"; } } else @@ -5749,26 +5749,26 @@ bool simple_wallet::sweep_single(const std::vector &args_) // actually commit the transactions if (m_wallet->multisig()) { - bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_monero_tx"); + bool r = m_wallet->save_multisig_tx(ptx_vector, "multisig_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "multisig_wownero_tx"; } } else if (m_wallet->watch_only()) { - bool r = m_wallet->save_tx(ptx_vector, "unsigned_monero_tx"); + bool r = m_wallet->save_tx(ptx_vector, "unsigned_wownero_tx"); if (!r) { fail_msg_writer() << tr("Failed to write transaction(s) to file"); } else { - success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx"; + success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_wownero_tx"; } } else @@ -6042,7 +6042,7 @@ bool simple_wallet::sign_transfer(const std::vector &args_) std::vector ptx; try { - bool r = m_wallet->sign_tx("unsigned_monero_tx", "signed_monero_tx", ptx, [&](const tools::wallet2::unsigned_tx_set &tx){ return accept_loaded_tx(tx); }, export_raw); + bool r = m_wallet->sign_tx("unsigned_wownero_tx", "signed_wownero_tx", ptx, [&](const tools::wallet2::unsigned_tx_set &tx){ return accept_loaded_tx(tx); }, export_raw); if (!r) { fail_msg_writer() << tr("Failed to sign transaction"); @@ -6062,7 +6062,7 @@ bool simple_wallet::sign_transfer(const std::vector &args_) txids_as_text += (", "); txids_as_text += epee::string_tools::pod_to_hex(get_transaction_hash(t.tx)); } - success_msg_writer(true) << tr("Transaction successfully signed to file ") << "signed_monero_tx" << ", txid " << txids_as_text; + success_msg_writer(true) << tr("Transaction successfully signed to file ") << "signed_wownero_tx" << ", txid " << txids_as_text; if (export_raw) { std::string rawfiles_as_text; @@ -6070,7 +6070,7 @@ bool simple_wallet::sign_transfer(const std::vector &args_) { if (i > 0) rawfiles_as_text += ", "; - rawfiles_as_text += "signed_monero_tx_raw" + (ptx.size() == 1 ? "" : ("_" + std::to_string(i))); + rawfiles_as_text += "signed_wownero_tx_raw" + (ptx.size() == 1 ? "" : ("_" + std::to_string(i))); } success_msg_writer(true) << tr("Transaction raw hex data exported to ") << rawfiles_as_text; } @@ -6090,7 +6090,7 @@ bool simple_wallet::submit_transfer(const std::vector &args_) try { std::vector ptx_vector; - bool r = m_wallet->load_tx("signed_monero_tx", ptx_vector, [&](const tools::wallet2::signed_tx_set &tx){ return accept_loaded_tx(tx); }); + bool r = m_wallet->load_tx("signed_wownero_tx", ptx_vector, [&](const tools::wallet2::signed_tx_set &tx){ return accept_loaded_tx(tx); }); if (!r) { fail_msg_writer() << tr("Failed to load transaction from file"); @@ -6243,7 +6243,7 @@ bool simple_wallet::get_tx_proof(const std::vector &args) try { std::string sig_str = m_wallet->get_tx_proof(txid, info.address, info.is_subaddress, args.size() == 3 ? args[2] : ""); - const std::string filename = "monero_tx_proof"; + const std::string filename = "wownero_tx_proof"; if (epee::file_io_utils::save_string_to_file(filename, sig_str)) success_msg_writer() << tr("signature file saved to: ") << filename; else @@ -6458,7 +6458,7 @@ bool simple_wallet::get_spend_proof(const std::vector &args) try { const std::string sig_str = m_wallet->get_spend_proof(txid, args.size() == 2 ? args[1] : ""); - const std::string filename = "monero_spend_proof"; + const std::string filename = "wownero_spend_proof"; if (epee::file_io_utils::save_string_to_file(filename, sig_str)) success_msg_writer() << tr("signature file saved to: ") << filename; else @@ -6553,7 +6553,7 @@ bool simple_wallet::get_reserve_proof(const std::vector &args) try { const std::string sig_str = m_wallet->get_reserve_proof(account_minreserve, args.size() == 2 ? args[1] : ""); - const std::string filename = "monero_reserve_proof"; + const std::string filename = "wownero_reserve_proof"; if (epee::file_io_utils::save_string_to_file(filename, sig_str)) success_msg_writer() << tr("signature file saved to: ") << filename; else @@ -8077,7 +8077,7 @@ void simple_wallet::commit_or_save(std::vector& ptx_ cryptonote::blobdata blob; tx_to_blob(ptx.tx, blob); const std::string blob_hex = epee::string_tools::buff_to_hex_nodelimer(blob); - const std::string filename = "raw_monero_tx" + (ptx_vector.size() == 1 ? "" : ("_" + std::to_string(i++))); + const std::string filename = "raw_wownero_tx" + (ptx_vector.size() == 1 ? "" : ("_" + std::to_string(i++))); if (epee::file_io_utils::save_string_to_file(filename, blob_hex)) success_msg_writer(true) << tr("Transaction successfully saved to ") << filename << tr(", txid ") << txid; else @@ -8136,12 +8136,12 @@ int main(int argc, char* argv[]) bool should_terminate = false; std::tie(vm, should_terminate) = wallet_args::main( argc, argv, - "monero-wallet-cli [--wallet-file=|--generate-new-wallet=] []", - sw::tr("This is the command line monero wallet. It needs to connect to a monero\ndaemon to work correctly.\nWARNING: Do not reuse your Monero keys on another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy."), + "wownero-wallet-cli [--wallet-file=|--generate-new-wallet=] []", + sw::tr("This is the command line wownero wallet. It needs to connect to a wownero\ndaemon to work correctly.\nWARNING: Do not reuse your Wownero keys on another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy."), desc_params, positional_options, [](const std::string &s, bool emphasis){ tools::scoped_message_writer(emphasis ? epee::console_color_white : epee::console_color_default, true) << s; }, - "monero-wallet-cli.log" + "wownero-wallet-cli.log" ); if (!vm) diff --git a/src/version.cpp.in b/src/version.cpp.in index 4546aeb69..722e0d21c 100644 --- a/src/version.cpp.in +++ b/src/version.cpp.in @@ -1,6 +1,6 @@ #define DEF_MONERO_VERSION_TAG "@VERSIONTAG@" -#define DEF_MONERO_VERSION "0.14.0.2" -#define DEF_MONERO_RELEASE_NAME "Boron Butterfly" +#define DEF_MONERO_VERSION "0.6.0.0" +#define DEF_MONERO_RELEASE_NAME "TBD" #define DEF_MONERO_VERSION_FULL DEF_MONERO_VERSION "-" DEF_MONERO_VERSION_TAG #include "version.h" diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt index be10b9f62..cdabd4924 100644 --- a/src/wallet/CMakeLists.txt +++ b/src/wallet/CMakeLists.txt @@ -100,7 +100,7 @@ target_link_libraries(wallet_rpc_server ${EXTRA_LIBRARIES}) set_property(TARGET wallet_rpc_server PROPERTY - OUTPUT_NAME "monero-wallet-rpc") + OUTPUT_NAME "wownero-wallet-rpc") install(TARGETS wallet_rpc_server DESTINATION bin) diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index ea1a93b67..211a7fd64 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -60,7 +60,7 @@ namespace Monero { namespace { // copy-pasted from simplewallet - static const size_t DEFAULT_MIXIN = 6; + static const size_t DEFAULT_MIXIN = 21; static const int DEFAULT_REFRESH_INTERVAL_MILLIS = 1000 * 10; // limit maximum refresh interval as one minute static const int MAX_REFRESH_INTERVAL_MILLIS = 1000 * 60 * 1; diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 85dfbd9d7..bb0b41c1c 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -92,9 +92,9 @@ using namespace cryptonote; #define CHACHA8_KEY_TAIL 0x8c #define CACHE_KEY_TAIL 0x8d -#define UNSIGNED_TX_PREFIX "Monero unsigned tx set\004" -#define SIGNED_TX_PREFIX "Monero signed tx set\004" -#define MULTISIG_UNSIGNED_TX_PREFIX "Monero multisig unsigned tx set\001" +#define UNSIGNED_TX_PREFIX "Wownero unsigned tx set\004" +#define SIGNED_TX_PREFIX "Wownero signed tx set\004" +#define MULTISIG_UNSIGNED_TX_PREFIX "Wownero multisig unsigned tx set\001" #define RECENT_OUTPUT_RATIO (0.5) // 50% of outputs are from the recent zone #define RECENT_OUTPUT_DAYS (1.8) // last 1.8 day makes up the recent zone (taken from monerolink.pdf, Miller et al) @@ -108,11 +108,11 @@ using namespace cryptonote; #define SUBADDRESS_LOOKAHEAD_MAJOR 50 #define SUBADDRESS_LOOKAHEAD_MINOR 200 -#define KEY_IMAGE_EXPORT_FILE_MAGIC "Monero key image export\002" +#define KEY_IMAGE_EXPORT_FILE_MAGIC "Wownero key image export\002" -#define MULTISIG_EXPORT_FILE_MAGIC "Monero multisig export\001" +#define MULTISIG_EXPORT_FILE_MAGIC "Wownero multisig export\001" -#define OUTPUT_EXPORT_FILE_MAGIC "Monero output export\003" +#define OUTPUT_EXPORT_FILE_MAGIC "Wownero output export\003" #define SEGREGATION_FORK_HEIGHT 99999999 #define TESTNET_SEGREGATION_FORK_HEIGHT 99999999 @@ -825,9 +825,9 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds, bool unattended): m_first_refresh_done(false), m_refresh_from_block_height(0), m_explicit_refresh_from_block_height(true), - m_confirm_missing_payment_id(true), + m_confirm_missing_payment_id(false), m_confirm_non_default_ring_size(true), - m_ask_password(AskPasswordToDecrypt), + m_ask_password(AskPasswordOnAction), m_min_output_count(0), m_min_output_value(0), m_merge_destinations(false), @@ -835,8 +835,8 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds, bool unattended): m_confirm_backlog_threshold(0), m_confirm_export_overwrite(true), m_auto_low_priority(true), - m_segregate_pre_fork_outputs(true), - m_key_reuse_mitigation2(true), + m_segregate_pre_fork_outputs(false), + m_key_reuse_mitigation2(false), m_segregation_height(0), m_ignore_fractional_outputs(true), m_is_initialized(false), @@ -1308,8 +1308,8 @@ void wallet2::scan_output(const cryptonote::transaction &tx, bool miner_tx, cons if (!m_encrypt_keys_after_refresh) { boost::optional pwd = m_callback->on_get_password("output received"); - THROW_WALLET_EXCEPTION_IF(!pwd, error::password_needed, tr("Password is needed to compute key image for incoming monero")); - THROW_WALLET_EXCEPTION_IF(!verify_password(*pwd), error::password_needed, tr("Invalid password: password is needed to compute key image for incoming monero")); + THROW_WALLET_EXCEPTION_IF(!pwd, error::password_needed, tr("Password is needed to compute key image for incoming wownero")); + THROW_WALLET_EXCEPTION_IF(!verify_password(*pwd), error::password_needed, tr("Invalid password: password is needed to compute key image for incoming wownero")); decrypt_keys(*pwd); m_encrypt_keys_after_refresh = *pwd; } @@ -5115,8 +5115,7 @@ bool wallet2::is_tx_spendtime_unlocked(uint64_t unlock_time, uint64_t block_heig uint64_t current_time = static_cast(time(NULL)); // XXX: this needs to be fast, so we'd need to get the starting heights // from the daemon to be correct once voting kicks in - uint64_t v2height = m_nettype == TESTNET ? 624634 : m_nettype == STAGENET ? 32000 : 1009827; - uint64_t leeway = block_height < v2height ? CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_SECONDS_V1 : CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_SECONDS_V2; + uint64_t leeway = CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_SECONDS_V2; if(current_time + leeway >= unlock_time) return true; else @@ -6196,20 +6195,14 @@ int wallet2::get_fee_algorithm() const uint64_t wallet2::get_min_ring_size() const { if (use_fork_rules(8, 10)) - return 11; - if (use_fork_rules(7, 10)) - return 7; - if (use_fork_rules(6, 10)) - return 5; - if (use_fork_rules(2, 10)) - return 3; + return 22; return 0; } //------------------------------------------------------------------------------------------------------------------------------ uint64_t wallet2::get_max_ring_size() const { if (use_fork_rules(8, 10)) - return 11; + return 22; return 0; } //------------------------------------------------------------------------------------------------------------------------------ @@ -10206,18 +10199,7 @@ uint64_t wallet2::get_daemon_blockchain_target_height(string &err) uint64_t wallet2::get_approximate_blockchain_height() const { - // time of v2 fork - const time_t fork_time = m_nettype == TESTNET ? 1448285909 : m_nettype == STAGENET ? 1520937818 : 1458748658; - // v2 fork block - const uint64_t fork_block = m_nettype == TESTNET ? 624634 : m_nettype == STAGENET ? 32000 : 1009827; - // avg seconds per block - const int seconds_per_block = DIFFICULTY_TARGET_V2; - // Calculated blockchain height - uint64_t approx_blockchain_height = fork_block + (time(NULL) - fork_time)/seconds_per_block; - // testnet got some huge rollbacks, so the estimation is way off - static const uint64_t approximate_testnet_rolled_back_blocks = 303967; - if (m_nettype == TESTNET && approx_blockchain_height > approximate_testnet_rolled_back_blocks) - approx_blockchain_height -= approximate_testnet_rolled_back_blocks; + uint64_t approx_blockchain_height = m_nettype == TESTNET ? 0 : (time(NULL) - 1522624244)/339; LOG_PRINT_L2("Calculated blockchain height: " << approx_blockchain_height); return approx_blockchain_height; } @@ -11356,7 +11338,7 @@ std::string wallet2::make_uri(const std::string &address, const std::string &pay } } - std::string uri = "monero:" + address; + std::string uri = "wownero:" + address; unsigned int n_fields = 0; if (!payment_id.empty()) @@ -11385,13 +11367,13 @@ std::string wallet2::make_uri(const std::string &address, const std::string &pay //---------------------------------------------------------------------------------------------------- bool wallet2::parse_uri(const std::string &uri, std::string &address, std::string &payment_id, uint64_t &amount, std::string &tx_description, std::string &recipient_name, std::vector &unknown_parameters, std::string &error) { - if (uri.substr(0, 7) != "monero:") + if (uri.substr(0, 8) != "wownero:") { - error = std::string("URI has wrong scheme (expected \"monero:\"): ") + uri; + error = std::string("URI has wrong scheme (expected \"wownero:\"): ") + uri; return false; } - std::string remainder = uri.substr(7); + std::string remainder = uri.substr(8); const char *ptr = strchr(remainder.c_str(), '?'); address = ptr ? remainder.substr(0, ptr-remainder.c_str()) : remainder; @@ -11645,15 +11627,11 @@ uint64_t wallet2::get_segregation_fork_height() const if (m_segregation_height > 0) return m_segregation_height; - static const bool use_dns = true; + static const bool use_dns = false; if (use_dns) { // All four MoneroPulse domains have DNSSEC on and valid static const std::vector dns_urls = { - "segheights.moneropulse.org", - "segheights.moneropulse.net", - "segheights.moneropulse.co", - "segheights.moneropulse.se" }; const uint64_t current_height = get_blockchain_current_height(); diff --git a/src/wallet/wallet_args.cpp b/src/wallet/wallet_args.cpp index 95a4e0ad6..63e1250dd 100644 --- a/src/wallet/wallet_args.cpp +++ b/src/wallet/wallet_args.cpp @@ -140,7 +140,7 @@ namespace wallet_args if (command_line::get_arg(vm, command_line::arg_help)) { - Print(print) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL; + Print(print) << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL; Print(print) << wallet_args::tr("This is the command line monero wallet. It needs to connect to a monero\n" "daemon to work correctly.") << ENDL; Print(print) << wallet_args::tr("Usage:") << ENDL << " " << usage; @@ -150,7 +150,7 @@ namespace wallet_args } else if (command_line::get_arg(vm, command_line::arg_version)) { - Print(print) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; + Print(print) << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; should_terminate = true; return true; } @@ -201,7 +201,7 @@ namespace wallet_args if (!command_line::is_arg_defaulted(vm, arg_max_concurrency)) tools::set_max_concurrency(command_line::get_arg(vm, arg_max_concurrency)); - Print(print) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; + Print(print) << "Wownero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; if (!command_line::is_arg_defaulted(vm, arg_log_level)) MINFO("Setting log level = " << command_line::get_arg(vm, arg_log_level)); diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index e452d21e8..bd31162ca 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -64,7 +64,7 @@ namespace const command_line::arg_descriptor arg_wallet_dir = {"wallet-dir", "Directory for newly created wallets"}; const command_line::arg_descriptor arg_prompt_for_password = {"prompt-for-password", "Prompts for password when not provided", false}; - constexpr const char default_rpc_username[] = "monero"; + constexpr const char default_rpc_username[] = "wownero"; boost::optional password_prompter(const char *prompt, bool verify) { @@ -205,7 +205,7 @@ namespace tools string_encoding::base64_encode(rand_128bit.data(), rand_128bit.size()) ); - std::string temp = "monero-wallet-rpc." + bind_port + ".login"; + std::string temp = "wownero-wallet-rpc." + bind_port + ".login"; rpc_login_file = tools::private_file::create(temp); if (!rpc_login_file.handle()) { @@ -632,7 +632,7 @@ namespace tools } if (addresses.empty()) { - er.message = std::string("No Monero address found at ") + url; + er.message = std::string("No Wownero address found at ") + url; return {}; } return addresses[0]; @@ -1660,7 +1660,7 @@ namespace tools } if (addresses.empty()) { - er.message = std::string("No Monero address found at ") + url; + er.message = std::string("No Wownero address found at ") + url; return {}; } return addresses[0]; @@ -2445,7 +2445,7 @@ namespace tools } if (addresses.empty()) { - er.message = std::string("No Monero address found at ") + url; + er.message = std::string("No Wownero address found at ") + url; return {}; } return addresses[0]; @@ -3541,12 +3541,12 @@ int main(int argc, char** argv) { bool should_terminate = false; std::tie(vm, should_terminate) = wallet_args::main( argc, argv, - "monero-wallet-rpc [--wallet-file=|--generate-from-json=|--wallet-dir=] [--rpc-bind-port=]", - tools::wallet_rpc_server::tr("This is the RPC monero wallet. It needs to connect to a monero\ndaemon to work correctly."), + "wownero-wallet-rpc [--wallet-file=|--generate-from-json=|--wallet-dir=] [--rpc-bind-port=]", + tools::wallet_rpc_server::tr("This is the RPC wownero wallet. It needs to connect to a wownero\ndaemon to work correctly."), desc_params, po::positional_options_description(), [](const std::string &s, bool emphasis){ epee::set_console_color(emphasis ? epee::console_color_white : epee::console_color_default, true); std::cout << s << std::endl; if (emphasis) epee::reset_console_color(); }, - "monero-wallet-rpc.log", + "wownero-wallet-rpc.log", true ); if (!vm) diff --git a/tests/README.md b/tests/README.md index 0bf097254..234a81f29 100644 --- a/tests/README.md +++ b/tests/README.md @@ -3,7 +3,7 @@ To run all tests, run: ``` -cd /path/to/monero +cd /path/to/wownero make [-jn] debug-test # where n is number of compiler processes ``` @@ -11,11 +11,11 @@ To test a release build, replace `debug-test` with `release-test` in the previou # Core tests -Core tests take longer than any other Monero tests, due to the high amount of computational work involved in validating core components. +Core tests take longer than any other Wownero tests, due to the high amount of computational work involved in validating core components. Tests are located in `tests/core_tests/`, and follow a straightforward naming convention. Most cases cover core functionality (`block_reward.cpp`, `chaingen.cpp`, `rct.cpp`, etc.), while some cover basic security tests (`double_spend.cpp` & `integer_overflow.cpp`). -To run only Monero's core tests (after building): +To run only Wownero's core tests (after building): ``` cd build/debug/tests/core @@ -34,7 +34,7 @@ Crypto tests are located under the `tests/crypto` directory. Tests correspond to components under `src/crypto/`. A quick comparison reveals the pattern, and new tests should continue the naming convention. -To run only Monero's crypto tests (after building): +To run only Wownero's crypto tests (after building): ``` cd build/debug/tests/crypto @@ -54,7 +54,7 @@ Functional tests are located under the `tests/functional` directory. First, run a regtest daemon in the offline mode and with a fixed difficulty: ``` -monerod --regtest --offline --fixed-difficulty 1 +wownerod --regtest --offline --fixed-difficulty 1 ``` Alternatively, you can run multiple daemons and let them connect with each other by using `--add-exclusive-node`. In this case, make sure that the same fixed difficulty is given to all the daemons. @@ -75,7 +75,7 @@ An additional helper utility is provided `contrib/fuzz_testing/fuzz.sh`. AFL mus Hash tests exist under `tests/hash`, and include a set of target hashes in text files. -To run only Monero's hash tests (after building): +To run only Wownero's hash tests (after building): ``` cd build/debug/tests/hash @@ -96,7 +96,7 @@ To run the same tests on a release build, replace `debug` with `release`. Performance tests are located in `tests/performance_tests`, and test features for performance metrics on the host machine. -To run only Monero's performance tests (after building): +To run only Wownero's performance tests (after building): ``` cd build/debug/tests/performance_tests @@ -111,7 +111,7 @@ To run the same tests on a release build, replace `debug` with `release`. Unit tests are defined under the `tests/unit_tests` directory. Independent components are tested individually to ensure they work properly on their own. -To run only Monero's unit tests (after building): +To run only Wownero's unit tests (after building): ``` cd build/debug/tests/unit_tests diff --git a/tests/difficulty/data.txt b/tests/difficulty/data.txt deleted file mode 100644 index 17c48025e..000000000 --- a/tests/difficulty/data.txt +++ /dev/null @@ -1,1000 +0,0 @@ -996 1 -985 1 -978 11 -1001 80 -1040 480 -1196 1108 -1109 925 -1241 1434 -1243 1843 -986 2664 -920 3870 -2213 4613 -2472 1581 -2592 1439 -2712 1439 -3056 1439 -3392 1289 -3723 1176 -3937 1088 -4219 1054 -4447 1002 -4681 971 -4702 942 -4683 967 -4942 997 -4958 968 -5126 993 -5188 981 -5322 995 -5545 991 -5531 969 -5792 994 -5831 969 -6020 985 -5943 971 -6179 994 -6409 987 -6587 967 -6736 957 -7027 952 -7293 926 -7494 905 -7747 893 -7805 876 -7911 884 -7923 886 -7996 899 -8149 905 -8101 901 -8258 916 -8395 918 -8295 915 -8430 930 -8719 941 -8698 920 -8819 934 -8788 937 -8804 951 -8797 966 -8857 980 -8848 990 -8981 1005 -8896 1005 -9012 1020 -9104 1031 -9295 1035 -9312 1026 -9432 1038 -9731 1038 -9991 1017 -10291 1002 -10510 982 -10607 972 -10563 975 -10669 987 -10567 993 -10813 1005 -11075 1002 -11045 988 -11253 1000 -11321 994 -11492 999 -11721 995 -11839 984 -11855 985 -12017 994 -12104 990 -12062 993 -12162 1004 -12075 1009 -12211 1020 -12345 1027 -12257 1025 -12155 1036 -12326 1047 -12620 1058 -12772 1044 -12993 1041 -13173 1032 -13081 1027 -13079 1037 -13082 1048 -13072 1058 -13078 1068 -13069 1079 -13060 1089 -13056 1100 -13057 1111 -13062 1122 -13056 1133 -13060 1144 -13052 1155 -13057 1166 -13049 1178 -13041 1189 -13042 1201 -13036 1213 -13041 1224 -13036 1236 -13034 1249 -13031 1261 -13029 1273 -13025 1286 -13030 1298 -13020 1311 -13026 1324 -13021 1337 -13028 1350 -13038 1363 -13037 1376 -13026 1390 -13024 1403 -13014 1417 -13011 1431 -13011 1445 -13004 1459 -13000 1474 -12992 1488 -13000 1503 -13003 1517 -13004 1532 -12995 1547 -12987 1562 -12983 1578 -12992 1593 -12993 1609 -12983 1624 -12973 1640 -12967 1656 -12961 1673 -12960 1689 -12963 1705 -12971 1722 -12968 1739 -12973 1756 -12968 1773 -12965 1791 -12966 1808 -12958 1826 -12949 1844 -12957 1862 -12947 1880 -12957 1898 -12958 1917 -12967 1936 -12975 1955 -12973 1974 -12965 1993 -12974 2013 -12975 2033 -12979 2052 -12978 2073 -12968 2093 -12965 2113 -12975 2134 -12966 2155 -12962 2176 -12955 2197 -12960 2219 -12969 2241 -12965 2263 -12973 2285 -12962 2307 -12956 2330 -12947 2352 -12948 2376 -12944 2399 -12950 2422 -12949 2446 -12942 2470 -12942 2494 -12945 2519 -12934 2543 -12932 2568 -12932 2593 -12939 2619 -12940 2644 -12931 2670 -12930 2696 -12922 2723 -12920 2749 -12925 2776 -12916 2804 -12922 2831 -12923 2859 -12922 2887 -12924 2915 -12927 2944 -12932 2972 -12925 3001 -12924 3031 -12933 3061 -12942 3091 -12934 3121 -12925 3151 -12930 3182 -12927 3213 -12935 3245 -12931 3277 -12938 3309 -12931 3341 -12933 3374 -12940 3407 -12935 3440 -12944 3474 -12943 3508 -12954 3542 -12952 3577 -12956 3612 -12959 3647 -12968 3683 -12975 3719 -12976 3756 -12979 3792 -12988 3830 -12993 3867 -12986 3905 -12979 3943 -12980 3982 -12974 4021 -12972 4060 -12978 4100 -12980 4140 -12989 4181 -12997 4222 -12988 4263 -12996 4305 -13001 4347 -12998 4389 -12996 4432 -13001 4476 -12995 4520 -12991 4564 -12984 4609 -12993 4654 -12991 4699 -12983 4745 -12987 4792 -12978 4839 -12982 4886 -12973 4934 -12964 4982 -12961 5031 -12970 5080 -12981 5130 -12974 5180 -12972 5231 -12962 5282 -12970 5334 -12969 5386 -12973 5439 -12971 5492 -12964 5546 -12975 5600 -12985 5655 -12977 5711 -12971 5767 -12964 5823 -12974 5880 -12982 5938 -12991 5996 -12993 6055 -13002 6114 -12991 6174 -12988 6234 -12987 6295 -12995 6357 -12986 6419 -12993 6482 -13000 6545 -13005 6610 -13002 6674 -12997 6740 -12998 6806 -12999 6872 -13009 6940 -13004 7008 -13006 7076 -12996 7146 -13002 7216 -13014 7286 -13026 7358 -13024 7430 -13029 7502 -13033 7576 -13037 7650 -13045 7725 -13047 7801 -13058 7877 -13058 7954 -13062 8032 -13052 8111 -13049 8190 -13056 8270 -13057 8351 -13047 8433 -13039 8516 -13031 8599 -13038 8683 -13029 8768 -13019 8854 -13010 8941 -13005 9029 -12995 9117 -12988 9206 -12999 9296 -12998 9387 -12991 9479 -12997 9572 -13002 9666 -12993 9761 -13004 9856 -13005 9953 -13013 10050 -13006 10149 -13000 10248 -12995 10348 -12996 10450 -12996 10552 -12995 10655 -12998 10760 -12993 10865 -12998 10972 -12989 11079 -12998 11188 -12991 11297 -13003 11408 -13008 11519 -12997 11632 -13005 11746 -13009 11861 -13009 11977 -13005 12095 -13000 12213 -12998 12333 -12993 12454 -12986 12575 -12994 12699 -12996 12823 -13004 12949 -13008 13075 -13008 13203 -13007 13333 -13002 13463 -13013 13595 -13013 13728 -13009 13863 -13023 13999 -13027 14136 -13027 14274 -13028 14414 -13025 14555 -13015 14698 -13020 14842 -13020 14987 -13023 15134 -13013 15282 -13023 15432 -13023 15583 -13037 15735 -13048 15889 -13061 16045 -13050 16202 -13063 16361 -13061 16521 -13049 16683 -13059 16846 -13059 17011 -13060 17178 -13075 17346 -13071 17516 -13073 17687 -13082 17861 -13091 18036 -13083 18212 -13090 18391 -13078 18571 -13084 18753 -13092 18936 -13085 19122 -13077 19309 -13067 19498 -13078 19689 -13093 19882 -13090 20077 -13094 20273 -13098 20472 -13114 20672 -13108 20875 -13117 21079 -13112 21286 -13102 21494 -13109 21705 -13122 21917 -13121 22132 -13129 22348 -13122 22567 -13115 22788 -13113 23012 -13121 23237 -13114 23464 -13103 23694 -13093 23926 -13098 24161 -13099 24397 -13092 24636 -13102 24877 -13104 25121 -13092 25367 -13103 25616 -13099 25866 -13089 26120 -13093 26376 -13101 26634 -13113 26895 -13121 27158 -13128 27424 -13138 27693 -13140 27964 -13157 28238 -13157 28514 -13144 28794 -13155 29076 -13156 29360 -13173 29648 -13163 29938 -13180 30231 -13188 30510 -13191 30789 -13177 31082 -13174 31386 -13164 31693 -13168 32003 -13173 32316 -13167 32632 -13177 32951 -13188 33273 -13201 33599 -13209 33900 -13220 34209 -13211 34512 -13208 34848 -13194 35188 -13181 35532 -13198 35878 -13192 36228 -13201 36582 -13208 36939 -13197 37299 -13197 37663 -13196 38030 -13208 38401 -13215 38776 -13226 39154 -13215 39517 -13231 39902 -13244 40275 -13254 40625 -13253 40987 -13241 41386 -13241 41789 -13235 42195 -13237 42606 -13239 43020 -13243 43439 -13233 43861 -13241 44288 -13231 44719 -13252 45154 -13263 45593 -13251 46003 -13261 46451 -13277 46902 -13290 47305 -13280 47714 -13291 48177 -13293 48640 -13284 49104 -13278 49580 -13281 50061 -13277 50547 -13284 51037 -13294 51532 -13286 52027 -13285 52532 -13292 53041 -13283 53556 -13291 54075 -13281 54600 -13278 55129 -13267 55664 -13269 56203 -13279 56749 -13269 57299 -13270 57855 -13278 58416 -13283 58982 -13282 59554 -13278 60132 -13272 60715 -13275 61304 -13278 61898 -13286 62498 -13285 63104 -13291 63716 -13295 64334 -13305 64953 -13311 65530 -13310 66133 -13314 66773 -13323 67404 -13316 68007 -13324 68665 -13322 69323 -13330 69994 -13322 70637 -13315 71320 -13322 72010 -13332 72706 -13333 73397 -13337 74101 -13337 74793 -13339 75516 -13340 76234 -13347 76964 -13351 77664 -13353 78389 -13349 79132 -13357 79896 -13347 80641 -13347 81420 -13336 82205 -13330 82998 -13325 83799 -13324 84608 -13315 85424 -13316 86248 -13325 87080 -13321 87921 -13327 88769 -13320 89625 -13313 90490 -13322 91363 -13327 92245 -13318 93135 -13313 94033 -13304 94941 -13298 95857 -13301 96782 -13294 97716 -13284 98658 -13291 99610 -13287 100571 -13296 101542 -13296 102521 -13299 103511 -13303 104509 -13312 105518 -13313 106536 -13315 107564 -13307 108602 -13299 109649 -13289 110707 -13297 111776 -13289 112854 -13295 113943 -13304 115042 -13296 116152 -13296 117273 -13301 118405 -13292 119547 -13301 120701 -13305 121865 -13294 123041 -13301 124228 -13308 125427 -13315 126637 -13309 127859 -13316 129092 -13322 130338 -13324 131596 -13330 133488 -13328 133531 -13328 134902 -13335 134923 -13334 136229 -13328 136252 -13328 137668 -13330 137690 -13336 139046 -13328 139046 -13317 140806 -13324 140806 -13316 142922 -13317 143004 -13326 145371 -13330 145383 -13332 147263 -13332 147287 -13327 148653 -13324 148653 -13323 163065 -13314 163080 -13323 168505 -13322 168505 -13327 171944 -13331 171960 -13336 175501 -13343 175501 -13336 183009 -13341 183009 -13334 190931 -13338 190931 -13337 199306 -13329 199306 -13333 205710 -13338 205710 -13335 213997 -13330 213997 -13329 221480 -13322 221505 -13326 229542 -13325 229542 -13324 231843 -13331 231870 -13329 234634 -13326 234634 -13332 243740 -13339 243769 -13328 246606 -13332 246635 -13325 254183 -13332 254183 -13335 258637 -13325 258637 -13330 265577 -13321 265611 -13315 275411 -13319 275411 -13309 278711 -13303 278711 -13313 290738 -13310 290738 -13305 295289 -13294 295289 -13293 302850 -13288 302850 -13285 309294 -13280 309336 -13288 319541 -13295 319541 -13304 333707 -13309 333755 -13301 346209 -13293 346209 -13301 357909 -13304 357909 -13310 378490 -13309 378490 -13310 399550 -13302 399550 -13313 417848 -13313 417848 -13324 441697 -13315 441697 -13319 451301 -13311 451382 -13317 465329 -13314 465329 -13318 471489 -13322 471489 -13313 483202 -13311 483293 -13300 498367 -13302 498367 -13296 508613 -13290 508613 -13280 525295 -13278 525295 -13280 535015 -13288 535015 -13288 551838 -13285 551838 -13292 561986 -13303 562101 -13300 601209 -13290 601209 -13293 610660 -13292 610660 -13296 626756 -13297 626756 -13294 635012 -13305 635152 -13299 643158 -13299 643158 -13300 652606 -13304 652606 -13296 664186 -13287 664335 -13296 673132 -13301 673132 -13301 673132 -13310 673132 -13307 673132 -13303 673132 -13302 673132 -13296 673132 -13293 673132 -13305 673132 -13294 673132 -13297 673132 -13288 673132 -13294 673132 -13296 673132 -13304 673132 -13297 673132 -13306 686583 -13296 708022 -13302 721171 -13301 745255 -13293 789338 -13288 801708 -13294 835723 -13295 915543 -13291 998038 -13298 1109322 -13302 1209204 -13312 1246864 -13314 1263152 -13320 1296983 -13325 1342856 -13324 1436884 -13320 1601878 -13325 1643370 -13324 1806409 -13334 1891570 -13330 2094126 -13319 2424286 -13319 2650457 -13325 2715282 -13311 3092010 -13318 3244961 -13306 3321946 -13321 3446480 -13328 3644333 -13334 3714812 -13328 3928889 -13313 4152287 -13324 4497011 -13324 4645094 -13325 6541658 -13339 8449869 -13337 11545575 -13316 11814280 -13302 12028489 -13324 12187097 -13349 12345701 -13354 12540339 -13396 12735943 -13396 12903378 -13425 13103440 -13461 13283023 -13509 13429115 -13499 13679122 -13521 13861980 -13523 14155832 -13530 14344931 -13518 14573230 -13511 14765343 -13547 14959879 -13528 15192777 -13579 15390669 -13611 15588557 -13644 15789960 -13676 15991403 -13708 16236622 -13753 16441249 -13812 16688228 -13787 16893368 -13812 17230031 -13793 17481566 -13811 17688803 -13792 17896037 -13830 18196823 -13819 18357684 -13834 18565439 -13870 18821700 -13859 19079284 -13897 19288103 -13883 19547559 -13908 19860081 -13963 20070522 -14012 20285173 -14080 20560219 -14140 20732016 -14148 21019918 -14162 21379326 -14150 21746458 -14130 22069652 -14183 22420034 -14219 22677730 -14213 23091563 -14260 23414683 -14276 23874363 -14274 24276963 -14318 24756195 -14390 25185364 -14462 25644616 -14544 26226598 -14557 26681976 -14554 27332346 -14521 27938692 -14602 28610024 -14588 29308918 -14613 30156474 -14580 31024769 -14543 32013610 -14577 32963488 -14676 34023072 -14675 35029231 -14691 36188609 -14767 37370414 -14885 38518184 -14878 39730624 -14974 40937806 -15008 41959660 -15009 43997972 -15039 46631045 -15039 49969426 -15147 53632107 -15180 57066286 -15368 60514005 -15379 64138256 -15356 67460179 -15403 64918929 -15560 68486057 -15590 67591981 -15580 65909365 -15514 64245787 -15641 66071664 -15587 68860387 -15537 71048137 -15710 73745734 -15627 76599571 -15618 79052834 -15739 81934490 -15985 82669438 -15981 81374711 -16103 80244245 -16349 79139295 -16328 78279627 -16544 77533151 -16615 75616132 -16616 74926817 -16593 76917472 -16584 79312606 -16665 80101567 -16634 82504177 -16867 85030276 -16971 86883326 -16895 88319800 -16965 90469139 -16950 90465262 -16877 91890415 -17117 93106091 -17238 94321256 -17441 95846287 -17491 92979967 -17446 90954994 -17394 87623370 -17542 85999264 -17681 87412539 -17819 88988409 -17725 91038329 -17943 92336744 -17991 93029082 -18031 92973033 -17970 94737578 -18141 93980118 -18320 95237016 -18545 97391127 -18712 96561416 -18849 93797276 -19074 91336444 -19161 89892725 -19148 90669712 -19232 92693040 -19181 94222209 -19254 96265222 -19423 97254840 -19535 99319736 -19760 101190729 -19980 102676323 -20185 104459744 -20111 103054687 -20358 105521248 -20374 107126438 -20374 105088747 -20372 101446709 -20283 103568593 -20594 101467587 -20811 102246714 -20967 104790689 -21208 106029191 -21371 108934133 -21676 106529418 -21593 108090230 -21829 103189197 -22124 105891192 -22244 108822755 -22548 110958877 -22829 109385192 -23059 111573148 -23240 113687895 -23411 115823707 -23340 118555853 -23628 121634310 -23764 123624077 -24150 126599053 -24048 129441066 -23992 129644548 -24056 131850076 -23959 124550087 -24027 127640855 -24241 125937704 -24583 120297009 -24504 122340050 -24487 118247531 -24522 119488591 -24540 121684801 -24460 123559998 -24412 126151243 -24638 128166276 -24577 129779407 -24541 125648210 -24616 128007653 -24872 130198716 -24743 131132412 -24629 133370101 -24483 135940710 -24513 133837081 -24476 132688318 -24687 130598203 -25045 131756130 -25247 134089716 -25356 135086151 -25531 135840432 -25757 134049326 -25820 135059817 -25838 134720446 -25847 133583240 -25722 135102319 -25599 136767738 -25942 137938928 -25959 137181584 -26362 134741089 -26356 131382998 -26249 129571190 -26193 128461060 -26203 125528898 -26296 125772324 -26356 127272308 -26510 128659463 -26803 129420466 -26965 130811709 -27050 129187186 -27343 128796859 -27408 126306858 -27344 124109316 -27400 123585673 -27354 124051058 -27479 124120333 -27752 124602137 -27936 126110194 -28045 127727168 -28334 129412894 -28508 127266450 -28641 125300988 -28748 124441135 -29000 122351487 diff --git a/tests/difficulty/export_data.pl b/tests/difficulty/export_data.pl new file mode 100644 index 000000000..0298fe338 --- /dev/null +++ b/tests/difficulty/export_data.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl + +# BSD 3-Clause License +# +# Copyright (c) 2018, Karbowanec +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Returns timestamps and difficulty data for wownero (monero RPC) +# Run: perl export_data.pl 50 300 + +$IP='explorer.wowne.ro:11181'; +$begin=$ARGV[0]; +if ($#ARGV == 1 ) { $end=$ARGV[1]; } +else { + $h=`curl -s -X POST http://$IP/json_rpc -d '{"params": {},"jsonrpc":"2.0","id":"test","method":"getblockcount"}' -H 'Content-Type: application/json'`; + $h=~/"count"\D+(\d+)/sg; + $end=$1; + print "$end\n"; +} +print "also printed to file\n\n"; +open (F,">wownero-data.txt"); +for ($i=$begin; $i<$end; $i++) { + $k=qq(-d '{"params":{"height":$i},"jsonrpc":"2.0","id":"test","method":"getblockheaderbyheight"}' -H 'Content-Type: application/json'); + $k=`curl -s -X POST http://$IP/json_rpc $k`; + $k=~/"difficulty"\D+(\d+).+"timestamp"\D+(\d+)/sg; + ($d, $t)=($1,$2); + print "$i\t$t\t$d\n"; + print F "$i\t$t\t$d\n"; + +} +close F; diff --git a/tests/difficulty/generate-data b/tests/difficulty/generate-data index c41ce025d..0e776727d 100755 --- a/tests/difficulty/generate-data +++ b/tests/difficulty/generate-data @@ -32,10 +32,10 @@ from random import randint -DIFFICULTY_TARGET = 120 -DIFFICULTY_WINDOW = 720 -DIFFICULTY_LAG = 15 -DIFFICULTY_CUT = 60 +DIFFICULTY_TARGET = 300 +DIFFICULTY_WINDOW = 144 +DIFFICULTY_LAG = 3 +DIFFICULTY_CUT = 12 UINT_MAX = (1 << 64) - 1 @@ -43,8 +43,8 @@ def difficulty(): times = [] diffs = [] while True: - if len(times) <= 1: - diff = 1 + if len(times) <= 10: + diff = 1069 else: begin = max(len(times) - DIFFICULTY_WINDOW - DIFFICULTY_LAG, 0) end = min(begin + DIFFICULTY_WINDOW, len(times)) diff --git a/tests/difficulty/wow-data.txt b/tests/difficulty/wow-data.txt new file mode 100644 index 000000000..5bbc4439c --- /dev/null +++ b/tests/difficulty/wow-data.txt @@ -0,0 +1,1000 @@ +995 1069 +1032 1069 +1053 1069 +1264 1069 +1261 1069 +1570 1069 +1738 1069 +1718 1069 +1622 1069 +1866 1069 +1802 1069 +1829 3682 +2832 4951 +2583 3156 +3305 3672 +3835 3397 +4507 3122 +5327 2791 +5474 2456 +5712 2540 +5496 2574 +5334 2737 +6029 2911 +5807 2902 +5578 3074 +5963 3258 +6268 3452 +6091 3492 +6606 3690 +7068 3665 +7047 3568 +7051 3744 +7998 3929 +8998 3576 +9274 3263 +9343 3272 +10005 3363 +10040 3228 +9810 3322 +9994 3433 +9758 3546 +10053 3664 +11100 3780 +10826 3501 +10463 3605 +10903 3712 +10761 3822 +11600 3935 +11747 3861 +11689 3916 +12362 4025 +13510 3914 +14360 3649 +15008 3499 +15674 3412 +16084 3327 +16147 3302 +15960 3354 +16485 3421 +16427 3412 +17133 3478 +17857 3403 +17957 3318 +18710 3357 +18950 3271 +19210 3282 +20199 3289 +20741 3171 +20845 3132 +21201 3163 +21621 3154 +21899 3136 +22693 3139 +22947 3068 +22842 3074 +22800 3116 +23140 3159 +23881 3174 +23562 3113 +23407 3154 +23455 3195 +23223 3237 +23310 3280 +23892 3323 +23674 3365 +24472 3409 +24259 3368 +24467 3411 +25492 3455 +25428 3353 +25574 3394 +25308 3424 +25245 3466 +26226 3508 +26694 3459 +27125 3437 +27506 3420 +27302 3409 +27213 3448 +27711 3487 +27708 3499 +27700 3538 +27701 3578 +27694 3618 +27686 3659 +27675 3700 +27668 3742 +27676 3784 +27672 3826 +27677 3869 +27682 3913 +27678 3956 +27684 4001 +27681 4046 +27677 4091 +27675 4137 +27675 4184 +27666 4231 +27672 4278 +27665 4326 +27669 4375 +27668 4418 +27660 4418 +27670 4460 +27662 4461 +27660 4534 +27671 4534 +27663 4573 +27672 4574 +27674 4667 +27670 4668 +27678 4717 +27684 4718 +27681 4775 +27680 4775 +27686 4819 +27675 4819 +27670 4872 +27669 4872 +27666 4919 +27662 4919 +27666 4938 +27664 4938 +27653 5076 +27642 5076 +27635 5076 +27636 5076 +27626 5076 +27619 5146 +27622 5259 +27614 5394 +27625 5572 +27634 5804 +27641 5838 +27638 5906 +27647 5944 +27653 5995 +27658 6060 +27649 6114 +27656 6185 +27658 6229 +27650 6270 +27651 6344 +27647 6465 +27637 6625 +27627 6651 +27639 6680 +27643 7021 +27653 7433 +27663 7586 +27665 7658 +27657 7878 +27649 7948 +27655 8077 +27651 8127 +27651 8188 +27662 8238 +27665 8478 +27663 8677 +27662 8762 +27660 8854 +27656 9010 +27647 9342 +27657 9453 +27667 9554 +27658 10007 +27657 10897 +27652 11687 +27663 12390 +27654 13194 +27647 13639 +27653 13911 +27654 14114 +27657 14600 +27659 14817 +27664 15878 +27653 17214 +27656 17567 +27644 19242 +27652 19983 +27652 20819 +27644 23841 +27661 26037 +27661 26808 +27653 28709 +27648 31196 +27648 33241 +27651 39181 +27640 40719 +27647 41788 +27655 43456 +27647 46144 +27656 47948 +27649 49895 +27648 52157 +27650 53942 +27660 56625 +27651 59747 +27639 64797 +27625 66841 +27654 76231 +27666 83764 +27699 86684 +27739 118603 +27759 126479 +27790 138334 +27843 147801 +27874 159630 +27917 240159 +27912 367275 +27850 676598 +27809 831659 +27759 1065989 +27634 2267177 +27186 5230850 +27792 5723763 +29418 6144718 +29414 6703797 +29749 7031689 +30418 6854115 +31944 7126179 +33023 5768775 +32645 5514464 +33673 5888393 +35188 5206040 +36923 5871441 +38855 6498473 +39616 6631237 +39971 7909003 +39945 9972757 +41505 14296572 +40526 20169397 +41333 4214732 +42781 5333764 +44339 5496043 +45323 4912825 +45763 3668236 +46077 3500080 +47055 3561345 +47969 3470275 +48074 2980670 +48393 2613300 +48813 2336894 +48988 2354393 +48976 2484122 +49036 2721340 +48778 2936811 +48538 3205459 +48566 3256775 +48536 3087933 +49040 2898516 +49848 2820503 +49856 2812669 +50671 2821637 +50412 2734469 +50452 2662676 +51196 2692677 +51462 2688994 +51468 2704067 +51778 2737529 +52008 2769402 +52488 2780176 +52929 2817114 +53763 2840588 +53740 2884678 +53645 2921423 +54264 2961426 +55037 2891712 +55223 2928569 +55467 2894164 +55954 2924968 +56281 2931759 +56029 2900638 +56410 2902157 +56889 2935514 +57223 2931760 +56936 2938226 +56882 2915074 +57630 2897810 +58041 2850822 +58728 2873530 +59194 2904811 +59038 2883435 +59737 2833650 +60508 2846314 +60368 2852477 +60547 2834318 +60471 2857733 +60207 2862888 +60298 2880234 +61002 2863771 +60922 2893079 +60938 2918445 +61416 2919606 +61983 2908978 +61684 2897692 +62540 2861291 +62340 2860706 +62993 2873891 +62970 2851662 +63817 2836631 +64354 2854835 +64996 2874607 +65812 2891592 +66342 2914353 +66814 2937038 +67499 2929632 +67704 2954169 +67784 2974619 +68344 2963956 +68730 2966118 +68729 2965456 +68656 2959531 +69316 2966998 +70112 2955118 +70000 2977222 +69858 2932726 +70619 2912941 +71371 2885820 +71901 2846621 +72299 2829983 +72417 2818121 +73186 2791439 +73755 2798973 +73954 2815316 +74421 2798104 +75258 2798245 +75038 2814579 +75721 2835759 +76481 2816931 +76700 2801379 +76903 2812675 +77324 2825555 +77687 2812100 +77773 2783265 +78607 2768773 +79196 2762605 +79889 2773877 +80044 2744997 +80060 2730459 +80734 2738443 +81181 2729249 +80980 2710375 +80789 2715853 +81088 2705182 +81161 2677079 +81654 2679036 +82078 2679014 +81869 2660894 +82125 2628942 +82897 2606977 +82841 2621524 +82920 2566963 +83131 2522955 +83279 2524246 +83072 2576056 +83215 2558597 +83213 2558406 +83838 2563076 +83775 2625367 +83874 2702529 +83723 2797526 +84414 2788487 +84580 2758644 +85079 2694560 +85489 2643322 +85902 2522185 +86619 2517706 +86895 2575621 +86939 2646087 +87540 2691873 +88025 2708857 +88638 2724009 +89435 2784434 +90128 2813425 +90747 2814616 +90767 2835699 +91088 2848196 +90907 2809114 +91142 2800637 +91314 2778274 +91742 2747466 +91902 2723314 +92261 2666402 +92885 2646284 +92977 2641493 +92793 2654976 +92787 2620981 +93521 2616306 +93864 2565885 +93756 2536207 +93591 2531104 +94117 2548066 +94526 2540505 +94958 2549388 +94894 2561093 +95080 2581395 +95287 2581721 +95977 2618322 +96017 2598678 +96752 2563067 +96909 2593505 +97496 2638294 +97475 2642418 +97826 2619396 +98335 2645556 +98853 2636099 +99199 2643250 +98972 2631740 +99609 2632997 +100378 2604968 +100977 2600828 +101040 2609519 +101141 2620860 +100922 2599747 +100723 2642644 +100998 2610145 +101485 2607770 +101440 2604627 +101462 2634349 +101412 2615709 +101789 2583973 +102142 2554302 +102774 2547143 +103394 2532826 +104085 2528745 +104285 2478274 +105000 2458343 +105735 2469367 +105660 2480553 +105770 2495937 +106262 2514558 +106795 2519060 +106565 2527402 +107308 2525146 +107784 2577330 +108369 2611076 +108675 2632693 +108708 2663459 +109412 2652978 +109203 2638930 +109320 2635210 +110082 2631667 +110500 2582602 +110282 2571705 +110963 2584214 +110841 2583063 +111048 2545714 +111021 2561447 +111606 2579609 +112153 2550322 +112470 2522850 +113004 2515238 +113559 2543274 +114210 2576123 +114647 2567913 +114805 2566525 +115476 2613195 +115493 2604548 +115353 2602555 +115989 2618634 +115733 2637027 +115970 2642320 +116347 2670170 +116357 2724575 +116975 2696208 +117659 2667663 +117900 2672973 +117670 2657510 +118145 2620669 +118027 2632516 +118479 2642156 +119198 2680859 +119308 2649900 +119208 2640827 +119810 2689570 +120155 2674382 +120770 2670237 +120888 2676414 +121211 2654437 +121220 2655597 +121237 2644841 +121243 2610087 +121255 2624709 +121265 2611522 +121271 2655355 +121270 2650778 +121279 2628229 +121286 2588290 +121289 2592850 +121284 2592095 +121275 2557753 +121278 2539206 +121278 2528353 +121275 2524270 +121282 2506323 +121274 2506995 +121284 2541431 +121271 2551307 +121268 2585073 +121276 2613709 +121265 2644990 +121271 2700795 +121287 2722938 +121285 2725923 +121301 2773611 +121315 2813019 +121322 2864069 +121313 2933360 +121330 2995880 +121336 3053673 +121335 3052235 +121347 3062935 +121363 3078536 +121363 3081264 +121355 3096808 +121344 3140316 +121358 3156509 +121366 3195798 +121374 3255474 +121382 3256820 +121380 3267242 +121397 3278499 +121399 3345106 +121414 3356681 +121434 3380794 +121439 3399177 +121428 3436204 +121435 3493429 +121423 3547632 +121438 3561070 +121436 3583081 +121442 3617264 +121444 3721942 +121443 3734442 +121455 3853143 +121448 3885051 +121452 3984597 +121443 3993581 +121447 4058385 +121442 4154497 +121451 4258088 +121451 4289803 +121445 4343295 +121454 4436511 +121456 4611743 +121453 4702011 +121476 4761624 +121462 4788329 +121460 4809715 +121450 4835434 +121450 4877857 +121447 4962731 +121451 4990124 +121465 5015521 +121459 5042729 +121459 5144674 +121483 5264672 +121497 5470823 +121523 5688444 +121532 5947746 +121552 6054328 +121570 6357993 +121573 6666838 +121584 6742268 +121570 6801138 +121553 7066744 +121582 7256596 +121614 7420236 +121597 7740944 +121597 8062677 +121608 8476694 +121613 8730910 +121596 8809765 +121580 9223206 +121612 9366955 +121601 9513095 +121624 10141719 +121627 10421270 +121659 10721470 +121680 11178496 +121676 11423139 +121675 11606764 +121717 11768024 +121717 12569307 +121717 13446334 +121742 14093972 +121763 15177950 +121812 16448696 +121822 18133347 +121796 19547321 +121843 20297770 +121914 22401723 +121993 23181253 +122045 23616556 +122128 24855688 +122141 26267703 +122154 26814048 +122242 29096657 +122275 29456251 +122318 33919746 +122378 40433966 +122345 41136379 +122464 44334317 +122435 46540694 +122472 49103388 +122521 55379501 +122708 71991965 +122851 72558867 +122880 75421386 +122899 93415891 +123006 109193567 +123239 162303536 +123585 181484548 +123752 230545203 +123888 232921611 +123698 235998864 +124144 241798489 +124245 247564948 +124919 248318184 +124681 253292641 +125207 263815332 +125737 266553990 +126357 246541506 +126830 237512626 +127489 246810899 +127582 261154571 +127651 263646728 +127679 256774461 +128014 241660080 +128427 258844954 +128887 281135478 +129154 293432887 +128895 292571823 +129810 307610443 +130199 289828043 +131059 291537870 +131326 290103115 +131586 273410565 +132036 254510554 +132201 246118686 +132649 232187432 +132408 241180267 +132949 251175658 +133640 262375857 +133653 260129696 +134032 255837548 +133799 251566461 +134353 262940133 +134697 265613449 +135171 255900779 +134922 254513320 +134674 240861604 +135353 243119107 +135165 245056094 +135844 241919008 +136096 245008262 +136577 246972760 +137234 248068232 +137144 248384335 +137663 240878434 +138369 247020939 +138785 250347868 +139197 251645098 +139660 251435399 +140148 251315107 +140409 256607487 +140747 257965199 +140584 258581417 +140742 263718545 +140743 265470098 +141203 261395782 +141470 261852867 +142218 258380708 +142283 253711095 +142505 256922084 +142755 254533900 +143430 248216648 +143559 246531604 +143545 244987119 +144033 242824345 +144277 240456378 +144068 241144028 +143973 242908330 +144522 244878202 +144420 248917701 +144520 252957972 +144465 251012119 +144395 251526342 +144745 246148182 +145210 248998567 +145842 250092035 +145619 250750572 +146271 246513925 +146717 248798604 +146756 251997761 +147105 250737509 +147454 253203523 +147628 256127583 +147952 256890306 +148475 258725409 +148267 261698186 +149017 264427610 +148867 267002727 +149532 270309264 +149474 270802481 +149936 268525490 +149933 267012271 +150191 267627423 +150231 265901707 +150393 264049541 +150147 266543834 +149923 265830376 +149844 265089189 +150063 266474655 +150467 266156482 +150465 265803638 +150492 266580033 +150743 265886182 +151311 267221241 +151110 265597822 +151792 268053664 +151959 267982464 +152556 270216683 +153199 272935986 +153789 275632752 +153800 277188686 +153598 279655274 +154107 282583945 +154942 285274387 +154645 287041556 +155056 288984473 +155817 291629042 +156603 294801348 +157294 295035375 +157025 294146204 +157003 294711271 +156769 292536950 +156898 293719561 +156787 290405394 +156743 286589282 +156533 285487816 +157118 287431674 +157824 290665055 +157709 290067620 +158477 287138509 +159299 287100874 +160122 289369136 +160844 286668563 +161205 281991107 +160938 282420995 +161654 282917556 +161500 285398625 +161815 286541139 +162218 289854492 +162786 291403067 +163039 294053937 +163409 298329828 +163156 303007899 +162939 304093432 +163518 309974555 +163562 304608296 +164222 297583087 +164603 290592360 +164840 287578145 +164839 290613464 +165708 292360913 +165698 289690704 +166019 290560413 +166350 294856824 +167125 294728148 +166841 297439409 +167711 298549501 +167529 300305890 +168349 303986837 +168918 303686964 +168847 305393729 +168649 307955466 +168726 304855612 +168559 308181200 +168259 306241552 +168234 308008177 +168110 302315422 +168612 305569935 +168636 305906187 +168943 303298778 +169653 301149180 +169853 301293931 +170468 298101957 +171114 298614194 +171063 300042721 +170995 301785489 +171225 306682290 +171298 311945986 +172080 311291808 +171773 315726088 +172326 323427260 +172289 328370981 +173001 332611063 +173705 337064873 +174340 342519630 +174656 345843455 +174523 339924055 +174341 339873797 +174548 333200374 +175197 327767930 +175490 332415219 +175633 335241473 +175901 343102999 +176136 343610518 +177060 341197556 +177143 341160366 +178005 347451087 +177907 349245778 +178871 342297735 +178990 339909931 +179103 334471279 +179664 335884481 +179453 337146585 +179874 339131572 +180608 339036879 +181123 334295264 +181378 332514788 +181368 331815034 +181610 332269354 +181353 335658267 +181024 331029523 +181799 333376639 +181533 330803620 +181852 335446096 +182249 327651485 +182786 330853981 +182815 334091425 +183694 332995651 +183716 334941456 +184256 336817329 +184978 332025859 +185709 332429866 +186457 333570075 +186612 336524124 +186578 337557879 +186476 341429329 +187155 341215996 +188068 341116974 +188507 339736778 +189327 341201420 +189402 338445712 +189296 333925182 +189261 334673213 +190126 328066673 +190122 329180589 +190650 324569768 +190780 318579181 +190626 314776776 +190969 311946966 +190890 314166566 +191777 318188885 +192207 320045959 +192265 321161086 +191971 319260853 +192249 319445928 +192402 314917166 +192248 315201117 +192683 318108496 +192519 322772416 +193154 319241285 +193916 320586463 +193723 323274138 +194704 330040238 +195184 329634117 +194926 330080108 +195479 329739241 +195867 322514365 +196687 321976322 +196958 321040287 +197636 321145380 +198200 322276370 +198827 323986641 +199777 326794962 +200567 327018587 +200520 332006083 +200278 335733043 +200046 338549668 +199874 344296960 +200291 337647450 +200243 338518067 +200885 339309954 +201357 338288801 +202241 336350601 +202324 332561061 +202067 335711646 +202071 330866236 +202854 326704296 +203434 322209733 +203411 316221784 +204065 316466802 +204968 315581800 +205767 319955897 +206645 323462328 +206375 325976933 +206808 324289361 +206693 332228958 +206362 329743222 +206454 328646099 +207209 325507293 +207638 330329090 +208223 331728429 +209130 335067410 +209345 331974791 +209858 330643804 +209559 331699357 +210330 326178275 +210934 318999077 +211625 314071095 +211897 309683222 +212655 309930370 +212357 309518492 +212981 308824617 +212827 309611918 +212525 309432426 +212433 306566068 +212347 309064398 +212464 306201238 +212317 304175447 +212979 306911064 +213358 305985547 +213100 304258564 +213302 301599350 +213762 297612234 +214130 296020082 +214450 296234760 +214731 294572059 +214622 294482263 +215333 299276824 +215502 303917135 +215508 308471741 +216410 307678437 +217063 307855228 +217710 306409096 +218169 305830083 +218818 310027240 +219686 311250740 +219811 310516485 +220644 311941543 +221030 310173680 +221355 314460254 +222269 312101320 +222080 316701627 +222437 316159429 +223294 318094589 +223663 317363253 +224509 318081780 +224990 313101859 +224756 309166502 +224703 305336221 +225030 307306494 +225654 305219315 +226438 298967393 +226566 299617506 +226556 293222112 +226628 290248822 +226447 288884926 +226249 284101629 +226513 283997093 +226774 283049805 +226727 279807754 +226542 280858724 +226858 275240062 +227152 279692044 +227553 279292362 +227985 281158595 +227794 285760970 +228507 286322073 +228532 287162103 +228962 285663441 +229467 285996180 +230298 285382009 +231050 288707650 +230873 295006850 +231488 297892791 diff --git a/tests/difficulty/wow-emission b/tests/difficulty/wow-emission new file mode 100755 index 000000000..d033fcdb2 --- /dev/null +++ b/tests/difficulty/wow-emission @@ -0,0 +1,86 @@ +#!/usr/bin/python3 + +# BSD 3-Clause License +# +# Copyright (c) 2018, Jason Rhinelander +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import requests + +# CONFIGURATION: + +# Target time +DIFFICULTY_TARGET = 300 + +# Range of blocks to analyze: +N = 20 + +# Fork height/name pairs (purely cosmetic to indicate forks in the output) +forks = { + 50: 'v12', +} + +# First element is the URL to fetch; the rest are keys to follow to get the current network height: +api_height = ('http://explorer.wowne.ro:8082/api/networkinfo', 'data', 'height') + +# First element is a format with {} to be replaced with the block height; the rest are keys to +# follow to get that block's timestamp: +api_block = ('http://explorer.wowne.ro:8082/api/block/{}', 'data', 'timestamp') + +# Run: ./wow-emission + +# END CONFIGURATION + +time_period = N*DIFFICULTY_TARGET +h = requests.get(api_height[0]).json() +for i in api_height[1:]: + h = h[i] + +h -= 1 # want height of last block, not current network height + +next_ts = None +next_h = None +while h > 1: + contains_fork = None + for fork_height, fork_name in forks.items(): + if h is not None and h < fork_height <= next_h: + contains_fork = fork_name + break + + ts = requests.get(api_block[0].format(h)).json() + for i in api_block[1:]: + ts = ts[i] + + if next_ts is not None: + elapsed = next_ts - ts + print("{} -- {}: elapsed time = {}s = {:.2f}% of {} target = avg solvetime = {:.2f} minutes over {} blocks".format( + h, next_h, elapsed, 100.*elapsed/time_period, time_period, elapsed/60/N, N), end='') + + print(" --- ({} FORK) ---".format(contains_fork) if contains_fork is not None else "") + + next_ts = ts + next_h = h + h -= N diff --git a/tests/difficulty/wownero-data.txt b/tests/difficulty/wownero-data.txt new file mode 100644 index 000000000..cf799af5e --- /dev/null +++ b/tests/difficulty/wownero-data.txt @@ -0,0 +1,478 @@ +50 1544807250 111 +51 1544807251 111 +52 1544807267 7120 +53 1544807942 15340 +54 1544808953 9094 +55 1544809140 5748 +56 1544809214 6054 +57 1544809224 6678 +58 1544809698 7557 +59 1544809817 7066 +60 1544809969 7524 +61 1544810017 7901 +62 1544810260 8566 +63 1544810847 8717 +64 1544811309 8063 +65 1544811461 7758 +66 1544812116 8017 +67 1544812450 7458 +68 1544812700 7412 +69 1544813448 7477 +70 1544813747 6956 +71 1544814796 6957 +72 1544815060 6287 +73 1544816309 6315 +74 1544816329 5670 +75 1544816563 5840 +76 1544816875 5881 +77 1544816886 5874 +78 1544817057 6046 +79 1544817102 6123 +80 1544817107 6278 +81 1544817697 6462 +82 1544818307 6286 +83 1544818405 6114 +84 1544818452 6222 +85 1544818601 6360 +86 1544818970 6443 +87 1544818977 6406 +88 1544819349 6563 +89 1544819355 6524 +90 1544819520 6680 +91 1544819607 6752 +92 1544819648 6866 +93 1544819784 7007 +94 1544819815 7097 +95 1544820138 7246 +96 1544820865 7234 +97 1544821319 7011 +98 1544821764 6935 +99 1544821949 6867 +100 1544821999 6920 +101 1544822103 7035 +102 1544822445 7127 +103 1544822499 7107 +104 1544822630 7220 +105 1544823113 7299 +106 1544823164 7216 +107 1544823207 7327 +108 1544823462 7443 +109 1544824390 7464 +110 1544824483 7194 +111 1544824693 7279 +112 1544825153 7316 +113 1544825447 7252 +114 1544826047 7254 +115 1544826816 7140 +116 1544826840 6970 +117 1544826893 7068 +118 1544827218 7155 +119 1544827246 7147 +120 1544827258 7243 +121 1544827533 7346 +122 1544827536 7353 +123 1544828070 7353 +124 1544828149 7459 +125 1544828183 7459 +126 1544828541 7374 +127 1544829151 7374 +128 1544829353 7451 +129 1544829375 7451 +130 1544829428 7545 +131 1544830618 7545 +132 1544830629 7522 +133 1544831213 7522 +134 1544831672 7414 +135 1544831917 7414 +136 1544831961 7447 +137 1544832296 7447 +138 1544833065 7542 +139 1544833372 7542 +140 1544833650 7624 +141 1544833856 7624 +142 1544834092 7335 +143 1544834232 7335 +144 1544834476 7428 +145 1544834789 7428 +146 1544834932 7428 +147 1544835167 7428 +148 1544835577 7428 +149 1544835658 7343 +150 1544835719 7296 +151 1544835874 7312 +152 1544836381 7388 +153 1544836763 7378 +154 1544838241 7247 +155 1544838310 7249 +156 1544838531 7258 +157 1544838683 7287 +158 1544838835 7306 +159 1544838915 7349 +160 1544838937 7364 +161 1544839139 7360 +162 1544839632 7402 +163 1544839639 7419 +164 1544839766 7390 +165 1544840188 7449 +166 1544840324 7509 +167 1544840725 7549 +168 1544841073 7493 +169 1544841395 7470 +170 1544841881 7184 +171 1544841925 7238 +172 1544842032 7255 +173 1544842532 7288 +174 1544842689 7325 +175 1544842741 7375 +176 1544842993 7439 +177 1544843611 7461 +178 1544843765 7418 +179 1544843882 7485 +180 1544843949 7530 +181 1544844471 7501 +182 1544846276 7538 +183 1544847445 7518 +184 1544848223 7506 +185 1544848650 7500 +186 1544849293 7456 +187 1544849307 7451 +188 1544849402 7504 +189 1544849696 7602 +190 1544849805 7623 +191 1544850606 7640 +192 1544850744 7592 +193 1544851386 7559 +194 1544851652 7554 +195 1544851664 7562 +196 1544851719 7554 +197 1544852399 7483 +198 1544853145 7216 +199 1544853804 7070 +200 1544853963 6948 +201 1544854234 6987 +202 1544854678 6928 +203 1544854843 6973 +204 1544854969 7100 +205 1544855088 7107 +206 1544855298 7303 +207 1544855399 7204 +208 1544855417 7448 +209 1544855575 7332 +210 1544855609 7340 +211 1544855796 7418 +212 1544855904 7423 +213 1544856100 7328 +214 1544856230 7195 +215 1544856308 7073 +216 1544856344 7161 +217 1544856487 7234 +218 1544856585 7172 +219 1544856616 7155 +220 1544856803 7166 +221 1544857509 7221 +222 1544857649 7188 +223 1544857660 7247 +224 1544857833 7252 +225 1544857938 7259 +226 1544858083 7275 +227 1544858344 7250 +228 1544858447 7259 +229 1544858893 7228 +230 1544858949 7266 +231 1544859066 7398 +232 1544859349 7488 +233 1544859494 7555 +234 1544859567 7577 +235 1544859701 7583 +236 1544859708 7566 +237 1544860014 7488 +238 1544860386 7471 +239 1544860779 7496 +240 1544860825 7563 +241 1544860938 7552 +242 1544861189 7529 +243 1544861265 7526 +244 1544861486 7707 +245 1544861493 7628 +246 1544862214 7662 +247 1544862688 7740 +248 1544863295 7745 +249 1544863944 7853 +250 1544864067 8024 +251 1544864418 8003 +252 1544864496 8018 +253 1544864539 8026 +254 1544864626 7946 +255 1544864834 7858 +256 1544865358 7914 +257 1544865404 7889 +258 1544865649 7958 +259 1544865881 7960 +260 1544865929 7917 +261 1544866026 8004 +262 1544866446 7980 +263 1544866493 7917 +264 1544866753 7783 +265 1544867010 7651 +266 1544867925 7900 +267 1544868777 7825 +268 1544868824 7948 +269 1544868950 8054 +270 1544868952 8098 +271 1544869472 8061 +272 1544869999 8019 +273 1544870138 8202 +274 1544871229 8222 +275 1544871380 8236 +276 1544871780 8280 +277 1544871970 8322 +278 1544872078 8256 +279 1544872085 8311 +280 1544872452 8328 +281 1544872501 8301 +282 1544873065 8133 +283 1544873233 8028 +284 1544873620 8042 +285 1544873974 8033 +286 1544874612 8077 +287 1544875073 8080 +288 1544875609 8051 +289 1544875708 8398 +290 1544876318 8146 +291 1544876424 8172 +292 1544877283 8120 +293 1544877669 8120 +294 1544877696 8121 +295 1544877838 8133 +296 1544877838 8102 +297 1544878052 8219 +298 1544878058 8089 +299 1544878076 8085 +300 1544878965 8098 +301 1544879506 8051 +302 1544879566 7999 +303 1544880167 7978 +304 1544880273 7933 +305 1544881431 8034 +306 1544881686 7910 +307 1544882187 7918 +308 1544882801 7844 +309 1544883397 7799 +310 1544883541 7811 +311 1544883614 7842 +312 1544883818 7989 +313 1544884565 7982 +314 1544884766 8013 +315 1544886005 8030 +316 1544886045 7949 +317 1544886716 8256 +318 1544887183 8546 +319 1544887281 8598 +320 1544887408 8689 +321 1544887955 8555 +322 1544888070 8496 +323 1544889324 8394 +324 1544889572 8315 +325 1544889624 8196 +326 1544889758 8361 +327 1544889858 8380 +328 1544889945 8497 +329 1544890524 8377 +330 1544890752 8333 +331 1544890803 8050 +332 1544891097 8207 +333 1544891104 8235 +334 1544891284 8295 +335 1544891836 8325 +336 1544892064 8377 +337 1544892318 8366 +338 1544892754 8392 +339 1544892932 8128 +340 1544893094 8108 +341 1544893454 8153 +342 1544893586 8155 +343 1544893598 8144 +344 1544893663 8171 +345 1544894071 8052 +346 1544895132 8051 +347 1544895173 8069 +348 1544896179 8054 +349 1544896208 8092 +350 1544896727 8078 +351 1544897097 7971 +352 1544897286 7961 +353 1544897682 7937 +354 1544897896 7858 +355 1544898916 7868 +356 1544898949 7996 +357 1544899556 7955 +358 1544899775 7935 +359 1544899776 7979 +360 1544899865 7995 +361 1544899872 7943 +362 1544899941 7777 +363 1544899968 7797 +364 1544900311 7686 +365 1544900552 7699 +366 1544901232 7622 +367 1544901496 7608 +368 1544901957 7603 +369 1544903562 7541 +370 1544903755 7527 +371 1544904768 7335 +372 1544905506 7390 +373 1544906057 7350 +374 1544906297 7386 +375 1544906315 7398 +376 1544906337 7406 +377 1544906502 7456 +378 1544906547 7459 +379 1544906847 7497 +380 1544906977 7433 +381 1544907319 7526 +382 1544907476 7485 +383 1544907712 7551 +384 1544908725 7587 +385 1544909776 7298 +386 1544910660 7324 +387 1544911294 7149 +388 1544911645 7023 +389 1544911681 6940 +390 1544911980 6931 +391 1544912010 7013 +392 1544912240 7014 +393 1544912442 7024 +394 1544913183 7052 +395 1544913211 7006 +396 1544913287 6996 +397 1544913368 7006 +398 1544913989 6984 +399 1544914107 6986 +400 1544914282 6859 +401 1544914450 6833 +402 1544915089 6824 +403 1544915455 6724 +404 1544915634 6681 +405 1544916158 6668 +406 1544916276 6694 +407 1544917136 6766 +408 1544917168 6743 +409 1544918023 6880 +410 1544918389 6774 +411 1544918585 6826 +412 1544918714 6835 +413 1544919342 6831 +414 1544919630 6721 +415 1544919924 6752 +416 1544920303 6721 +417 1544920319 6776 +418 1544920340 6691 +419 1544920453 6685 +420 1544920898 6703 +421 1544920982 6711 +422 1544921194 6757 +423 1544921328 6695 +424 1544921394 6694 +425 1544921691 6646 +426 1544922123 6594 +427 1544922578 6691 +428 1544922740 6723 +429 1544923162 6617 +430 1544923243 6584 +431 1544923473 6528 +432 1544923667 6492 +433 1544923733 6481 +434 1544924157 6471 +435 1544924409 6582 +436 1544924576 6587 +437 1544924759 6574 +438 1544924994 6627 +439 1544925510 6614 +440 1544925648 6784 +441 1544926443 6768 +442 1544927071 6770 +443 1544927398 6788 +444 1544927604 6855 +445 1544927649 6797 +446 1544927686 6787 +447 1544927735 6771 +448 1544927802 6855 +449 1544928132 6867 +450 1544928608 7002 +451 1544928617 6952 +452 1544928941 7032 +453 1544929052 7069 +454 1544929625 7028 +455 1544929726 6940 +456 1544930394 7001 +457 1544930716 6863 +458 1544931293 6964 +459 1544931301 6938 +460 1544931430 6899 +461 1544931614 6903 +462 1544931777 6902 +463 1544932345 6895 +464 1544932452 6977 +465 1544932485 6946 +466 1544932507 6860 +467 1544932867 6902 +468 1544933220 6835 +469 1544933524 6837 +470 1544933953 6823 +471 1544934005 6835 +472 1544934020 6750 +473 1544934376 6758 +474 1544934584 6679 +475 1544934715 6696 +476 1544934868 6727 +477 1544935152 6708 +478 1544935226 6672 +479 1544935396 6575 +480 1544935475 6618 +481 1544935482 6792 +482 1544935519 6785 +483 1544935559 6895 +484 1544935587 6825 +485 1544935624 6855 +486 1544935731 6834 +487 1544936206 6851 +488 1544936888 6913 +489 1544937586 6877 +490 1544937937 7023 +491 1544937990 6993 +492 1544938149 7073 +493 1544938379 7049 +494 1544939193 7024 +495 1544939423 6996 +496 1544939930 6970 +497 1544940085 6974 +498 1544940211 6964 +499 1544940274 7017 +500 1544940355 7052 +501 1544940405 7177 +502 1544940551 7203 +503 1544940662 7194 +504 1544941378 7387 +505 1544941980 7271 +506 1544942561 7413 +507 1544943576 7566 +508 1544943849 7656 +509 1544943988 7655 +510 1544944013 7466 +511 1544944287 7416 +512 1544944317 7336 +513 1544944801 7307 +514 1544945739 7340 +515 1544946982 7352 +516 1544947008 7405 +517 1544947289 7427 +518 1544947560 7444 +519 1544948145 7650 +520 1544949215 7732 +521 1544949531 7801 +522 1544949707 7817 +523 1544950260 7660 +524 1544950430 7610 +525 1544950640 7655 +526 1544950742 7660 +527 1544950774 7653 diff --git a/tests/difficulty/wownero-emission.txt b/tests/difficulty/wownero-emission.txt new file mode 100644 index 000000000..a5dcfcc08 --- /dev/null +++ b/tests/difficulty/wownero-emission.txt @@ -0,0 +1,26 @@ +511 -- 531: elapsed time = 7762s = 129.37% of 6000 target = avg solvetime = 6.47 minutes over 20 blocks +491 -- 511: elapsed time = 6297s = 104.95% of 6000 target = avg solvetime = 5.25 minutes over 20 blocks +471 -- 491: elapsed time = 3985s = 66.42% of 6000 target = avg solvetime = 3.32 minutes over 20 blocks +451 -- 471: elapsed time = 5388s = 89.80% of 6000 target = avg solvetime = 4.49 minutes over 20 blocks +431 -- 451: elapsed time = 5144s = 85.73% of 6000 target = avg solvetime = 4.29 minutes over 20 blocks +411 -- 431: elapsed time = 4888s = 81.47% of 6000 target = avg solvetime = 4.07 minutes over 20 blocks +391 -- 411: elapsed time = 6575s = 109.58% of 6000 target = avg solvetime = 5.48 minutes over 20 blocks +371 -- 391: elapsed time = 7242s = 120.70% of 6000 target = avg solvetime = 6.04 minutes over 20 blocks +351 -- 371: elapsed time = 7671s = 127.85% of 6000 target = avg solvetime = 6.39 minutes over 20 blocks +331 -- 351: elapsed time = 6294s = 104.90% of 6000 target = avg solvetime = 5.25 minutes over 20 blocks +311 -- 331: elapsed time = 7189s = 119.82% of 6000 target = avg solvetime = 5.99 minutes over 20 blocks +291 -- 311: elapsed time = 7190s = 119.83% of 6000 target = avg solvetime = 5.99 minutes over 20 blocks +271 -- 291: elapsed time = 6952s = 115.87% of 6000 target = avg solvetime = 5.79 minutes over 20 blocks +251 -- 271: elapsed time = 5054s = 84.23% of 6000 target = avg solvetime = 4.21 minutes over 20 blocks +231 -- 251: elapsed time = 5352s = 89.20% of 6000 target = avg solvetime = 4.46 minutes over 20 blocks +211 -- 231: elapsed time = 3270s = 54.50% of 6000 target = avg solvetime = 2.73 minutes over 20 blocks +191 -- 211: elapsed time = 5190s = 86.50% of 6000 target = avg solvetime = 4.33 minutes over 20 blocks +171 -- 191: elapsed time = 8681s = 144.68% of 6000 target = avg solvetime = 7.23 minutes over 20 blocks +151 -- 171: elapsed time = 6051s = 100.85% of 6000 target = avg solvetime = 5.04 minutes over 20 blocks +131 -- 151: elapsed time = 5256s = 87.60% of 6000 target = avg solvetime = 4.38 minutes over 20 blocks +111 -- 131: elapsed time = 5925s = 98.75% of 6000 target = avg solvetime = 4.94 minutes over 20 blocks +91 -- 111: elapsed time = 5086s = 84.77% of 6000 target = avg solvetime = 4.24 minutes over 20 blocks +71 -- 91: elapsed time = 4811s = 80.18% of 6000 target = avg solvetime = 4.01 minutes over 20 blocks +51 -- 71: elapsed time = 7545s = 125.75% of 6000 target = avg solvetime = 6.29 minutes over 20 blocks +31 -- 51: elapsed time = 121s = 2.02% of 6000 target = avg solvetime = 0.10 minutes over 20 blocks --- (v12 FORK) --- +11 -- 31: elapsed time = 78s = 1.30% of 6000 target = avg solvetime = 0.07 minutes over 20 blocks