diff --git a/.dockerignore b/.dockerignore index 35f2485a23af..3d846c209a27 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,3 @@ Dockerfile contrib/docker/Dockerfile.* -target +target \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 3ae1167cbc9f..f0739bb66244 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,316 +1,188 @@ -# This Dockerfile is used by buildx to build ARM64, AMD64, and ARM32 Docker images from an AMD64 host. -# To speed up the build process, we are cross-compiling rather than relying on QEMU. -# There are four main stages: -# * downloader: Downloads specific binaries needed for core lightning for each architecture. -# * builder: Cross-compiles for each architecture. -# * final: Creates the runtime image. +# syntax=docker/dockerfile:1.7-labs -ARG DEFAULT_TARGETPLATFORM="linux/amd64" -ARG BASE_DISTRO="debian:bookworm-slim" +FROM --platform=${BUILDPLATFORM} debian:bookworm-slim AS base-host -FROM --platform=$BUILDPLATFORM ${BASE_DISTRO} AS base-downloader -RUN set -ex \ - && apt-get update \ - && apt-get install -qq --no-install-recommends ca-certificates dirmngr wget qemu-user-static binfmt-support +SHELL ["/bin/bash", "-euo", "pipefail", "-c"] -FROM base-downloader AS base-downloader-linux-amd64 -ENV TARBALL_ARCH_FINAL=x86_64-linux-gnu +FROM --platform=${TARGETPLATFORM} debian:bookworm-slim AS base-target -FROM base-downloader AS base-downloader-linux-arm64 -ENV TARBALL_ARCH_FINAL=aarch64-linux-gnu +SHELL ["/bin/bash", "-euo", "pipefail", "-c"] -FROM base-downloader AS base-downloader-linux-arm -ENV TARBALL_ARCH_FINAL=arm-linux-gnueabihf +FROM base-host AS downloader-linux-amd64 -FROM base-downloader-${TARGETOS}-${TARGETARCH} AS downloader +ARG target_arch=x86_64-linux-gnu -RUN set -ex \ - && apt-get update \ - && apt-get install -qq --no-install-recommends ca-certificates dirmngr wget +FROM base-host AS downloader-linux-arm64 -WORKDIR /opt +ARG target_arch=aarch64-linux-gnu + +FROM base-host AS downloader-linux-arm + +ARG target_arch=arm-linux-gnueabihf + +FROM downloader-${TARGETOS}-${TARGETARCH} AS downloader + +RUN apt-get update && \ + apt-get install -qq -y --no-install-recommends \ + gnupg + +ARG BITCOIN_VERSION=27.1 +ARG BITCOIN_URL=https://bitcoincore.org/bin/bitcoin-core-${BITCOIN_VERSION} +ARG BITCOIN_TARBALL=bitcoin-${BITCOIN_VERSION}-${target_arch}.tar.gz + +WORKDIR /opt/bitcoin + +ADD ${BITCOIN_URL}/${BITCOIN_TARBALL} . +ADD ${BITCOIN_URL}/SHA256SUMS . +ADD ${BITCOIN_URL}/SHA256SUMS.asc . +COPY gpg/bitcoin/ gpg/ + +RUN gpg --quiet --import gpg/* && \ + gpg --verify SHA256SUMS.asc SHA256SUMS && \ + sha256sum -c SHA256SUMS --ignore-missing + +RUN tar xzf ${BITCOIN_TARBALL} --strip-components=1 +ARG LITECOIN_VERSION=0.16.3 +ARG LITECOIN_BASE_URL=https://download.litecoin.org/litecoin-${LITECOIN_VERSION} +ARG LITECOIN_URL=${LITECOIN_BASE_URL}/linux +ARG LITECOIN_TARBALL=litecoin-${LITECOIN_VERSION}-${target_arch}.tar.gz -ENV BITCOIN_VERSION=27.1 -ENV BITCOIN_TARBALL bitcoin-${BITCOIN_VERSION}-${TARBALL_ARCH_FINAL}.tar.gz -ENV BITCOIN_URL https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/$BITCOIN_TARBALL -ENV BITCOIN_ASC_URL https://bitcoincore.org/bin/bitcoin-core-$BITCOIN_VERSION/SHA256SUMS +WORKDIR /opt/litecoin -RUN mkdir /opt/bitcoin && cd /opt/bitcoin \ - && wget -qO $BITCOIN_TARBALL "$BITCOIN_URL" \ - && wget -qO bitcoin "$BITCOIN_ASC_URL" \ - && grep $BITCOIN_TARBALL bitcoin | tee SHA256SUMS \ - && sha256sum -c SHA256SUMS \ - && BD=bitcoin-$BITCOIN_VERSION/bin \ - && tar -xzvf $BITCOIN_TARBALL $BD/ --strip-components=1 \ - && rm $BITCOIN_TARBALL +ADD ${LITECOIN_URL}/${LITECOIN_TARBALL} . +ADD ${LITECOIN_URL}/${LITECOIN_TARBALL}.asc . +ADD ${LITECOIN_BASE_URL}/SHA256SUMS.asc . +COPY gpg/litecoin/ gpg/ -ENV LITECOIN_VERSION 0.16.3 -ENV LITECOIN_URL https://download.litecoin.org/litecoin-${LITECOIN_VERSION}/linux/litecoin-${LITECOIN_VERSION}-${TARBALL_ARCH_FINAL}.tar.gz +RUN gpg --quiet --import gpg/* && \ + gpg --verify SHA256SUMS.asc && \ + gpg --verify ${LITECOIN_TARBALL}.asc ${LITECOIN_TARBALL} && \ + sha256sum -c SHA256SUMS.asc --ignore-missing -# install litecoin binaries -RUN mkdir /opt/litecoin && cd /opt/litecoin \ - && wget -qO litecoin.tar.gz "$LITECOIN_URL" \ - && tar -xzvf litecoin.tar.gz litecoin-$LITECOIN_VERSION/bin/litecoin-cli --strip-components=1 --exclude=*-qt \ - && rm litecoin.tar.gz +RUN tar xzf ${LITECOIN_TARBALL} --strip-components=1 -FROM --platform=${DEFAULT_TARGETPLATFORM} ${BASE_DISTRO} AS base-builder -RUN apt-get update -qq && \ +FROM base-host AS base-builder + +RUN apt-get update && \ apt-get install -qq -y --no-install-recommends \ + build-essential \ + ca-certificates \ + wget \ + git \ autoconf \ automake \ bison \ - build-essential \ - ca-certificates \ - curl \ - dirmngr \ flex \ - gettext \ - git \ - gnupg \ jq \ - libicu-dev \ libtool \ - libffi-dev \ - pkg-config \ - libssl-dev \ - protobuf-compiler \ - python3 \ - python3-dev \ - python3-mako \ - python3-pip \ - python3-venv \ - python3-setuptools \ - libev-dev \ - libevent-dev \ - qemu-user-static \ - wget \ - unzip \ - tclsh - -ENV PATH="/root/.local/bin:$PATH" \ - PYTHON_VERSION=3 \ - POETRY_VERSION=2.0.1 -RUN curl -sSL https://install.python-poetry.org | python3 - && \ - poetry self add poetry-plugin-export -RUN mkdir -p /root/.venvs && \ - python3 -m venv /root/.venvs/cln && \ - . /root/.venvs/cln/bin/activate && \ - pip3 install --upgrade pip setuptools wheel - -RUN wget -q https://zlib.net/fossils/zlib-1.2.13.tar.gz -O zlib.tar.gz && \ - wget -q https://www.sqlite.org/2019/sqlite-src-3290000.zip -O sqlite.zip && \ - wget -q https://ftp.postgresql.org/pub/source/v17.1/postgresql-17.1.tar.gz -O postgres.tar.gz + gettext \ + protobuf-compiler + +WORKDIR /opt + +ADD --chmod=750 https://astral.sh/uv/install.sh install-uv.sh +ADD --chmod=750 https://sh.rustup.rs install-rust.sh WORKDIR /opt/lightningd -COPY . /tmp/lightning -RUN git clone --recursive /tmp/lightning . && \ - git checkout $(git --work-tree=/tmp/lightning --git-dir=/tmp/lightning/.git rev-parse HEAD) - -# Do not build python plugins here, python doesn't support cross compilation. -RUN poetry lock && \ - poetry export -o requirements.txt --without-hashes -RUN mkdir -p /root/.venvs && \ - python3 -m venv /root/.venvs/cln && \ - . /root/.venvs/cln/bin/activate && \ - pip3 install -r requirements.txt && \ - pip3 cache purge -WORKDIR / + +COPY --exclude=.git/ . . FROM base-builder AS base-builder-linux-amd64 -ENV POSTGRES_CONFIG="--without-readline" \ - PG_CONFIG=/usr/local/pgsql/bin/pg_config +ARG target_arch=x86_64-linux-gnu +ARG target_arch_gcc=x86-64-linux-gnu +ARG target_arch_dpkg=amd64 +ARG target_arch_rust=x86_64-unknown-linux-gnu +ARG COPTFLAGS="-march=x86-64" FROM base-builder AS base-builder-linux-arm64 -ENV target_host=aarch64-linux-gnu \ - target_host_rust=aarch64-unknown-linux-gnu \ - target_host_qemu=qemu-aarch64-static - -RUN apt-get install -qq -y --no-install-recommends \ - libc6-arm64-cross \ - gcc-${target_host} \ - g++-${target_host} - -ENV AR=${target_host}-ar \ - AS=${target_host}-as \ - CC=${target_host}-gcc \ - CXX=${target_host}-g++ \ - LD=${target_host}-ld \ - STRIP=${target_host}-strip \ - QEMU_LD_PREFIX=/usr/${target_host} \ - HOST=${target_host} \ - TARGET=${target_host_rust} \ - RUSTUP_INSTALL_OPTS="--target ${target_host_rust} --default-host ${target_host_rust}" \ - PKG_CONFIG_PATH="/usr/${target_host}/lib/pkgconfig" - -ENV ZLIB_CONFIG="--prefix=${QEMU_LD_PREFIX}" \ - SQLITE_CONFIG="--host=${target_host} --prefix=${QEMU_LD_PREFIX}" \ - POSTGRES_CONFIG="--without-readline --prefix=${QEMU_LD_PREFIX}" \ - PG_CONFIG="${QEMU_LD_PREFIX}/bin/pg_config" + +ARG target_arch=aarch64-linux-gnu +ARG target_arch_gcc=aarch64-linux-gnu +ARG target_arch_dpkg=arm64 +ARG target_arch_rust=aarch64-unknown-linux-gnu +ARG COPTFLAGS="-march=armv8-a" FROM base-builder AS base-builder-linux-arm -ENV target_host=arm-linux-gnueabihf \ - target_host_rust=armv7-unknown-linux-gnueabihf \ - target_host_qemu=qemu-arm-static - -RUN apt-get install -qq -y --no-install-recommends \ - libc6-armhf-cross \ - gcc-${target_host} \ - g++-${target_host} - -ENV AR=${target_host}-ar \ - AS=${target_host}-as \ - CC=${target_host}-gcc \ - CXX=${target_host}-g++ \ - LD=${target_host}-ld \ - STRIP=${target_host}-strip \ - QEMU_LD_PREFIX=/usr/${target_host} \ - HOST=${target_host} \ - TARGET=${target_host_rust} \ - RUSTUP_INSTALL_OPTS="--target ${target_host_rust} --default-host ${target_host_rust}" \ - PKG_CONFIG_PATH="/usr/${target_host}/lib/pkgconfig" - -ENV ZLIB_CONFIG="--prefix=${QEMU_LD_PREFIX}" \ - SQLITE_CONFIG="--host=${target_host} --prefix=${QEMU_LD_PREFIX}" \ - POSTGRES_CONFIG="--without-readline --prefix=${QEMU_LD_PREFIX}" \ - PG_CONFIG="${QEMU_LD_PREFIX}/bin/pg_config" +ARG target_arch=arm-linux-gnueabihf +ARG target_arch_gcc=arm-linux-gnueabihf +ARG target_arch_dpkg=armhf +ARG target_arch_rust=armv7-unknown-linux-gnueabihf +ARG COPTFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard" FROM base-builder-${TARGETOS}-${TARGETARCH} AS builder ENV LIGHTNINGD_VERSION=master -RUN mkdir zlib && tar xvf zlib.tar.gz -C zlib --strip-components=1 \ - && cd zlib \ - && ./configure ${ZLIB_CONFIG} \ - && make \ - && make install && cd .. && \ - rm zlib.tar.gz && \ - rm -rf zlib - -RUN unzip sqlite.zip \ - && cd sqlite-* \ - && ./configure --enable-static --disable-readline --disable-threadsafe --disable-load-extension ${SQLITE_CONFIG} \ - && make \ - && make install && cd .. && rm sqlite.zip && rm -rf sqlite-* - -RUN mkdir postgres && tar xvf postgres.tar.gz -C postgres --strip-components=1 \ - && cd postgres \ - && ./configure ${POSTGRES_CONFIG} \ - && cd src/include \ - && make install \ - && cd ../interfaces/libpq \ - && make install \ - && cd ../../bin/pg_config \ - && make install \ - && cd ../../../../ && \ - rm postgres.tar.gz && \ - rm -rf postgres && \ - ldconfig "$(${PG_CONFIG} --libdir)" - -# Save libpq to a specific location to copy it into the final image. -RUN mkdir /var/libpq && cp -a "$(${PG_CONFIG} --libdir)"/libpq.* /var/libpq - -ENV RUST_PROFILE=release \ - PATH="/root/.cargo/bin:/root/.local/bin:$PATH" -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ${RUSTUP_INSTALL_OPTS} -RUN rustup toolchain install stable --component rustfmt --allow-downgrade - -COPY --from=downloader /usr/bin/${target_host_qemu} /usr/bin/${target_host_qemu} -WORKDIR /opt/lightningd - -# If cross-compiling, need to tell it to cargo. -RUN ( ! [ -n "${target_host}" ] ) || \ - (mkdir -p .cargo && echo "[target.${target_host_rust}]\nlinker = \"${target_host}-gcc\"" > .cargo/config) +RUN dpkg --add-architecture ${target_arch_dpkg} -# Weird errors with cargo for cln-grpc on arm7 https://github.com/ElementsProject/lightning/issues/6596 -RUN ( ! [ "${target_host}" = "arm-linux-gnueabihf" ] ) || \ - (sed -i '/documentation = "https:\/\/docs.rs\/cln-grpc"/a include = ["**\/*.*"]' cln-grpc/Cargo.toml) +RUN apt-get update && \ + apt-get install -qq -y --no-install-recommends \ + pkg-config:${target_arch_dpkg} \ + python3-dev:${target_arch_dpkg} \ + libicu-dev:${target_arch_dpkg} \ + zlib1g-dev:${target_arch_dpkg} \ + libsqlite3-dev:${target_arch_dpkg} \ + libpq-dev:${target_arch_dpkg} \ + crossbuild-essential-${target_arch_dpkg} + +ARG AR=${target_arch}-ar +ARG AS=${target_arch}-as +ARG CC=${target_arch}-gcc +ARG CXX=${target_arch}-g++ +ARG LD=${target_arch}-ld +ARG STRIP=${target_arch}-strip +ARG CARGO_BUILD_TARGET=${target_arch_rust} +ARG COPTFLAGS="-O2 ${COPTFLAGS}" +ARG RUSTFLAGS="-C linker=${CC} -C target-cpu=generic" +ARG RUST_PROFILE=release -# Ensure that the desired grpcio-tools & protobuf versions are installed -# https://github.com/ElementsProject/lightning/pull/7376#issuecomment-2161102381 -RUN poetry lock && poetry install && \ - poetry self add poetry-plugin-export +WORKDIR /opt -# Ensure that git differences are removed before making bineries, to avoid `-modded` suffix -# poetry.lock changed due to pyln-client, pyln-proto and pyln-testing version updates -RUN git reset --hard HEAD +RUN ./install-uv.sh -q +RUN ./install-rust.sh -y -q --profile minimal --component rustfmt --target ${target_arch_rust} -RUN ./configure --prefix=/tmp/lightning_install --enable-static && poetry run make install +ENV PATH="/root/.cargo/bin:/root/.local/bin:${PATH}" WORKDIR /opt/lightningd -RUN echo 'RUSTUP_INSTALL_OPTS="${RUSTUP_INSTALL_OPTS}"' > /tmp/rustup_install_opts.txt -# We need to build python plugins on the target's arch because python doesn't support cross build -FROM ${BASE_DISTRO} AS builder-python -RUN apt-get update -qq && \ - apt-get install -qq -y --no-install-recommends \ - git \ - curl \ - libtool \ - pkg-config \ - autoconf \ - automake \ - build-essential \ - libffi-dev \ - libssl-dev \ - python3 \ - python3-dev \ - python3-pip \ - python3-venv && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* +#TODO: Fix unaligned access on armv7 +RUN ./configure --prefix=/tmp/lightning_install --enable-static --disable-compat --disable-valgrind -ENV PYTHON_VERSION=3 -RUN mkdir -p /root/.venvs && \ - python3 -m venv /root/.venvs/cln && \ - . /root/.venvs/cln/bin/activate && \ - pip3 install --upgrade pip setuptools wheel +COPY .git/ .git/ +RUN git submodule update --init --recursive --jobs $(nproc) --depth 1 -# Copy rustup_install_opts.txt file from builder -COPY --from=builder /tmp/rustup_install_opts.txt /tmp/rustup_install_opts.txt -# Setup ENV $RUSTUP_INSTALL_OPTS for this stage -RUN export $(cat /tmp/rustup_install_opts.txt) -ENV PATH="/root/.cargo/bin:/root/.venvs/cln/bin:$PATH" -RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ${RUSTUP_INSTALL_OPTS} +RUN uv run make install-program -j$(nproc) +RUN find /tmp/lightning_install -type f -executable -exec \ + file {} + | \ + grep -E ':.*ELF' | \ + cut -d: -f1 | \ + xargs -r ${STRIP} --strip-unneeded -WORKDIR /opt/lightningd - -FROM ${BASE_DISTRO} AS final +FROM base-target AS final RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - tini \ - socat \ - inotify-tools \ - jq \ - python3 \ - python3-pip && \ + apt-get install -qq -y --no-install-recommends \ + inotify-tools \ + socat \ + jq \ + libpq5 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -ENV LIGHTNINGD_DATA=/root/.lightning \ - LIGHTNINGD_RPC_PORT=9835 \ - LIGHTNINGD_PORT=9735 \ - LIGHTNINGD_NETWORK=bitcoin - -RUN mkdir $LIGHTNINGD_DATA && \ - touch $LIGHTNINGD_DATA/config -VOLUME [ "/root/.lightning" ] +COPY --from=downloader /opt/bitcoin/bin/bitcoin-cli /usr/bin/ +COPY --from=downloader /opt/litecoin/bin/litecoin-cli /usr/bin/ +COPY --from=builder /tmp/lightning_install/ /usr/local/ -# Take libpq directly from builder. -RUN mkdir /var/libpq && mkdir -p /usr/local/pgsql/lib -RUN --mount=type=bind,from=builder,source=/var/libpq,target=/var/libpq,rw \ - cp -a /var/libpq/libpq.* /usr/local/pgsql/lib && \ - echo "/usr/local/pgsql/lib" > /etc/ld.so.conf.d/libpq.conf && \ - ldconfig +COPY tools/docker-entrypoint.sh /entrypoint.sh -COPY --from=builder /tmp/lightning_install/ /usr/local/ -COPY --from=builder-python /root/.venvs/cln/lib/python3.11/site-packages /usr/local/lib/python3.11/dist-packages/ -COPY --from=downloader /opt/bitcoin/bin /usr/bin -COPY --from=downloader /opt/litecoin/bin /usr/bin -COPY tools/docker-entrypoint.sh entrypoint.sh +ENV LIGHTNINGD_DATA=/root/.lightning +ENV LIGHTNINGD_RPC_PORT=9835 +ENV LIGHTNINGD_PORT=9735 +ENV LIGHTNINGD_NETWORK=bitcoin EXPOSE 9735 9835 -ENTRYPOINT [ "/usr/bin/tini", "-g", "--", "./entrypoint.sh" ] +VOLUME ["/root/.lightning"] +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/doc/getting-started/getting-started/installation.md b/doc/getting-started/getting-started/installation.md index c7199120350e..c9ea97573a77 100644 --- a/doc/getting-started/getting-started/installation.md +++ b/doc/getting-started/getting-started/installation.md @@ -41,6 +41,12 @@ To install for a specific version, for example, 24.05: docker pull elementsproject/lightningd:v24.05 ``` +To run the Docker container: + +```shell +docker run --rm --init -v /path/on/host/lightning-data:/root/.lightning -p 9735:9735 -p 9835:9835 lightningd +``` + See all of the docker images for Core Lightning on [Docker Hub](https://hub.docker.com/r/elementsproject/lightningd/tags). # Third-party apps diff --git a/gpg/bitcoin/0xb10c.gpg b/gpg/bitcoin/0xb10c.gpg new file mode 100644 index 000000000000..34d9fedb494b Binary files /dev/null and b/gpg/bitcoin/0xb10c.gpg differ diff --git a/gpg/bitcoin/CoinForensics.gpg b/gpg/bitcoin/CoinForensics.gpg new file mode 100644 index 000000000000..ab59bcac20d7 Binary files /dev/null and b/gpg/bitcoin/CoinForensics.gpg differ diff --git a/gpg/bitcoin/Emzy.gpg b/gpg/bitcoin/Emzy.gpg new file mode 100644 index 000000000000..25d6d8798a27 Binary files /dev/null and b/gpg/bitcoin/Emzy.gpg differ diff --git a/gpg/bitcoin/Sjors.gpg b/gpg/bitcoin/Sjors.gpg new file mode 100644 index 000000000000..9cbb111809e4 Binary files /dev/null and b/gpg/bitcoin/Sjors.gpg differ diff --git a/gpg/bitcoin/TheCharlatan.gpg b/gpg/bitcoin/TheCharlatan.gpg new file mode 100644 index 000000000000..10482a8564a0 Binary files /dev/null and b/gpg/bitcoin/TheCharlatan.gpg differ diff --git a/gpg/bitcoin/achow101.gpg b/gpg/bitcoin/achow101.gpg new file mode 100644 index 000000000000..5d2816b705b2 Binary files /dev/null and b/gpg/bitcoin/achow101.gpg differ diff --git a/gpg/bitcoin/benthecarman.gpg b/gpg/bitcoin/benthecarman.gpg new file mode 100644 index 000000000000..987208c965bb Binary files /dev/null and b/gpg/bitcoin/benthecarman.gpg differ diff --git a/gpg/bitcoin/cfields.gpg b/gpg/bitcoin/cfields.gpg new file mode 100644 index 000000000000..80cc2572c460 Binary files /dev/null and b/gpg/bitcoin/cfields.gpg differ diff --git a/gpg/bitcoin/darosior.gpg b/gpg/bitcoin/darosior.gpg new file mode 100644 index 000000000000..c9d17277431d Binary files /dev/null and b/gpg/bitcoin/darosior.gpg differ diff --git a/gpg/bitcoin/davidgumberg.gpg b/gpg/bitcoin/davidgumberg.gpg new file mode 100644 index 000000000000..7883984cc4d2 Binary files /dev/null and b/gpg/bitcoin/davidgumberg.gpg differ diff --git a/gpg/bitcoin/dunxen.gpg b/gpg/bitcoin/dunxen.gpg new file mode 100644 index 000000000000..47e7abf91b90 Binary files /dev/null and b/gpg/bitcoin/dunxen.gpg differ diff --git a/gpg/bitcoin/fanquake.gpg b/gpg/bitcoin/fanquake.gpg new file mode 100644 index 000000000000..ba72922d2082 Binary files /dev/null and b/gpg/bitcoin/fanquake.gpg differ diff --git a/gpg/bitcoin/glozow.gpg b/gpg/bitcoin/glozow.gpg new file mode 100644 index 000000000000..45af78f423c5 Binary files /dev/null and b/gpg/bitcoin/glozow.gpg differ diff --git a/gpg/bitcoin/guggero.gpg b/gpg/bitcoin/guggero.gpg new file mode 100644 index 000000000000..83b39de20db0 Binary files /dev/null and b/gpg/bitcoin/guggero.gpg differ diff --git a/gpg/bitcoin/hebasto.gpg b/gpg/bitcoin/hebasto.gpg new file mode 100644 index 000000000000..f55a6582a3b1 Binary files /dev/null and b/gpg/bitcoin/hebasto.gpg differ diff --git a/gpg/bitcoin/ismaelsadeeq.gpg b/gpg/bitcoin/ismaelsadeeq.gpg new file mode 100644 index 000000000000..53ed0e30731d Binary files /dev/null and b/gpg/bitcoin/ismaelsadeeq.gpg differ diff --git a/gpg/bitcoin/jackielove4u.gpg b/gpg/bitcoin/jackielove4u.gpg new file mode 100644 index 000000000000..570d0a146390 Binary files /dev/null and b/gpg/bitcoin/jackielove4u.gpg differ diff --git a/gpg/bitcoin/josibake.gpg b/gpg/bitcoin/josibake.gpg new file mode 100644 index 000000000000..97b1ae9e4db9 Binary files /dev/null and b/gpg/bitcoin/josibake.gpg differ diff --git a/gpg/bitcoin/kvaciral.gpg b/gpg/bitcoin/kvaciral.gpg new file mode 100644 index 000000000000..19e98db5d03c Binary files /dev/null and b/gpg/bitcoin/kvaciral.gpg differ diff --git a/gpg/bitcoin/laanwj.gpg b/gpg/bitcoin/laanwj.gpg new file mode 100644 index 000000000000..9238900e0307 Binary files /dev/null and b/gpg/bitcoin/laanwj.gpg differ diff --git a/gpg/bitcoin/luke-jr.gpg b/gpg/bitcoin/luke-jr.gpg new file mode 100644 index 000000000000..6309d7841362 Binary files /dev/null and b/gpg/bitcoin/luke-jr.gpg differ diff --git a/gpg/bitcoin/m3dwards.gpg b/gpg/bitcoin/m3dwards.gpg new file mode 100644 index 000000000000..56815b870d3e Binary files /dev/null and b/gpg/bitcoin/m3dwards.gpg differ diff --git a/gpg/bitcoin/pinheadmz.gpg b/gpg/bitcoin/pinheadmz.gpg new file mode 100644 index 000000000000..ae0478393265 Binary files /dev/null and b/gpg/bitcoin/pinheadmz.gpg differ diff --git a/gpg/bitcoin/satsie.gpg b/gpg/bitcoin/satsie.gpg new file mode 100644 index 000000000000..64b8550b8336 Binary files /dev/null and b/gpg/bitcoin/satsie.gpg differ diff --git a/gpg/bitcoin/sipa.gpg b/gpg/bitcoin/sipa.gpg new file mode 100644 index 000000000000..fe83b338d72e Binary files /dev/null and b/gpg/bitcoin/sipa.gpg differ diff --git a/gpg/bitcoin/sipsorcery.gpg b/gpg/bitcoin/sipsorcery.gpg new file mode 100644 index 000000000000..c61a5bc899b6 Binary files /dev/null and b/gpg/bitcoin/sipsorcery.gpg differ diff --git a/gpg/bitcoin/svanstaa.gpg b/gpg/bitcoin/svanstaa.gpg new file mode 100644 index 000000000000..5dce19ab11d7 Binary files /dev/null and b/gpg/bitcoin/svanstaa.gpg differ diff --git a/gpg/bitcoin/tapcrafter.gpg b/gpg/bitcoin/tapcrafter.gpg new file mode 100644 index 000000000000..4c98dc64a07a Binary files /dev/null and b/gpg/bitcoin/tapcrafter.gpg differ diff --git a/gpg/bitcoin/theStack.gpg b/gpg/bitcoin/theStack.gpg new file mode 100644 index 000000000000..d05f72c071a5 Binary files /dev/null and b/gpg/bitcoin/theStack.gpg differ diff --git a/gpg/bitcoin/vertiond.gpg b/gpg/bitcoin/vertiond.gpg new file mode 100644 index 000000000000..1d7f5f643620 Binary files /dev/null and b/gpg/bitcoin/vertiond.gpg differ diff --git a/gpg/bitcoin/willcl-ark.gpg b/gpg/bitcoin/willcl-ark.gpg new file mode 100644 index 000000000000..3c6358b6cde9 Binary files /dev/null and b/gpg/bitcoin/willcl-ark.gpg differ diff --git a/gpg/bitcoin/willyko.gpg b/gpg/bitcoin/willyko.gpg new file mode 100644 index 000000000000..c6f12e10f561 Binary files /dev/null and b/gpg/bitcoin/willyko.gpg differ diff --git a/gpg/litecoin/davidburkett.gpg b/gpg/litecoin/davidburkett.gpg new file mode 100644 index 000000000000..6e71959c1ca6 Binary files /dev/null and b/gpg/litecoin/davidburkett.gpg differ