Compare commits

..

48 Commits

Author SHA1 Message Date
SChernykh 143960937e p2pool v3.4
C/C++ CI / build-ubuntu (map[c:gcc-11 cpp:g++-11 os:ubuntu-20.04]) (push) Has been cancelled
C/C++ CI / build-ubuntu (map[c:gcc-12 cpp:g++-12 os:ubuntu-22.04]) (push) Has been cancelled
C/C++ CI / build-ubuntu-static-libs (push) Has been cancelled
C/C++ CI / build-ubuntu-aarch64 (map[os:ubuntu-20.04]) (push) Has been cancelled
C/C++ CI / build-ubuntu-aarch64 (map[os:ubuntu-22.04]) (push) Has been cancelled
C/C++ CI / build-windows-msys2 (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[msbuild:C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\amd64\ os:2019 rx:OFF upnp:OFF vs:Visual Studio 16 2019]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[msbuild:C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\amd64\ os:2019 rx:OFF upnp:ON vs:Visual Studio 16 2019]) (push) Has been cancelled
C/C++ CI / build-windows-msbuild (map[msbuild:C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\amd64\ os:2019 rx:ON upnp:ON vs:Visual Studio 16 2019]) (push) Has been cancelled
C/C++ CI / build-macos (macos-11) (push) Has been cancelled
C/C++ CI / build-macos (macos-12) (push) Has been cancelled
C/C++ CI / build-macos-aarch64 (macos-11) (push) Has been cancelled
C/C++ CI / build-macos-aarch64 (macos-12) (push) Has been cancelled
C/C++ CI / build-freebsd (map[architecture:x86-64 host:ubuntu-22.04 name:freebsd version:12.4]) (push) Has been cancelled
C/C++ CI / build-openbsd (map[architecture:x86-64 host:ubuntu-22.04 name:openbsd version:7.2]) (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
cppcheck / cppcheck-ubuntu (push) Has been cancelled
cppcheck / cppcheck-windows (push) Has been cancelled
Microsoft C++ Code Analysis / Analyze (push) Has been cancelled
Sync test / sync-test-ubuntu-tsan (push) Has been cancelled
Sync test / sync-test-ubuntu-msan (push) Has been cancelled
Sync test / sync-test-ubuntu-ubsan (push) Has been cancelled
Sync test / sync-test-ubuntu-asan (push) Has been cancelled
Sync test / sync-test-macos (push) Has been cancelled
Sync test / sync-test-windows-debug-asan (push) Has been cancelled
2023-05-31 18:11:01 +02:00
SChernykh ee16ce10c1 Tweaked block_seen logic 2023-05-31 17:03:45 +02:00
SChernykh 3988a69946 Added MacOS aarch64 build 2023-05-31 10:42:24 +02:00
SChernykh 738b2e416e ZMQ: log internal listening port 2023-05-30 12:58:03 +02:00
SChernykh b96dfa602b ZMQ: use random port for internal use 2023-05-29 14:37:20 +02:00
SChernykh 9d6f232dd1 Tweaked block_seen logic 2023-05-29 14:13:11 +02:00
SChernykh d808ba6cbf Fixed --rpc-login 2023-05-27 10:52:53 +02:00
SChernykh 818fab8909 Build curl with cmake 2023-05-27 09:21:18 +02:00
SChernykh 1ffaf3a292 Recompiled curl lib for MSVC using cmake 2023-05-26 19:25:18 +02:00
SChernykh 8e11c3dffd Updated libuv 2023-05-26 18:52:49 +02:00
SChernykh a7496dbc02 Updated tests 2023-05-26 15:21:40 +02:00
SChernykh 9e439044de Update rapidjson 2023-05-26 13:25:03 +02:00
SChernykh 536552b9db Update RandomX 2023-05-26 12:50:10 +02:00
SChernykh 183bab110e Refactored log writer 2023-05-26 11:19:39 +02:00
SChernykh beea3e2184 Fixed cppcheck error 2023-05-26 07:48:38 +02:00
SChernykh e0a3add5f2 Refactored is_localhost() 2023-05-26 00:02:15 +02:00
SChernykh fd8e5e4eed Create libcxx_msan.yml 2023-05-25 18:42:03 +02:00
SChernykh 6f7139fe28 CI: added address sanitizer to test sync 2023-05-25 13:11:29 +02:00
SChernykh 57d996491e Update test-sync.yml 2023-05-25 12:08:22 +02:00
SChernykh ba8e0578ed Fixed data race 2023-05-25 11:34:42 +02:00
SChernykh 65b267c497 CI: run cppcheck every day 2023-05-25 11:16:22 +02:00
SChernykh 512064de61 CI: run sync test every 3 hours 2023-05-25 10:29:38 +02:00
SChernykh 2cdb8b5323 P2PServer: fixed use after free on shutdown 2023-05-25 10:11:24 +02:00
SChernykh d08ac60fd9 CI: set difficulties for fake stratum clients
Client 1: autodiff
Client 2: fixed 1000 diff
Client 3: fixed 10M diff
2023-05-25 09:44:44 +02:00
SChernykh fbc0159453 Added UB sanitizer 2023-05-25 09:02:47 +02:00
SChernykh 3d526cebbc Enabled MemorySanitizer 2023-05-25 07:32:33 +02:00
SChernykh 2d10a6a270 CI: added test sync with clang's memory sanitizer 2023-05-24 15:13:37 +02:00
SChernykh 5f7ce28682 TCPServer: fixed send callback arguments 2023-05-24 13:46:05 +02:00
SChernykh 9d0f835186 Update includes.txt 2023-05-24 11:12:13 +02:00
SChernykh 3fdadf3eb5 Fixed cppcheck errors 2023-05-23 20:11:00 +02:00
SChernykh cd57ab6ad9 Fixed UV_THREADPOOL_SIZE setting
putenv can't use stack buffer
2023-05-23 19:14:15 +02:00
SChernykh eab8a51bb7 SideChain: tweaked m_seenBlocks cleanup logic 2023-05-22 15:30:57 +02:00
SChernykh dbb4efb98a Added version console command 2023-05-20 15:51:36 +02:00
SChernykh a83d6deec1 Check node ping at startup 2023-05-18 10:33:27 +02:00
SChernykh f212de64f5 P2PServer: fixed peer list request logic 2023-05-18 09:39:04 +02:00
SChernykh 6a4583f758 Sync test: keep running for 2 minutes more 2023-05-18 00:28:49 +02:00
SChernykh 325f2dc22f Sync test: run with TSAN on Ubuntu 2023-05-17 23:06:54 +02:00
SChernykh 7134187dc9 Sync test: added stratum connections 2023-05-17 20:35:51 +02:00
SChernykh b20db0a117 P2PServer: always send peer list request to new peers 2023-05-17 11:13:25 +02:00
SChernykh 3c7fcf65a9 Fixed DNS TXT parsing 2023-05-12 15:41:02 +02:00
SChernykh 4fa344a0f7 Refactored DNS TXT resolver code 2023-05-12 10:37:58 +02:00
SChernykh 9aa748e628 Fixed FreeBSD build 2023-05-11 10:32:37 +02:00
SChernykh bba4f8d0c5 Fixed headers for res_query 2023-05-11 09:21:10 +02:00
SChernykh be8b38e5cf Changed BLOCK_FOUND wording 2023-05-11 08:07:05 +02:00
SChernykh db9e5ba332 P2PServer: prefer DNS TXT records to load seed nodes 2023-05-10 22:07:35 +02:00
SChernykh 689fa14cfd Fixed cppcheck errors 2023-05-10 10:35:23 +02:00
SChernykh fa924171c7 Statistics webserver: added missing Stratum data 2023-05-10 10:02:17 +02:00
SChernykh 8a222d5e75 TCPServer: check if loop thread is running before waiting for it 2023-05-01 20:13:57 +02:00
48 changed files with 822 additions and 236 deletions
+70 -16
View File
@@ -63,7 +63,7 @@ jobs:
run: |
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install -y git build-essential cmake autoconf libgss-dev gcc-12 g++-12
sudo apt install -y git build-essential cmake libgss-dev gcc-12 g++-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 --slave /usr/bin/g++ g++ /usr/bin/g++-12 --slave /usr/bin/gcov gcov /usr/bin/gcov-12
- name: Checkout repository
@@ -74,9 +74,9 @@ jobs:
- name: Build libcurl
run: |
cd external/src/curl
autoreconf -fi
./configure CFLAGS='-Os' --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
cmake . -DCMAKE_C_FLAGS="-Os" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
@@ -136,7 +136,7 @@ jobs:
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y git build-essential cmake autoconf gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
sudo apt install -y git build-essential cmake gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
- name: Checkout repository
uses: actions/checkout@v3
@@ -146,9 +146,9 @@ jobs:
- name: Build libcurl
run: |
cd external/src/curl
autoreconf -fi
./configure --host=aarch64-linux-gnu CFLAGS='-Os' --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
cmake . -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_C_FLAGS="-Os" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
@@ -198,14 +198,14 @@ jobs:
uses: eine/setup-msys2@v2
with:
update: true
install: mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake make autoconf libtool automake
install: mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake make
- name: Build libcurl
run: |
cd external/src/curl
autoreconf -fi
./configure CFLAGS='-Os' --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
cmake . -G "Unix Makefiles" -DCMAKE_C_FLAGS="-Os" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
@@ -314,14 +314,14 @@ jobs:
submodules: recursive
- name: Install dependencies
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake autoconf libtool automake
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake
- name: Build libcurl
run: |
cd external/src/curl
autoreconf -fi
./configure CFLAGS='-Os' --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
cmake . -DCMAKE_C_FLAGS="-Os" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j3
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
@@ -366,6 +366,60 @@ jobs:
name: p2pool-${{ matrix.os }}
path: build/p2pool
build-macos-aarch64:
timeout-minutes: 15
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-11, macos-12]
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive
- name: Install dependencies
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_C_FLAGS='-Os -target arm64-apple-${{ matrix.os }}' -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j3
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_C_FLAGS='-Os -target arm64-apple-${{ matrix.os }}' -DBUILD_TESTING=OFF
make -j3
- name: Build libzmq
run: |
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_C_FLAGS='-Os -target arm64-apple-${{ matrix.os }}' -DCMAKE_CXX_FLAGS='-Os -target arm64-apple-${{ matrix.os }}' -DWITH_TLS=OFF -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DWITH_PERF_TOOL=OFF
make -j3
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_C_FLAGS='-target arm64-apple-${{ matrix.os }}' -DCMAKE_CXX_FLAGS='-target arm64-apple-${{ matrix.os }}' -DSTATIC_BINARY=ON -DARCH_ID=aarch64
make -j3
- name: Archive binary
uses: actions/upload-artifact@v3
with:
name: p2pool-${{ matrix.os }}-aarch64
path: build/p2pool
build-freebsd:
timeout-minutes: 75
@@ -393,12 +447,12 @@ jobs:
version: ${{ matrix.os.version }}
shell: bash
run: |
sudo pkg install -y cmake autoconf automake libtool
sudo pkg install -y cmake
cd external/src/curl
autoreconf -fi
./configure CFLAGS='-Os' --without-ssl --without-hyper --without-zlib --without-brotli --without-zstd --without-default-ssl-backend --without-ca-bundle --without-ca-path --without-ca-fallback --without-libpsl --without-libgsasl --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-ngtcp2 --without-nghttp3 --without-quiche --without-msh3 --without-zsh-functions-dir --without-fish-functions-dir --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-mqtt --disable-manual --disable-ntlm --disable-ntlm-wb --disable-tls-srp --disable-unix-sockets --disable-cookies --disable-socketpair --disable-doh --disable-dateparse --disable-netrc --disable-progress-meter --disable-dnsshuffle --disable-hsts --disable-alt-svc --disable-ares
cmake . -DCMAKE_C_FLAGS="-Os" -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j2
cd ../libuv
cd lib && mkdir .libs && cp libcurl.a .libs
cd ../../libuv
mkdir build
cd build
cmake .. -DCMAKE_C_FLAGS='-Os' -DBUILD_TESTING=OFF
+5 -1
View File
@@ -1,6 +1,10 @@
name: cppcheck
on: [push, pull_request]
on:
push:
pull_request:
schedule:
- cron: '57 0 * * *'
jobs:
cppcheck-ubuntu:
+36
View File
@@ -0,0 +1,36 @@
name: Build libc++ for MemorySanitizer
on: [workflow_dispatch]
jobs:
build-libcxx_msan:
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y git cmake ninja-build
- name: Install clang
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 16
- name: Build libcxx_msan
run: |
git clone --depth=1 https://github.com/llvm/llvm-project -b release/16.x
cd llvm-project
mkdir build
cmake -G Ninja -S runtimes -B build -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16 -DLLVM_USE_SANITIZER=MemoryWithOrigins
ninja -C build cxx cxxabi
cd build
XZ_OPT=-e9 tar cfJ libcxx_msan.tar.xz include lib
- name: Archive libcxx_msan.tar.xz
uses: actions/upload-artifact@v3
with:
name: libcxx_msan
path: llvm-project/build/libcxx_msan.tar.xz
+192 -15
View File
@@ -1,9 +1,13 @@
name: Sync test
on: [push, pull_request]
on:
push:
pull_request:
schedule:
- cron: '17 0/3 * * *'
jobs:
sync-test-ubuntu:
sync-test-ubuntu-tsan:
timeout-minutes: 30
runs-on: ubuntu-22.04
@@ -24,23 +28,190 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DDEV_TEST_SYNC=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_TSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12
make -j$(nproc)
- name: Run p2pool
timeout-minutes: 15
timeout-minutes: 25
run: |
cd build
mkdir data
./p2pool --host p2pmd.xmrvsbeast.com --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --no-cache --data-api data --local-api --loglevel 6
python ../tests/src/stratum_dummy.py 1 &
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
TSAN_OPTIONS="suppressions=../tests/src/tsan_sup.txt halt_on_error=1" ./p2pool --host xmrnode.facspro.net --rpc-port 18089 --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6
grep 'Synchronization finished successfully' p2pool.log
- name: Archive p2pool.log
uses: actions/upload-artifact@v3
with:
name: p2pool_ubuntu_data
name: p2pool_ubuntu_data_tsan
path: |
build/p2pool.log
build/*.log
build/data/
sync-test-ubuntu-msan:
timeout-minutes: 30
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libsodium-dev libpgm-dev libnorm-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev
- name: Install clang
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 16
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: true
- name: Install libcxx_msan
run: |
mkdir /tmp/libcxx_msan
cp tests/src/libcxx_msan.tar.xz /tmp/libcxx_msan
cd /tmp/libcxx_msan
tar xvf libcxx_msan.tar.xz
- name: Build libcurl
run: |
cd external/src/curl
cmake . -DCMAKE_C_COMPILER=clang-16 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Os -fno-omit-frame-pointer -g' -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF -DCURL_ZLIB=OFF -DCURL_DISABLE_ALTSVC=ON -DCURL_DISABLE_COOKIES=ON -DCURL_DISABLE_DOH=ON -DCURL_DISABLE_GETOPTIONS=ON -DCURL_DISABLE_HSTS=ON -DCURL_DISABLE_LIBCURL_OPTION=ON -DCURL_DISABLE_MIME=ON -DCURL_DISABLE_NETRC=ON -DCURL_DISABLE_NTLM=ON -DCURL_DISABLE_PARSEDATE=ON -DCURL_DISABLE_PROGRESS_METER=ON -DCURL_DISABLE_SHUFFLE_DNS=ON -DCURL_DISABLE_SOCKETPAIR=ON -DCURL_DISABLE_VERBOSE_STRINGS=ON -DHTTP_ONLY=ON -DCURL_ENABLE_SSL=OFF -DUSE_LIBIDN2=OFF -DCURL_USE_LIBPSL=OFF -DCURL_USE_LIBSSH2=OFF -DENABLE_UNIX_SOCKETS=OFF
make -j$(nproc)
cd lib && mkdir .libs && cp libcurl.a .libs
- name: Build libuv
run: |
cd external/src/libuv
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=clang-16 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Os -fno-omit-frame-pointer -g' -DBUILD_TESTING=OFF
make -j$(nproc)
- name: Build libzmq
run: |
cd external/src/libzmq
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Os -fno-omit-frame-pointer -g' -DCMAKE_CXX_FLAGS='-nostdinc++ -nostdlib++ -fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -Os -fno-omit-frame-pointer -g -isystem /tmp/libcxx_msan/include/c++/v1 -L/tmp/libcxx_msan/lib -lc++ -lc++abi -Wno-unused-command-line-argument' -DWITH_TLS=OFF -DWITH_LIBSODIUM=OFF -DWITH_LIBBSD=OFF -DBUILD_TESTS=OFF -DWITH_DOCS=OFF -DENABLE_DRAFTS=OFF -DWITH_PERF_TOOL=OFF
make -j$(nproc)
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16 -DCMAKE_C_FLAGS='-fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -fno-omit-frame-pointer -g' -DCMAKE_CXX_FLAGS='-nostdinc++ -nostdlib++ -fsanitize=memory -fsanitize-recover -fsanitize-memory-track-origins -isystem /tmp/libcxx_msan/include/c++/v1 -L/tmp/libcxx_msan/lib -Wl,-rpath /tmp/libcxx_msan/lib -lc++ -lc++abi -Wno-unused-command-line-argument -fuse-ld=lld-16 -fno-omit-frame-pointer -g' -DDEV_TEST_SYNC=ON -DDEV_WITH_MSAN=ON -DSTATIC_LIBS=ON
make -j$(nproc)
- name: Run p2pool
timeout-minutes: 20
run: |
cd build
mkdir data
python ../tests/src/stratum_dummy.py 1 &
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
MSAN_OPTIONS="halt_on_error=1" ./p2pool --host xmrnode.facspro.net --rpc-port 18089 --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6
grep 'Synchronization finished successfully' p2pool.log
- name: Archive p2pool.log
uses: actions/upload-artifact@v3
with:
name: p2pool_ubuntu_data_msan
path: |
build/*.log
build/data/
sync-test-ubuntu-ubsan:
timeout-minutes: 30
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libsodium-dev libpgm-dev libnorm-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev gcc-12 g++-12
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: true
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_UBSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12
make -j$(nproc)
- name: Run p2pool
timeout-minutes: 20
run: |
cd build
mkdir data
python ../tests/src/stratum_dummy.py 1 &
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
UBSAN_OPTIONS="suppressions=../tests/src/ubsan_sup.txt halt_on_error=1" ./p2pool --host xmrnode.facspro.net --rpc-port 18089 --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6
grep 'Synchronization finished successfully' p2pool.log
- name: Archive p2pool.log
uses: actions/upload-artifact@v3
with:
name: p2pool_ubuntu_data_ubsan
path: |
build/*.log
build/data/
sync-test-ubuntu-asan:
timeout-minutes: 30
runs-on: ubuntu-22.04
steps:
- name: Install dependencies
run: |
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install -y git build-essential cmake libuv1-dev libzmq3-dev libsodium-dev libpgm-dev libnorm-dev libgss-dev libcurl4-openssl-dev libidn2-0-dev gcc-12 g++-12
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: true
- name: Build p2pool
run: |
mkdir build
cd build
cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_ASAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12
make -j$(nproc)
- name: Run p2pool
timeout-minutes: 20
run: |
cd build
mkdir data
python ../tests/src/stratum_dummy.py 1 &
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
ASAN_OPTIONS="detect_stack_use_after_return=1 atexit=1" ./p2pool --host xmrnode.facspro.net --rpc-port 18089 --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6
grep 'Synchronization finished successfully' p2pool.log
- name: Archive p2pool.log
uses: actions/upload-artifact@v3
with:
name: p2pool_ubuntu_data_asan
path: |
build/*.log
build/data/
sync-test-macos:
@@ -65,11 +236,14 @@ jobs:
make -j3
- name: Run p2pool
timeout-minutes: 15
timeout-minutes: 20
run: |
cd build
mkdir data
./p2pool --host p2pmd.xmrvsbeast.com --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --no-cache --data-api data --local-api --loglevel 6
python ../tests/src/stratum_dummy.py 1 &
python ../tests/src/stratum_dummy.py 2 &
python ../tests/src/stratum_dummy.py 3 &
./p2pool --host xmrnode.facspro.net --rpc-port 18089 --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6
grep 'Synchronization finished successfully' p2pool.log
- name: Archive p2pool.log
@@ -77,10 +251,10 @@ jobs:
with:
name: p2pool_macos_data
path: |
build/p2pool.log
build/*.log
build/data/
sync-test-windows:
sync-test-windows-debug-asan:
timeout-minutes: 30
runs-on: windows-2022
@@ -102,17 +276,20 @@ jobs:
& "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\Msbuild\\Current\\Bin\\amd64\\msbuild" /m /p:Configuration=Debug p2pool.vcxproj
- name: Run p2pool
timeout-minutes: 15
timeout-minutes: 20
run: |
cd build/Debug
mkdir data
./p2pool.exe --host p2pmd.xmrvsbeast.com --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --no-cache --data-api data --local-api --loglevel 6
Start-Process python -ArgumentList "../../tests/src/stratum_dummy.py 1"
Start-Process python -ArgumentList "../../tests/src/stratum_dummy.py 2"
Start-Process python -ArgumentList "../../tests/src/stratum_dummy.py 3"
./p2pool.exe --host xmrnode.facspro.net --rpc-port 18089 --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6
findstr /C:"Synchronization finished successfully" p2pool.log
- name: Archive p2pool.log
uses: actions/upload-artifact@v3
with:
name: p2pool_windows_data
name: p2pool_windows_data_debug_asan
path: |
build/Debug/p2pool.log
build/Debug/*.log
build/Debug/data/
+100 -12
View File
@@ -8,6 +8,10 @@ option(WITH_LTO "Use link-time compiler optimization (if linking fails for you,
option(WITH_UPNP "Include UPnP support. If this is turned off, p2pool will not be able to configure port forwarding on UPnP-enabled routers." ON)
option(DEV_TEST_SYNC "[Developer only] Sync test, stop p2pool after sync is complete" OFF)
option(DEV_WITH_TSAN "[Developer only] Compile with thread sanitizer" OFF)
option(DEV_WITH_MSAN "[Developer only] Compile with memory sanitizer" OFF)
option(DEV_WITH_UBSAN "[Developer only] Compile with undefined behavior sanitizer" OFF)
option(DEV_WITH_ASAN "[Developer only] Compile with address sanitizer" OFF)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
@@ -31,6 +35,22 @@ if (DEV_TEST_SYNC)
add_definitions(-DDEV_TEST_SYNC)
endif()
if (DEV_WITH_TSAN)
add_definitions(-DDEV_WITH_TSAN)
endif()
if (DEV_WITH_MSAN)
add_definitions(-DDEV_WITH_MSAN)
endif()
if (DEV_WITH_UBSAN)
add_definitions(-DDEV_WITH_UBSAN)
endif()
if (DEV_WITH_ASAN)
add_definitions(-DDEV_WITH_ASAN)
endif()
include(cmake/flags.cmake)
set(HEADERS
@@ -129,7 +149,7 @@ if (WITH_UPNP)
endif()
if (WIN32)
set(LIBS ${LIBS} ws2_32 iphlpapi userenv psapi)
set(LIBS ${LIBS} ws2_32 iphlpapi userenv psapi dnsapi dbghelp)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(LIBS ${LIBS} bcrypt)
endif()
@@ -143,9 +163,9 @@ endif()
if (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
find_library(ZMQ_LIBRARY_DEBUG NAMES libzmq-v142-mt-sgd-4_3_5 PATHS "external/lib/libzmq/Debug")
find_library(ZMQ_LIBRARY NAMES libzmq-v142-mt-s-4_3_5 PATHS "external/lib/libzmq/Release")
find_library(UV_LIBRARY_DEBUG NAMES uv_a PATHS "external/lib/libuv/Debug")
find_library(UV_LIBRARY NAMES uv_a PATHS "external/lib/libuv/Release")
find_library(CURL_LIBRARY_DEBUG NAMES libcurld PATHS "external/lib/libcurl/Debug")
find_library(UV_LIBRARY_DEBUG NAMES libuv PATHS "external/lib/libuv/Debug")
find_library(UV_LIBRARY NAMES libuv PATHS "external/lib/libuv/Release")
find_library(CURL_LIBRARY_DEBUG NAMES libcurl-d PATHS "external/lib/libcurl/Debug")
find_library(CURL_LIBRARY NAMES libcurl PATHS "external/lib/libcurl/Release")
add_definitions(-D_DISABLE_VECTOR_ANNOTATION)
add_definitions(-D_DISABLE_STRING_ANNOTATION)
@@ -193,14 +213,69 @@ endif()
add_definitions(/DZMQ_STATIC)
set(CMAKE_REQUIRED_FLAGS "${GENERAL_FLAGS}")
include(CheckCXXSourceCompiles)
check_cxx_source_compiles("int main(){ return __builtin_clzll(1);}" HAVE_BUILTIN_CLZLL)
check_cxx_source_compiles("#include <intrin.h>\n#pragma intrinsic(_BitScanReverse64)\nint main(){unsigned long r;_BitScanReverse64(&r,1);return r;}" HAVE_BITSCANREVERSE64)
check_cxx_source_compiles("#include <sched.h>\nint main(){sched_param param;return sched_setscheduler(0, SCHED_IDLE, &param);}" HAVE_SCHED)
include(CheckCSourceCompiles)
set(CMAKE_REQUIRED_LIBRARIES "resolv")
check_c_source_compiles("int main() { return 0; }" HAVE_RESOLV_LIB)
if (NOT HAVE_RESOLV_LIB)
set(CMAKE_REQUIRED_LIBRARIES)
endif()
check_c_source_compiles("
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <stdio.h>
#include <memory.h>
int main(int argc, char* argv[])
{
if (argc < 2) {
return 1;
}
res_init();
uint8_t answer[4096];
const int anslen = res_query(argv[1], ns_c_in, ns_t_txt, answer, sizeof(answer));
if (anslen > (int) sizeof(answer)) {
return 1;
}
ns_msg handle;
ns_initparse(answer, anslen, &handle);
for (int rrnum = 0, n = ns_msg_count(handle, ns_s_an); rrnum < n; ++rrnum) {
ns_rr rr;
if ((ns_parserr(&handle, ns_s_an, rrnum, &rr) == 0) && (ns_rr_type(rr) == ns_t_txt)) {
for (const uint8_t* data = ns_rr_rdata(rr), *e = data + ns_rr_rdlen(rr); data < e;) {
const int k = *(data++);
if (k && (data + k <= e)) {
char buf[256];
memcpy(buf, data, k);
buf[k] = 0;
puts(buf);
}
data += k;
}
}
}
return 0;
}" HAVE_RES_QUERY)
set(CMAKE_REQUIRED_LIBRARIES)
if (HAVE_BUILTIN_CLZLL)
add_definitions(/DHAVE_BUILTIN_CLZLL)
endif()
@@ -213,13 +288,22 @@ if (HAVE_SCHED)
add_definitions(/DHAVE_SCHED)
endif()
if (HAVE_RES_QUERY)
add_definitions(/DHAVE_RES_QUERY)
if (HAVE_RESOLV_LIB)
set(LIBS ${LIBS} resolv)
endif()
endif()
add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES})
if (STATIC_BINARY OR STATIC_LIBS)
if (WIN32)
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} "${CMAKE_PROJECT_NAME}.exe")
else()
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} ${CMAKE_PROJECT_NAME})
if (NOT (DEV_WITH_TSAN OR DEV_WITH_MSAN OR DEV_WITH_UBSAN OR DEV_WITH_ASAN))
if (WIN32)
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} "${CMAKE_PROJECT_NAME}.exe")
else()
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} ${CMAKE_PROJECT_NAME})
endif()
endif()
if (WITH_RANDOMX)
@@ -231,7 +315,7 @@ if (STATIC_BINARY OR STATIC_LIBS)
endif()
if (WIN32)
set(STATIC_LIBS ${STATIC_LIBS} ws2_32 iphlpapi userenv psapi wldap32)
set(STATIC_LIBS ${STATIC_LIBS} ws2_32 iphlpapi userenv psapi dnsapi dbghelp)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(STATIC_LIBS ${STATIC_LIBS} bcrypt)
endif()
@@ -246,9 +330,13 @@ if (STATIC_BINARY OR STATIC_LIBS)
set(STATIC_LIBS ${STATIC_LIBS} pthread)
endif()
if (HAVE_RES_QUERY AND HAVE_RESOLV_LIB)
set(STATIC_LIBS ${STATIC_LIBS} resolv)
endif()
target_link_libraries(${CMAKE_PROJECT_NAME}
"${CMAKE_SOURCE_DIR}/external/src/libzmq/build/lib/libzmq.a"
"${CMAKE_SOURCE_DIR}/external/src/libuv/build/libuv_a.a"
"${CMAKE_SOURCE_DIR}/external/src/libuv/build/libuv.a"
"${CMAKE_SOURCE_DIR}/external/src/curl/lib/.libs/libcurl.a"
${STATIC_LIBS}
)
+23 -2
View File
@@ -7,8 +7,26 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(GENERAL_FLAGS "-pthread")
if (DEV_WITH_TSAN)
set(GENERAL_FLAGS "${GENERAL_FLAGS} -fno-omit-frame-pointer -fsanitize=thread")
endif()
if (DEV_WITH_UBSAN)
set(GENERAL_FLAGS "${GENERAL_FLAGS} -fno-omit-frame-pointer -fsanitize=undefined")
endif()
if (DEV_WITH_ASAN)
set(GENERAL_FLAGS "${GENERAL_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
endif()
set(WARNING_FLAGS "-Wall -Wextra -Wcast-align -Wcast-qual -Wlogical-op -Wstrict-overflow=2 -Wundef -Wformat=2 -Wpointer-arith -Werror")
set(OPTIMIZATION_FLAGS "-Ofast -s")
if (DEV_WITH_TSAN OR DEV_WITH_UBSAN OR DEV_WITH_ASAN)
set(OPTIMIZATION_FLAGS "-O2 -g")
else()
set(OPTIMIZATION_FLAGS "-Ofast -s")
endif()
if (WITH_LTO)
set(OPTIMIZATION_FLAGS "${OPTIMIZATION_FLAGS} -flto -fuse-linker-plugin")
@@ -52,7 +70,10 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
elseif (CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(GENERAL_FLAGS "-pthread")
set(WARNING_FLAGS "-Wall -Wextra -Wno-undefined-internal -Wunreachable-code-aggressive -Wmissing-prototypes -Wmissing-variable-declarations -Werror")
set(OPTIMIZATION_FLAGS "-Ofast -funroll-loops -fmerge-all-constants")
if (NOT DEV_WITH_MSAN)
set(OPTIMIZATION_FLAGS "-Ofast -funroll-loops -fmerge-all-constants")
endif()
if (WITH_LTO)
set(OPTIMIZATION_FLAGS "${OPTIMIZATION_FLAGS} -flto")
+1
View File
@@ -8,3 +8,4 @@
../external/src/RandomX/src/
../external/src/rapidjson/include
../external/src/robin-hood-hashing/src/include
../external/src/miniupnp/miniupnpc/include
@@ -40,6 +40,10 @@
<td>Shares Found</td>
<td>{{ local_stats["shares_found"] }}</td>
</tr>
<tr>
<td>Shares Failed</td>
<td>{{ local_stats["shares_failed"] }}</td>
</tr>
<tr>
<td>Current Effort</td>
<td>{{ local_stats["current_effort"] }}%</td>
@@ -56,6 +60,10 @@
<td>Miner Connections</td>
<td>{{ local_stats["incoming_connections"] }}</td>
</tr>
<tr>
<td>Block reward share</td>
<td>{{ local_stats["block_reward_share_percent"] }}%</td>
</tr>
</tbody>
</table>
</div>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1325,7 +1325,7 @@ bool BlockTemplate::submit_sidechain_block(uint32_t template_id, uint32_t nonce,
}
m_poolBlockTemplate->m_verified = true;
if (!m_sidechain->block_seen(*m_poolBlockTemplate)) {
if (!m_sidechain->incoming_block_seen(*m_poolBlockTemplate)) {
m_poolBlockTemplate->m_wantBroadcast = true;
const bool result = m_sidechain->add_block(*m_poolBlockTemplate);
if (!result) {
+5 -11
View File
@@ -436,19 +436,13 @@ struct raw_ip
FORCEINLINE bool operator!=(const raw_ip& other) const { return !operator==(other); }
FORCEINLINE bool is_localhost() const
{
static constexpr raw_ip localhost_ipv4 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 };
static constexpr raw_ip localhost_ipv6 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
FORCEINLINE bool is_localhost() const { return (*this == localhost_ipv4) || (*this == localhost_ipv6); }
FORCEINLINE bool is_ipv4_prefix() const { return memcmp(data, ipv4_prefix, sizeof(ipv4_prefix)) == 0; }
return (*this == localhost_ipv4) || (*this == localhost_ipv6);
}
static const raw_ip localhost_ipv4;
static const raw_ip localhost_ipv6;
FORCEINLINE bool is_ipv4_prefix() const
{
alignas(8) static constexpr uint8_t ipv4_prefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff };
return memcmp(data, ipv4_prefix, sizeof(ipv4_prefix)) == 0;
}
alignas(8) static const uint8_t ipv4_prefix[12];
};
static_assert(sizeof(raw_ip) == 16, "struct raw_ip has invalid size");
+14 -1
View File
@@ -140,7 +140,7 @@ typedef struct cmd {
cmdfunc *func;
} cmd;
static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_showpeers, do_showworkers, do_showbans, do_outpeers, do_inpeers, do_exit;
static cmdfunc do_help, do_status, do_loglevel, do_addpeers, do_droppeers, do_showpeers, do_showworkers, do_showbans, do_outpeers, do_inpeers, do_exit, do_version;
#ifdef WITH_RANDOMX
static cmdfunc do_start_mining, do_stop_mining;
@@ -162,6 +162,7 @@ static cmd cmds[] = {
{ STRCONST("stop_mining"), "", "stop mining", do_stop_mining },
#endif
{ STRCONST("exit"), "", "terminate p2pool", do_exit },
{ STRCONST("version"), "", "show p2pool version", do_version },
{ STRCNULL, NULL, NULL, NULL }
};
@@ -196,6 +197,7 @@ static void do_loglevel(p2pool * /* m_pool */, const char *args)
LOGINFO(0, "log level set to " << level);
}
// cppcheck-suppress constParameterCallback
static void do_addpeers(p2pool *m_pool, const char *args)
{
if (m_pool->p2p_server()) {
@@ -203,6 +205,7 @@ static void do_addpeers(p2pool *m_pool, const char *args)
}
}
// cppcheck-suppress constParameterCallback
static void do_droppeers(p2pool *m_pool, const char * /* args */)
{
if (m_pool->p2p_server()) {
@@ -210,6 +213,7 @@ static void do_droppeers(p2pool *m_pool, const char * /* args */)
}
}
// cppcheck-suppress constParameterCallback
static void do_showpeers(p2pool* m_pool, const char* /* args */)
{
if (m_pool->p2p_server()) {
@@ -217,6 +221,7 @@ static void do_showpeers(p2pool* m_pool, const char* /* args */)
}
}
// cppcheck-suppress constParameterCallback
static void do_showworkers(p2pool* m_pool, const char* /* args */)
{
if (m_pool->stratum_server()) {
@@ -224,6 +229,7 @@ static void do_showworkers(p2pool* m_pool, const char* /* args */)
}
}
// cppcheck-suppress constParameterCallback
static void do_showbans(p2pool* m_pool, const char* /* args */)
{
if (m_pool->stratum_server()) {
@@ -234,6 +240,7 @@ static void do_showbans(p2pool* m_pool, const char* /* args */)
}
}
// cppcheck-suppress constParameterCallback
static void do_outpeers(p2pool* m_pool, const char* args)
{
if (m_pool->p2p_server()) {
@@ -242,6 +249,7 @@ static void do_outpeers(p2pool* m_pool, const char* args)
}
}
// cppcheck-suppress constParameterCallback
static void do_inpeers(p2pool* m_pool, const char* args)
{
if (m_pool->p2p_server()) {
@@ -270,6 +278,11 @@ static void do_exit(p2pool *m_pool, const char * /* args */)
m_pool->stop();
}
static void do_version(p2pool* /* m_pool */, const char* /* args */)
{
LOGINFO(0, log::LightCyan() << VERSION);
}
void ConsoleCommands::allocCallback(uv_handle_t* handle, size_t /*suggested_size*/, uv_buf_t* buf)
{
ConsoleCommands* pThis = static_cast<ConsoleCommands*>(handle->data);
+4
View File
@@ -174,7 +174,11 @@ CurlContext::CurlContext(const std::string& address, int port, const std::string
curl_easy_setopt_checked(m_handle, CURLOPT_WRITEFUNCTION, write_func);
curl_easy_setopt_checked(m_handle, CURLOPT_WRITEDATA, this);
#ifdef DEV_TEST_SYNC
const int timeout = 10;
#else
const int timeout = proxy.empty() ? 1 : 5;
#endif
curl_easy_setopt_checked(m_handle, CURLOPT_URL, m_url.c_str());
curl_easy_setopt_checked(m_handle, CURLOPT_POSTFIELDS, m_req.c_str());
+37 -47
View File
@@ -154,7 +154,9 @@ public:
memcpy(p + 1, buf + 1, size - 1);
// Ensure memory order in the writer thread
#ifndef DEV_WITH_TSAN
std::atomic_thread_fence(std::memory_order_seq_cst);
#endif
// Mark that everything is written into this log slot
p[0] = buf[0] + 1;
@@ -172,7 +174,7 @@ private:
const uint32_t N = std::min(std::max(std::thread::hardware_concurrency(), 4U), 8U);
char buf[40] = {};
static char buf[40] = {};
log::Stream s(buf);
s << "UV_THREADPOOL_SIZE=" << N << '\0';
@@ -221,7 +223,9 @@ private:
}
// Ensure memory order in the reader thread
#ifndef DEV_WITH_TSAN
std::atomic_thread_fence(std::memory_order_seq_cst);
#endif
uint32_t size = static_cast<uint8_t>(p[2]);
size = (size << 8) + static_cast<uint8_t>(p[1]);
@@ -286,9 +290,9 @@ private:
static FORCEINLINE void strip_colors(char* buf, uint32_t& size)
{
char* p_read = buf;
const char* p_read = buf;
char* p_write = buf;
char* buf_end = buf + size;
const char* buf_end = buf + size;
bool is_color = false;
@@ -329,6 +333,31 @@ static Worker worker;
#endif // P2POOL_LOG_DISABLE
static FORCEINLINE void writeCurrentTime(Stream& s)
{
using namespace std::chrono;
const system_clock::time_point now = system_clock::now();
const time_t t0 = system_clock::to_time_t(now);
tm t;
#ifdef _WIN32
gmtime_s(&t, &t0);
#else
gmtime_r(&t0, &t);
#endif
s.setNumberWidth(2);
s << (t.tm_year + 1900) << '-' << (t.tm_mon + 1) << '-' << t.tm_mday << ' ' << t.tm_hour << ':' << t.tm_min << ':' << t.tm_sec << '.';
const int32_t mcs = time_point_cast<microseconds>(now).time_since_epoch().count() % 1000000;
s.setNumberWidth(4);
s << (mcs / 100);
s.setNumberWidth(1);
}
NOINLINE Writer::Writer(Severity severity) : Stream(m_stackBuf)
{
m_stackBuf[BUF_SIZE] = '\0';
@@ -336,7 +365,7 @@ NOINLINE Writer::Writer(Severity severity) : Stream(m_stackBuf)
m_pos = 3;
*this << Cyan();
writeCurrentTime();
writeCurrentTime(*this);
*this << NoColor() << ' ';
}
@@ -364,53 +393,14 @@ void stop()
#endif
}
NOINLINE void Stream::writeCurrentTime()
{
using namespace std::chrono;
const system_clock::time_point now = system_clock::now();
const time_t t0 = system_clock::to_time_t(now);
tm t;
#ifdef _WIN32
gmtime_s(&t, &t0);
#else
gmtime_r(&t0, &t);
#endif
m_numberWidth = 2;
*this << (t.tm_year + 1900) << '-' << (t.tm_mon + 1) << '-' << t.tm_mday << ' ' << t.tm_hour << ':' << t.tm_min << ':' << t.tm_sec << '.';
const int32_t mcs = time_point_cast<microseconds>(now).time_since_epoch().count() % 1000000;
m_numberWidth = 4;
*this << (mcs / 100);
// cppcheck-suppress redundantAssignment
m_numberWidth = 1;
}
NOINLINE void Stream::Entry<raw_ip>::put(const raw_ip& value, Stream* wrapper)
{
const char* addr_str;
const bool is_ipv4 = value.is_ipv4_prefix();
char addr_str_buf[64];
const char* addr_str = inet_ntop(is_ipv4 ? AF_INET : AF_INET6, value.data + (is_ipv4 ? 12 : 0), addr_str_buf, sizeof(addr_str_buf));
static constexpr uint8_t ipv4_prefix[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255 };
const bool is_v6 = (memcmp(value.data, ipv4_prefix, 12) != 0);
if (is_v6) {
addr_str = inet_ntop(AF_INET6, value.data, addr_str_buf, sizeof(addr_str_buf));
}
else {
addr_str = inet_ntop(AF_INET, value.data + 12, addr_str_buf, sizeof(addr_str_buf));
}
if (addr_str) {
*wrapper << addr_str;
}
else {
*wrapper << "N/A";
}
*wrapper << (addr_str ? addr_str : "N/A");
}
NOINLINE void Stream::Entry<Wallet>::put(const Wallet& w, Stream* wrapper)
-2
View File
@@ -105,8 +105,6 @@ struct Stream
FORCEINLINE int getNumberWidth() const { return m_numberWidth; }
FORCEINLINE void setNumberWidth(int width) { m_numberWidth = width; }
NOINLINE void writeCurrentTime();
int m_pos;
int m_numberWidth;
char* m_buf;
+61 -47
View File
@@ -376,7 +376,7 @@ void P2PServer::send_peer_list_request(P2PClient* client, uint64_t cur_time)
client->m_nextOutgoingPeerListRequest = cur_time + (60 + (get_random64() % 61));
const bool result = send(client,
[client](void* buf, size_t buf_size)
[client](uint8_t* buf, size_t buf_size)
{
LOGINFO(6, "sending PEER_LIST_REQUEST to " << static_cast<char*>(client->m_addrString));
@@ -384,7 +384,7 @@ void P2PServer::send_peer_list_request(P2PClient* client, uint64_t cur_time)
return 0;
}
*reinterpret_cast<uint8_t*>(buf) = static_cast<uint8_t>(MessageId::PEER_LIST_REQUEST);
*buf = static_cast<uint8_t>(MessageId::PEER_LIST_REQUEST);
return 1;
});
@@ -486,7 +486,21 @@ void P2PServer::load_peer_list()
// Load peers from seed nodes if we're on the default or mini sidechain
auto load_from_seed_nodes = [&saved_list](const char** nodes, int p2p_port) {
for (size_t i = 0; nodes[i][0]; ++i) {
LOGINFO(4, "loading peers from " << nodes[i]);
const char* cur_node = nodes[i];
LOGINFO(4, "loading peers from " << cur_node);
// Prefer DNS TXT records
const bool has_txt = get_dns_txt_records(cur_node, [&saved_list, cur_node](const char* s, size_t n) {
if (!saved_list.empty()) {
saved_list += ',';
}
LOGINFO(4, "added " << log::const_buf(s, n) << " from " << cur_node);
saved_list.append(s, n);
});
if (has_txt) {
continue;
}
addrinfo hints{};
hints.ai_family = AF_UNSPEC;
@@ -494,11 +508,11 @@ void P2PServer::load_peer_list()
hints.ai_flags = AI_ADDRCONFIG;
addrinfo* result;
int err = getaddrinfo(nodes[i], nullptr, &hints, &result);
int err = getaddrinfo(cur_node, nullptr, &hints, &result);
if (err) {
LOGWARN(4, "getaddrinfo failed for " << nodes[i] << ": " << gai_strerror(err) << ", retrying with IPv4 only");
LOGWARN(4, "getaddrinfo failed for " << cur_node << ": " << gai_strerror(err) << ", retrying with IPv4 only");
hints.ai_family = AF_INET;
err = getaddrinfo(nodes[i], nullptr, &hints, &result);
err = getaddrinfo(cur_node, nullptr, &hints, &result);
}
if (err == 0) {
for (addrinfo* r = result; r != NULL; r = r->ai_next) {
@@ -524,7 +538,7 @@ void P2PServer::load_peer_list()
}
if (s.m_pos) {
LOGINFO(4, "added " << static_cast<const char*>(buf) << " from " << nodes[i]);
LOGINFO(4, "added " << static_cast<const char*>(buf) << " from " << cur_node);
if (!saved_list.empty()) {
saved_list += ',';
}
@@ -534,7 +548,7 @@ void P2PServer::load_peer_list()
freeaddrinfo(result);
}
else {
LOGWARN(3, "getaddrinfo failed for " << nodes[i] << ": " << gai_strerror(err));
LOGWARN(3, "getaddrinfo failed for " << cur_node << ": " << gai_strerror(err));
}
}
};
@@ -699,7 +713,7 @@ void P2PServer::update_peer_in_list(bool is_v6, const raw_ip& ip, int port)
}
}
void P2PServer::remove_peer_from_list(P2PClient* client)
void P2PServer::remove_peer_from_list(const P2PClient* client)
{
MutexLock lock(m_peerListLock);
@@ -864,10 +878,9 @@ void P2PServer::on_broadcast()
}
for (Broadcast* data : broadcast_queue) {
const bool result = send(client, [client, data](void* buf, size_t buf_size) -> size_t
const bool result = send(client, [client, data](uint8_t* buf, size_t buf_size) -> size_t
{
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
bool send_pruned = true;
bool send_compact = (client->m_protocolVersion >= PROTOCOL_VERSION_1_1) && !data->compact_blob.empty() && (data->compact_blob.size() < data->pruned_blob.size());
@@ -921,7 +934,7 @@ void P2PServer::on_broadcast()
}
}
return p - p0;
return p - buf;
});
if (!result) {
LOGWARN(5, "failed to broadcast to " << static_cast<char*>(client->m_addrString) << ", disconnecting");
@@ -1016,6 +1029,10 @@ int P2PServer::deserialize_block(const uint8_t* buf, uint32_t size, bool compact
void P2PServer::on_timer()
{
if (m_pool->stopped()) {
return;
}
++m_timerCounter;
if (!m_initialPeerList.empty()) {
@@ -1124,7 +1141,7 @@ void P2PServer::download_missing_blocks()
}
const bool result = send(client,
[&id, client](void* buf, size_t buf_size) -> size_t
[&id, client](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(5, "sending BLOCK_REQUEST for id = " << id << " to " << static_cast<char*>(client->m_addrString));
@@ -1132,15 +1149,14 @@ void P2PServer::download_missing_blocks()
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
*(p++) = static_cast<uint8_t>(MessageId::BLOCK_REQUEST);
memcpy(p, id.h, HASH_SIZE);
p += HASH_SIZE;
return p - p0;
return p - buf;
});
if (result) {
@@ -1604,7 +1620,7 @@ bool P2PServer::P2PClient::send_handshake_challenge()
m_handshakeChallenge = owner->get_random64();
return owner->send(this,
[this, owner](void* buf, size_t buf_size) -> size_t
[this, owner](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(5, "sending HANDSHAKE_CHALLENGE to " << static_cast<char*>(m_addrString));
@@ -1612,8 +1628,7 @@ bool P2PServer::P2PClient::send_handshake_challenge()
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
*(p++) = static_cast<uint8_t>(MessageId::HANDSHAKE_CHALLENGE);
@@ -1627,7 +1642,7 @@ bool P2PServer::P2PClient::send_handshake_challenge()
memcpy(p, &k, sizeof(uint64_t));
p += sizeof(uint64_t);
return p - p0;
return p - buf;
});
}
@@ -1700,7 +1715,7 @@ void P2PServer::P2PClient::send_handshake_solution(const uint8_t (&challenge)[CH
return;
}
uint64_t* value = reinterpret_cast<uint64_t*>(work->solution.h);
const uint64_t* value = reinterpret_cast<uint64_t*>(work->solution.h);
uint64_t high;
umul128(value[HASH_SIZE / sizeof(uint64_t) - 1], CHALLENGE_DIFFICULTY, &high);
@@ -1728,7 +1743,7 @@ void P2PServer::P2PClient::send_handshake_solution(const uint8_t (&challenge)[CH
}
const bool result = work->server->send(work->client,
[work](void* buf, size_t buf_size) -> size_t
[work](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(5, "sending HANDSHAKE_SOLUTION to " << static_cast<char*>(work->client->m_addrString));
@@ -1736,8 +1751,7 @@ void P2PServer::P2PClient::send_handshake_solution(const uint8_t (&challenge)[CH
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
*(p++) = static_cast<uint8_t>(MessageId::HANDSHAKE_SOLUTION);
@@ -1751,7 +1765,7 @@ void P2PServer::P2PClient::send_handshake_solution(const uint8_t (&challenge)[CH
work->client->on_after_handshake(p);
}
return p - p0;
return p - buf;
});
if (result) {
@@ -1847,7 +1861,7 @@ bool P2PServer::P2PClient::on_handshake_solution(const uint8_t* buf)
// Check that incoming connection provided enough PoW
if (m_isIncoming) {
uint64_t* value = reinterpret_cast<uint64_t*>(solution.h);
const uint64_t* value = reinterpret_cast<uint64_t*>(solution.h);
uint64_t high;
umul128(value[HASH_SIZE / sizeof(uint64_t) - 1], CHALLENGE_DIFFICULTY, &high);
@@ -1875,7 +1889,7 @@ bool P2PServer::P2PClient::on_handshake_solution(const uint8_t* buf)
}
return m_owner->send(this,
[this](void* buf, size_t buf_size) -> size_t
[this](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(5, "sending LISTEN_PORT and BLOCK_REQUEST for the chain tip to " << static_cast<char*>(m_addrString));
@@ -1883,10 +1897,9 @@ bool P2PServer::P2PClient::on_handshake_solution(const uint8_t* buf)
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
on_after_handshake(p);
return p - p0;
return p - buf;
});
}
@@ -1944,7 +1957,7 @@ bool P2PServer::P2PClient::on_block_request(const uint8_t* buf)
}
return server->send(this,
[this, &blob](void* buf, size_t buf_size) -> size_t
[this, &blob](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(5, "sending BLOCK_RESPONSE to " << static_cast<char*>(m_addrString));
@@ -1954,8 +1967,7 @@ bool P2PServer::P2PClient::on_block_request(const uint8_t* buf)
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
*(p++) = static_cast<uint8_t>(MessageId::BLOCK_RESPONSE);
@@ -1967,21 +1979,25 @@ bool P2PServer::P2PClient::on_block_request(const uint8_t* buf)
p += len;
}
return p - p0;
return p - buf;
});
}
bool P2PServer::P2PClient::on_block_response(const uint8_t* buf, uint32_t size, const hash& expected_id)
{
P2PServer* server = static_cast<P2PServer*>(m_owner);
const uint64_t cur_time = seconds_since_epoch();
if (!size) {
LOGINFO(5, "peer " << log::Gray() << static_cast<char*>(m_addrString) << log::NoColor() << " sent an empty block response");
if (expected_id.empty() && (cur_time >= m_nextOutgoingPeerListRequest)) {
server->send_peer_list_request(this, cur_time);
}
return true;
}
const uint64_t received_timestamp = microseconds_since_epoch();
P2PServer* server = static_cast<P2PServer*>(m_owner);
MutexLock lock(server->m_blockLock);
const int result = server->deserialize_block(buf, size, false, received_timestamp);
@@ -2002,7 +2018,6 @@ bool P2PServer::P2PClient::on_block_response(const uint8_t* buf, uint32_t size,
return false;
}
const uint64_t cur_time = seconds_since_epoch();
if (cur_time >= m_nextOutgoingPeerListRequest) {
server->send_peer_list_request(this, cur_time);
}
@@ -2150,7 +2165,7 @@ bool P2PServer::P2PClient::on_peer_list_request(const uint8_t*)
}
return server->send(this,
[this, &peers, num_selected_peers](void* buf, size_t buf_size) -> size_t
[this, &peers, num_selected_peers](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(6, "sending PEER_LIST_RESPONSE to " << static_cast<char*>(m_addrString));
@@ -2158,8 +2173,7 @@ bool P2PServer::P2PClient::on_peer_list_request(const uint8_t*)
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
*(p++) = static_cast<uint8_t>(MessageId::PEER_LIST_RESPONSE);
*(p++) = static_cast<uint8_t>(num_selected_peers);
@@ -2176,7 +2190,7 @@ bool P2PServer::P2PClient::on_peer_list_request(const uint8_t*)
p += 2;
}
return p - p0;
return p - buf;
});
}
@@ -2200,6 +2214,7 @@ void P2PServer::P2PClient::on_peer_list_response(const uint8_t* buf)
buf += 2;
// Treat IPv4-mapped addresses as regular IPv4 addresses
// cppcheck-suppress uninitvar
if (is_v6 && ip.is_ipv4_prefix()) {
is_v6 = false;
}
@@ -2294,7 +2309,7 @@ bool P2PServer::P2PClient::handle_incoming_block_async(const PoolBlock* block, u
}
}
if (side_chain.block_seen(*block)) {
if (side_chain.incoming_block_seen(*block)) {
LOGINFO(6, "block " << block->m_sidechainId << " (nonce " << block->m_nonce << ", extra_nonce " << block->m_extraNonce << ") was received before, skipping it");
return true;
}
@@ -2391,7 +2406,7 @@ void P2PServer::P2PClient::post_handle_incoming_block(const uint32_t reset_count
}
const bool result = server->send(this,
[this, &id](void* buf, size_t buf_size) -> size_t
[this, &id](uint8_t* buf, size_t buf_size) -> size_t
{
LOGINFO(5, "sending BLOCK_REQUEST for id = " << id << " to " << static_cast<char*>(m_addrString));
@@ -2399,15 +2414,14 @@ void P2PServer::P2PClient::post_handle_incoming_block(const uint32_t reset_count
return 0;
}
uint8_t* p0 = reinterpret_cast<uint8_t*>(buf);
uint8_t* p = p0;
uint8_t* p = buf;
*(p++) = static_cast<uint8_t>(MessageId::BLOCK_REQUEST);
memcpy(p, id.h, HASH_SIZE);
p += HASH_SIZE;
return p - p0;
return p - buf;
});
if (!result) {
+1 -1
View File
@@ -201,7 +201,7 @@ private:
void load_peer_list();
void load_monerod_peer_list();
void update_peer_in_list(bool is_v6, const raw_ip& ip, int port);
void remove_peer_from_list(P2PClient* client);
void remove_peer_from_list(const P2PClient* client);
void remove_peer_from_list(const raw_ip& ip);
std::mt19937_64 m_rng;
+15 -4
View File
@@ -438,11 +438,13 @@ void p2pool::handle_chain_main(ChainMain& data, const char* extra)
", reward = " << log::Gray() << log::XMRAmount(data.reward));
if (!sidechain_id.empty()) {
PoolBlock* block = side_chain().find_block(sidechain_id);
const PoolBlock* block = side_chain().find_block(sidechain_id);
if (block) {
LOGINFO(0, log::LightGreen() << "BLOCK FOUND: main chain block at height " << data.height << " was mined by this p2pool" << BLOCK_FOUND);
const Wallet& w = params().m_wallet;
const char* who = (block->m_minerWallet == w) ? "you" : "someone else in this p2pool";
LOGINFO(0, log::LightGreen() << "BLOCK FOUND: main chain block at height " << data.height << " was mined by " << who << BLOCK_FOUND);
const uint64_t payout = block->get_payout(w);
if (payout) {
LOGINFO(0, log::LightCyan() << "Your wallet " << log::LightGreen() << w << log::LightCyan() << " got a payout of " << log::LightGreen() << log::XMRAmount(payout) << log::LightCyan() << " in block " << log::LightGreen() << data.height);
@@ -968,9 +970,18 @@ void p2pool::parse_get_info_rpc(const char* data, size_t size)
void p2pool::get_version()
{
const uint64_t t1 = microseconds_since_epoch();
JSONRPCRequest::call(m_params->m_host, m_params->m_rpcPort, "{\"jsonrpc\":\"2.0\",\"id\":\"0\",\"method\":\"get_version\"}", m_params->m_rpcLogin, m_params->m_socks5Proxy,
[this](const char* data, size_t size)
[this, t1](const char* data, size_t size)
{
const double node_ping = static_cast<double>(microseconds_since_epoch() - t1) / 1e3;
if (node_ping < 100) {
LOGINFO(1, m_hostStr << " ping time is " << node_ping << " ms");
}
else {
LOGWARN(1, m_hostStr << " ping time is " << node_ping << " ms, this is too high for an efficient mining. Try to use a different node, or your own local node.");
}
parse_get_version_rpc(data, size);
},
[this](const char* data, size_t size)
+57 -28
View File
@@ -66,6 +66,9 @@ SideChain::SideChain(p2pool* pool, NetworkType type, const char* pool_name)
, m_chainWindowSize(2160)
, m_unclePenalty(20)
, m_precalcFinished(false)
#ifdef DEV_TEST_SYNC
, m_synchronizedTime(0)
#endif
{
if (s_networkType == NetworkType::Invalid) {
s_networkType = type;
@@ -89,7 +92,7 @@ SideChain::SideChain(p2pool* pool, NetworkType type, const char* pool_name)
uv_rwlock_init_checked(&m_sidechainLock);
uv_mutex_init_checked(&m_seenWalletsLock);
uv_mutex_init_checked(&m_seenBlocksLock);
uv_mutex_init_checked(&m_incomingBlocksLock);
uv_rwlock_init_checked(&m_curDifficultyLock);
m_difficultyData.reserve(m_chainWindowSize);
@@ -206,7 +209,7 @@ SideChain::~SideChain()
uv_rwlock_destroy(&m_sidechainLock);
uv_mutex_destroy(&m_seenWalletsLock);
uv_mutex_destroy(&m_seenBlocksLock);
uv_mutex_destroy(&m_incomingBlocksLock);
uv_rwlock_destroy(&m_curDifficultyLock);
for (const auto& it : m_blocksById) {
@@ -466,7 +469,7 @@ bool SideChain::get_shares(const PoolBlock* tip, std::vector<MinerShare>& shares
return true;
}
bool SideChain::block_seen(const PoolBlock& block)
bool SideChain::incoming_block_seen(const PoolBlock& block)
{
// Check if it's some old block
const PoolBlock* tip = m_chainTip;
@@ -476,15 +479,35 @@ bool SideChain::block_seen(const PoolBlock& block)
return true;
}
const uint64_t cur_time = seconds_since_epoch();
// Check if it was received before
MutexLock lock(m_seenBlocksLock);
return !m_seenBlocks.insert(block.get_full_id()).second;
MutexLock lock(m_incomingBlocksLock);
return !m_incomingBlocks.emplace(block.get_full_id(), cur_time).second;
}
void SideChain::unsee_block(const PoolBlock& block)
void SideChain::forget_incoming_block(const PoolBlock& block)
{
MutexLock lock(m_seenBlocksLock);
m_seenBlocks.erase(block.get_full_id());
MutexLock lock(m_incomingBlocksLock);
m_incomingBlocks.erase(block.get_full_id());
}
void SideChain::cleanup_incoming_blocks()
{
const uint64_t cur_time = seconds_since_epoch();
MutexLock lock(m_incomingBlocksLock);
// Forget seen blocks that were added more than 10 minutes ago
hash h;
for (auto i = m_incomingBlocks.begin(); i != m_incomingBlocks.end();) {
if (cur_time < i->second + 10 * 60) {
++i;
}
else {
i = m_incomingBlocks.erase(i);
}
}
}
bool SideChain::add_external_block(PoolBlock& block, std::vector<hash>& missing_blocks)
@@ -542,14 +565,14 @@ bool SideChain::add_external_block(PoolBlock& block, std::vector<hash>& missing_
hash seed;
if (!m_pool->get_seed(block.m_txinGenHeight, seed)) {
LOGWARN(3, "add_external_block mined by " << block.m_minerWallet << ": couldn't get seed hash for mainchain height " << block.m_txinGenHeight);
unsee_block(block);
forget_incoming_block(block);
return false;
}
hash pow_hash;
if (!block.get_pow_hash(m_pool->hasher(), block.m_txinGenHeight, seed, pow_hash)) {
LOGWARN(3, "add_external_block: couldn't get PoW hash for height = " << block.m_sidechainHeight << ", mainchain height " << block.m_txinGenHeight << ". Ignoring it.");
unsee_block(block);
forget_incoming_block(block);
return true;
}
@@ -604,12 +627,15 @@ bool SideChain::add_external_block(PoolBlock& block, std::vector<hash>& missing_
}
if (block.m_sidechainId == m_watchBlockSidechainId) {
LOGINFO(0, log::LightGreen() << "BLOCK FOUND: main chain block at height " << m_watchBlock.height << " was mined by this p2pool" << BLOCK_FOUND);
const Wallet& w = m_pool->params().m_wallet;
const char* who = (block.m_minerWallet == w) ? "you" : "someone else in this p2pool";
LOGINFO(0, log::LightGreen() << "BLOCK FOUND: main chain block at height " << m_watchBlock.height << " was mined by " << who << BLOCK_FOUND);
m_watchBlockSidechainId = {};
data = m_watchBlock;
block_found = true;
const Wallet& w = m_pool->params().m_wallet;
const uint64_t payout = block.get_payout(w);
if (payout) {
LOGINFO(0, log::LightCyan() << "Your wallet " << log::LightGreen() << w << log::LightCyan() << " got a payout of " << log::LightGreen() << log::XMRAmount(payout) << log::LightCyan() << " in block " << log::LightGreen() << data.height);
@@ -912,7 +938,7 @@ void SideChain::print_status(bool obtain_sidechain_lock) const
blocks_in_window.emplace(uncle_id);
auto it = m_blocksById.find(uncle_id);
if (it != m_blocksById.end()) {
PoolBlock* uncle = it->second;
const PoolBlock* uncle = it->second;
if (tip_height - uncle->m_sidechainHeight < window_size) {
++total_uncles_in_window;
if (uncle->m_minerWallet == w) {
@@ -1719,9 +1745,13 @@ void SideChain::update_chain_tip(const PoolBlock* block)
// Also clear cache because it has data from all old blocks now
clear_crypto_cache();
LOGINFO(0, log::LightCyan() << "SYNCHRONIZED");
#ifdef DEV_TEST_SYNC
m_synchronizedTime = seconds_since_epoch();
#endif
}
}
prune_old_blocks();
cleanup_incoming_blocks();
}
}
else if (block->m_sidechainHeight > tip->m_sidechainHeight) {
@@ -1994,7 +2024,6 @@ void SideChain::prune_old_blocks()
auto it2 = m_blocksById.find(block->m_sidechainId);
if (it2 != m_blocksById.end()) {
m_blocksById.erase(it2);
unsee_block(*block);
delete block;
++num_blocks_pruned;
}
@@ -2025,6 +2054,20 @@ void SideChain::prune_old_blocks()
// Pre-calc workers are not needed anymore
finish_precalc();
#ifdef DEV_TEST_SYNC
if (m_pool && m_precalcFinished.load() && (cur_time >= m_synchronizedTime + 120)) {
LOGINFO(0, log::LightGreen() << "[DEV] Synchronization finished successfully, stopping P2Pool now");
print_status(false);
P2PServer* server = m_pool->p2p_server();
if (server) {
server->print_status();
server->print_bans();
server->show_peers_async();
}
m_pool->stop();
}
#endif
}
}
@@ -2275,20 +2318,6 @@ void SideChain::finish_precalc()
{
LOGERR(1, "exception in finish_precalc(): " << e.what());
}
#ifdef DEV_TEST_SYNC
if (m_pool) {
LOGINFO(0, log::LightGreen() << "[DEV] Synchronization finished successfully, stopping P2Pool now");
print_status(false);
P2PServer* server = m_pool->p2p_server();
if (server) {
server->print_status();
server->print_bans();
server->show_peers_async();
}
m_pool->stop();
}
#endif
}
} // namespace p2pool
+11 -4
View File
@@ -46,8 +46,10 @@ public:
void fill_sidechain_data(PoolBlock& block, std::vector<MinerShare>& shares) const;
bool block_seen(const PoolBlock& block);
void unsee_block(const PoolBlock& block);
bool incoming_block_seen(const PoolBlock& block);
void forget_incoming_block(const PoolBlock& block);
void cleanup_incoming_blocks();
bool add_external_block(PoolBlock& block, std::vector<hash>& missing_blocks);
bool add_block(const PoolBlock& block);
void get_missing_blocks(std::vector<hash>& missing_blocks) const;
@@ -116,8 +118,9 @@ private:
unordered_map<hash, uint64_t> m_seenWallets;
uint64_t m_seenWalletsLastPruneTime;
uv_mutex_t m_seenBlocksLock;
unordered_set<PoolBlock::full_id> m_seenBlocks;
// Used to quickly cut off multiple broadcasts of the same block by different peers. Only the first broadcast will be processed.
uv_mutex_t m_incomingBlocksLock;
unordered_map<PoolBlock::full_id, uint64_t> m_incomingBlocks;
std::vector<DifficultyData> m_difficultyData;
@@ -152,6 +155,10 @@ private:
std::atomic<bool> m_precalcFinished;
#ifdef DEV_TEST_SYNC
uint64_t m_synchronizedTime;
#endif
hash m_consensusHash;
void launch_precalc(const PoolBlock* block);
+5 -5
View File
@@ -287,7 +287,7 @@ bool StratumServer::on_login(StratumClient* client, uint32_t id, const char* log
client->m_lastJobTarget = target;
const bool result = send(client,
[client, id, &hashing_blob, job_id, blob_size, target, height, &seed_hash](void* buf, size_t buf_size)
[client, id, &hashing_blob, job_id, blob_size, target, height, &seed_hash](uint8_t* buf, size_t buf_size)
{
do {
client->m_rpcId = static_cast<StratumServer*>(client->m_owner)->get_random32();
@@ -377,7 +377,7 @@ bool StratumServer::on_submit(StratumClient* client, uint32_t id, const char* jo
if (!block.get_difficulties(template_id, height, sidechain_height, mainchain_diff, sidechain_diff)) {
LOGWARN(4, "client " << static_cast<char*>(client->m_addrString) << " got a stale share");
return send(client,
[id](void* buf, size_t buf_size)
[id](uint8_t* buf, size_t buf_size)
{
log::Stream s(buf, buf_size);
s << "{\"id\":" << id << ",\"jsonrpc\":\"2.0\",\"error\":{\"message\":\"Stale share\"}}\n";
@@ -463,7 +463,7 @@ bool StratumServer::on_submit(StratumClient* client, uint32_t id, const char* jo
LOGWARN(4, "client " << static_cast<char*>(client->m_addrString) << " got a share with invalid job id " << job_id << " (latest job sent has id " << client->m_perConnectionJobId << ')');
const bool result = send(client,
[id](void* buf, size_t buf_size)
[id](uint8_t* buf, size_t buf_size)
{
log::Stream s(buf, buf_size);
s << "{\"id\":" << id << ",\"jsonrpc\":\"2.0\",\"error\":{\"message\":\"Invalid job id\"}}\n";
@@ -773,7 +773,7 @@ void StratumServer::on_blobs_ready()
client->m_lastJobTarget = target;
const bool result = send(client,
[data, target, hashing_blob, job_id](void* buf, size_t buf_size)
[data, target, hashing_blob, job_id](uint8_t* buf, size_t buf_size)
{
log::hex_buf target_hex(reinterpret_cast<const uint8_t*>(&target), sizeof(uint64_t));
@@ -985,7 +985,7 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/)
if ((client->m_resetCounter.load() == share->m_clientResetCounter) && (client->m_rpcId == share->m_rpcId)) {
const bool result = server->send(client,
[share](void* buf, size_t buf_size)
[share](uint8_t* buf, size_t buf_size)
{
log::Stream s(buf, buf_size);
switch (share->m_result) {
+25 -21
View File
@@ -27,6 +27,7 @@ TCPServer::TCPServer(int default_backlog, allocate_client_callback allocate_new_
: m_allocateNewClient(allocate_new_client)
, m_defaultBacklog(default_backlog)
, m_loopThread{}
, m_loopThreadRunning(false)
#ifdef WITH_UPNP
, m_portMapping(0)
#endif
@@ -112,7 +113,7 @@ void TCPServer::parse_address_list_internal(const std::string& address_list, Cal
}
}
const int port = atoi(address.substr(k2 + 1).c_str());
const int port = strtol(address.substr(k2 + 1).c_str(), nullptr, 10);
if ((port > 0) && (port < 65536)) {
callback(is_v6, address, ip, port);
}
@@ -473,7 +474,9 @@ void TCPServer::shutdown_tcp()
}
#endif
uv_thread_join(&m_loopThread);
if (m_loopThreadRunning.load()) {
uv_thread_join(&m_loopThread);
}
uv_mutex_destroy(&m_bansLock);
@@ -573,6 +576,9 @@ bool TCPServer::send_internal(Client* client, Callback<size_t, uint8_t*, size_t>
void TCPServer::loop(void* data)
{
TCPServer* server = static_cast<TCPServer*>(data);
server->m_loopThreadRunning.exchange(true);
ON_SCOPE_LEAVE([server]() { server->m_loopThreadRunning.exchange(false); });
log_category_prefix = server->get_category();
LOGINFO(1, "event loop started");
@@ -803,16 +809,15 @@ void TCPServer::on_new_client(uv_stream_t* server, Client* client)
}
else {
const bool result = owner->send(client,
[](void* buf, size_t buf_size) -> size_t
[](uint8_t* buf, size_t buf_size) -> size_t
{
if (buf_size < 3) {
return 0;
}
uint8_t* p = reinterpret_cast<uint8_t*>(buf);
p[0] = 5; // Protocol version (SOCKS5)
p[1] = 1; // NMETHODS
p[2] = 0; // Method 0 (no authentication)
buf[0] = 5; // Protocol version (SOCKS5)
buf[1] = 1; // NMETHODS
buf[2] = 0; // Method 0 (no authentication)
return 3;
});
@@ -1076,27 +1081,26 @@ bool TCPServer::Client::on_proxy_handshake(char* data, uint32_t size)
n = 2;
const bool result = m_owner->send(this,
[this](void* buf, size_t buf_size) -> size_t
[this](uint8_t* buf, size_t buf_size) -> size_t
{
if (buf_size < 22) {
return 0;
}
uint8_t* p = reinterpret_cast<uint8_t*>(buf);
p[0] = 5; // Protocol version (SOCKS5)
p[1] = 1; // CONNECT
p[2] = 0; // RESERVED
buf[0] = 5; // Protocol version (SOCKS5)
buf[1] = 1; // CONNECT
buf[2] = 0; // RESERVED
if (m_isV6) {
p[3] = 4; // ATYP
memcpy(p + 4, m_addr.data, 16);
p[20] = static_cast<uint8_t>(m_port >> 8);
p[21] = static_cast<uint8_t>(m_port & 0xFF);
buf[3] = 4; // ATYP
memcpy(buf + 4, m_addr.data, 16);
buf[20] = static_cast<uint8_t>(m_port >> 8);
buf[21] = static_cast<uint8_t>(m_port & 0xFF);
}
else {
p[3] = 1; // ATYP
memcpy(p + 4, m_addr.data + 12, 4);
p[8] = static_cast<uint8_t>(m_port >> 8);
p[9] = static_cast<uint8_t>(m_port & 0xFF);
buf[3] = 1; // ATYP
memcpy(buf + 4, m_addr.data + 12, 4);
buf[8] = static_cast<uint8_t>(m_port >> 8);
buf[9] = static_cast<uint8_t>(m_port & 0xFF);
}
return m_isV6 ? 22 : 10;
@@ -1113,7 +1117,7 @@ bool TCPServer::Client::on_proxy_handshake(char* data, uint32_t size)
case Socks5ProxyState::ConnectRequestSent:
if (m_numRead >= 4) {
uint8_t* p = reinterpret_cast<uint8_t*>(m_readBuf);
const uint8_t* p = reinterpret_cast<uint8_t*>(m_readBuf);
if ((p[0] != 5) && (p[1] != 0) && p[2] != 0) {
LOGWARN(5, "SOCKS5 proxy returned an invalid reply to CONNECT");
return false;
+1
View File
@@ -149,6 +149,7 @@ protected:
int m_defaultBacklog;
uv_thread_t m_loopThread;
std::atomic<bool> m_loopThreadRunning;
static void loop(void* data);
+79
View File
@@ -31,6 +31,15 @@
#include "upnpcommands.h"
#endif
#ifdef _WIN32
#include <WinDNS.h>
#elif defined(HAVE_RES_QUERY)
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#endif
static constexpr char log_category_prefix[] = "Util ";
namespace p2pool {
@@ -45,6 +54,11 @@ const char* VERSION = "v" STR2(P2POOL_VERSION_MAJOR) "." STR2(P2POOL_VERSION_MIN
#endif
" on " __DATE__ ")";
const raw_ip raw_ip::localhost_ipv4 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 };
const raw_ip raw_ip::localhost_ipv6 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
alignas(8) const uint8_t raw_ip::ipv4_prefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff };
MinerCallbackHandler::~MinerCallbackHandler() {}
void panic_stop(const char* message)
@@ -462,6 +476,71 @@ bool resolve_host(std::string& host, bool& is_v6)
return true;
}
bool get_dns_txt_records_base(const std::string& host, Callback<void, const char*, size_t>::Base&& callback)
{
if (disable_resolve_host) {
LOGERR(1, "get_dns_txt_records was called with DNS disabled for host " << host);
return false;
}
#ifdef _WIN32
PDNS_RECORD pQueryResults;
if (DnsQuery(host.c_str(), DNS_TYPE_TEXT, DNS_QUERY_STANDARD, NULL, &pQueryResults, NULL) != 0) {
return false;
}
for (PDNS_RECORD p = pQueryResults; p; p = p->pNext) {
for (size_t j = 0; j < p->Data.TXT.dwStringCount; ++j) {
const char* s = p->Data.TXT.pStringArray[j];
const size_t n = strlen(s);
if (n > 0) {
callback(s, n);
}
}
}
DnsRecordListFree(pQueryResults, DnsFreeRecordList);
return true;
#elif defined(HAVE_RES_QUERY)
static const int res_init_result = res_init();
if (res_init_result != 0) {
return false;
}
uint8_t answer[4096] = {};
const int anslen = res_query(host.c_str(), ns_c_in, ns_t_txt, answer, sizeof(answer));
if ((anslen <= 0) || (anslen > static_cast<int>(sizeof(answer)))) {
return false;
}
ns_msg handle{};
if (ns_initparse(answer, anslen, &handle) != 0) {
return false;
}
for (int rrnum = 0, n = ns_msg_count(handle, ns_s_an); rrnum < n; ++rrnum) {
ns_rr rr{};
if ((ns_parserr(&handle, ns_s_an, rrnum, &rr) == 0) && (ns_rr_type(rr) == ns_t_txt)) {
for (const uint8_t* data = ns_rr_rdata(rr), *e = data + ns_rr_rdlen(rr); data < e;) {
const size_t k = *(data++);
if (k && (data + k <= e)) {
callback(reinterpret_cast<const char*>(data), k);
}
data += k;
}
}
}
return true;
#else
(void)host;
(void)callback;
return false;
#endif
}
RandomDeviceSeed RandomDeviceSeed::instance;
struct BSR8
+6 -1
View File
@@ -35,7 +35,7 @@
namespace p2pool {
#define P2POOL_VERSION_MAJOR 3
#define P2POOL_VERSION_MINOR 3
#define P2POOL_VERSION_MINOR 4
extern const char* VERSION;
@@ -296,6 +296,11 @@ struct Callback
};
};
bool get_dns_txt_records_base(const std::string& host, Callback<void, const char*, size_t>::Base&& callback);
template<typename T>
FORCEINLINE bool get_dns_txt_records(const std::string& host, T&& callback) { return get_dns_txt_records_base(host, Callback<void, const char*, size_t>::Derived<T>(std::move(callback))); }
} // namespace p2pool
void memory_tracking_start();
+7 -6
View File
@@ -38,14 +38,13 @@ ZMQReader::ZMQReader(const std::string& address, uint32_t zmq_port, const std::s
m_proxy.clear();
}
for (uint32_t i = m_publisherPort; i < std::numeric_limits<uint16_t>::max(); ++i) {
std::random_device rd;
for (uint32_t port = 49152 + (rd() % 16384), i = 0; i < 100; ++i, port = (port < 65535) ? (port + 1) : 49152) {
try {
m_publisherPort = 0;
char addr[32];
snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", i);
snprintf(addr, sizeof(addr), "tcp://127.0.0.1:%u", port);
m_publisher.bind(addr);
m_publisherPort = static_cast<uint16_t>(i);
m_publisherPort = static_cast<uint16_t>(port);
break;
}
catch (const std::exception& e) {
@@ -58,6 +57,8 @@ ZMQReader::ZMQReader(const std::string& address, uint32_t zmq_port, const std::s
throw zmq::error_t(EFSM);
}
LOGINFO(5, "listening on tcp://127.0.0.1:" << m_publisherPort << " for internal communications");
m_subscriber.set(zmq::sockopt::connect_timeout, 1000);
if (!m_proxy.empty()) {
@@ -188,7 +189,7 @@ bool ZMQReader::connect(const std::string& address)
void ZMQReader::parse(char* data, size_t size)
{
char* value = data;
char* end = data + size;
const char* end = data + size;
while ((value < end) && (*value != ':')) {
++value;
+1 -1
View File
@@ -45,7 +45,7 @@ private:
zmq::context_t m_context{ 1 };
zmq::socket_t m_publisher{ m_context, ZMQ_PUB };
zmq::socket_t m_subscriber{ m_context, ZMQ_SUB };
uint16_t m_publisherPort = 37891;
uint16_t m_publisherPort = 0;
std::atomic<bool> m_finished{ false };
std::atomic<bool> m_threadRunning{ false };
+6 -6
View File
@@ -95,7 +95,7 @@ include_directories(src)
include_directories(googletest/googletest/include)
if (WIN32)
set(LIBS ${LIBS} ws2_32 iphlpapi userenv psapi wldap32)
set(LIBS ${LIBS} ws2_32 iphlpapi userenv psapi dnsapi dbghelp)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(LIBS ${LIBS} bcrypt)
endif()
@@ -107,17 +107,17 @@ endif()
if (STATIC_LIBS)
set(ZMQ_LIBRARY "${CMAKE_SOURCE_DIR}/../external/src/libzmq/build/lib/libzmq.a")
set(ZMQ_LIBRARY_DEBUG "${CMAKE_SOURCE_DIR}/../external/src/libzmq/build/lib/libzmq.a")
set(UV_LIBRARY_DEBUG "${CMAKE_SOURCE_DIR}/../external/src/libuv/build/libuv_a.a")
set(UV_LIBRARY "${CMAKE_SOURCE_DIR}/../external/src/libuv/build/libuv_a.a")
set(UV_LIBRARY_DEBUG "${CMAKE_SOURCE_DIR}/../external/src/libuv/build/libuv.a")
set(UV_LIBRARY "${CMAKE_SOURCE_DIR}/../external/src/libuv/build/libuv.a")
set(CURL_LIBRARY_DEBUG "${CMAKE_SOURCE_DIR}/../external/src/curl/lib/.libs/libcurl.a")
set(CURL_LIBRARY "${CMAKE_SOURCE_DIR}/../external/src/curl/lib/.libs/libcurl.a")
else()
if (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
find_library(ZMQ_LIBRARY_DEBUG NAMES libzmq-v142-mt-sgd-4_3_5 PATHS "../external/lib/libzmq/Debug")
find_library(ZMQ_LIBRARY NAMES libzmq-v142-mt-s-4_3_5 PATHS "../external/lib/libzmq/Release")
find_library(UV_LIBRARY_DEBUG NAMES uv_a PATHS "../external/lib/libuv/Debug")
find_library(UV_LIBRARY NAMES uv_a PATHS "../external/lib/libuv/Release")
find_library(CURL_LIBRARY_DEBUG NAMES libcurld PATHS "../external/lib/libcurl/Debug")
find_library(UV_LIBRARY_DEBUG NAMES libuv PATHS "../external/lib/libuv/Debug")
find_library(UV_LIBRARY NAMES libuv PATHS "../external/lib/libuv/Release")
find_library(CURL_LIBRARY_DEBUG NAMES libcurl-d PATHS "../external/lib/libcurl/Debug")
find_library(CURL_LIBRARY NAMES libcurl PATHS "../external/lib/libcurl/Release")
add_definitions(-D_DISABLE_VECTOR_ANNOTATION)
add_definitions(-D_DISABLE_STRING_ANNOTATION)
+1
View File
@@ -92,6 +92,7 @@ TEST(block_template, update)
tpl.update(data, mempool, &wallet);
ASSERT_EQ(b->m_sidechainId, H("272a7eea0b804cf24427528977d221850d0ee06c26e935219a75f180cfbfc7f3"));
ASSERT_EQ(b->m_transactions.size(), 203);
for (size_t i = 1; i < b->m_transactions.size(); ++i) {
Binary file not shown.
+1 -1
View File
@@ -160,7 +160,7 @@ TEST(pool_block, verify)
ASSERT_EQ(b.deserialize(p, n, sidechain, nullptr, false), 0);
p += n;
sidechain.add_block(b);
ASSERT_TRUE(sidechain.add_block(b));
ASSERT_TRUE(sidechain.find_block(b.m_sidechainId) != nullptr);
}
+37
View File
@@ -0,0 +1,37 @@
import socket
import time
import sys
f = open('stratum_dummy' + sys.argv[1] + '.log', 'wb');
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
sock.setblocking(True)
time.sleep(5)
while sock.connect_ex(('127.0.0.1', 3333)) != 0:
f.write(b'.\n')
print('.')
time.sleep(1)
diff = '';
if (sys.argv[1] == '2'):
diff = '+1000';
if (sys.argv[1] == '3'):
diff = '+10000000';
request = '{"id":1,"method":"login","params":{"login":"x' + diff + '"}}\n'
sock.sendall(request.encode('utf-8'))
while True:
data = sock.recv(1024)
if len(data) == 0:
break;
f.write(data)
f.flush()
print(data.decode('utf-8'))
sock.close()
f.close()
+4
View File
@@ -0,0 +1,4 @@
race:p2pool::log::Worker::run()
race:p2pool::log::Worker::write
called_from_lib:libzmq.so
race_top:do_loglevel
+1
View File
@@ -0,0 +1 @@
shift-base:crypto-ops.c
+4
View File
@@ -87,6 +87,10 @@ TEST(util, bsr)
for (uint64_t i = 0, x = 1; i <= 63; ++i, x <<= 1) {
ASSERT_EQ(bsr(x), i);
ASSERT_EQ(bsr_reference(x), i);
const uint64_t y = x | (x - 1);
ASSERT_EQ(bsr(y), i);
ASSERT_EQ(bsr_reference(y), i);
}
}