Skip to content

Commit 9392628

Browse files
fanquakejanus
authored andcommitted
Squashed 'src/secp256k1/' changes from efe85c70a2..d8311688bd
d8311688bd Merge bitcoin-core/secp256k1#1515: ci: Note affected clangs in comment on ASLR quirk a85e2233e7 ci: Note affected clangs in comment on ASLR quirk 4b77fec67a Merge bitcoin-core/secp256k1#1512: msan: notate more variable assignments from assembly code f7f0184ba1 msan: notate more variable assignments from assembly code a61339149f change inconsistent array param to pointer 05bfab69ae Merge bitcoin-core/secp256k1#1507: ci: Add workaround for ASLR bug in sanitizers a5e8ab2484 ci: Add sanitizer env variables to debug output 84a93de4d2 ci: Add workaround for ASLR bug in sanitizers 427e86b9ed Merge bitcoin-core/secp256k1#1490: tests: improve fe_sqr test (issue #1472) 2028069df2 doc: clarify input requirements for secp256k1_fe_mul 11420a7a28 tests: improve fe_sqr test cdc9a6258e Merge bitcoin-core/secp256k1#1489: tests: add missing fe comparison checks for inverse field test cases d926510cf7 Merge bitcoin-core/secp256k1#1496: msan: notate variable assignments from assembly code 31ba404944 msan: notate variable assignments from assembly code e7ea32e30a msan: Add SECP256K1_CHECKMEM_MSAN_DEFINE which applies to memory sanitizer and not valgrind e7bdddd9c9 refactor: rename `check_fe_equal` -> `fe_equal` 00111c9c56 tests: add missing fe comparison checks for inverse field test cases 0653a25d50 Merge bitcoin-core/secp256k1#1486: ci: Update cache action 94a14d5290 ci: Update cache action 2483627299 Merge bitcoin-core/secp256k1#1483: cmake: Recommend native CMake commands in README 5ad3aa3dcd Merge bitcoin-core/secp256k1#1484: tests: Drop redundant _scalar_check_overflow calls 51df2d9ab3 tests: Drop redundant _scalar_check_overflow calls 3777e3f36a cmake: Recommend native CMake commands in README e4af41c61b Merge bitcoin-core/secp256k1#1249: cmake: Add `SECP256K1_LATE_CFLAGS` configure option 3bf4d68fc0 Merge bitcoin-core/secp256k1#1482: build: Clean up handling of module dependencies e6822678ea build: Error if required module explicitly off 89ec583ccf build: Clean up handling of module dependencies 44378867a0 Merge bitcoin-core/secp256k1#1468: v0.4.1 release aftermath a9db9f2d75 Merge bitcoin-core/secp256k1#1480: Get rid of untested sizeof(secp256k1_ge_storage) == 64 code path 74b7c3b53e Merge bitcoin-core/secp256k1#1476: include: make docs more consistent b37fdb28ce check-abi: Minor UI improvements ad5f589a94 check-abi: Default to HEAD for new version 9fb7e2f156 release process: Style and formatting nits ba5d72d626 assumptions: Use new STATIC_ASSERT macro e53c2d9ffc Require that sizeof(secp256k1_ge_storage) == 64 d0ba2abbff util: Add STATIC_ASSERT macro da7bc1b803 include: in doc, remove article in front of "pointer" aa3dd5280b include: make doc about ctx more consistent e3f690015a include: remove obvious "cannot be NULL" doc d373bf6d08 Merge bitcoin-core/secp256k1#1474: tests: restore scalar_mul test 79e094517c Merge bitcoin-core/secp256k1#1473: Fix typos 3dbfb48946 tests: restore scalar_mul test d77170a88d Fix typos e7053d065b release process: Add email step 429d21dc79 release process: Run sanity checks on release PR 42f8c51402 cmake: Add `SECP256K1_LATE_CFLAGS` configure option git-subtree-dir: src/secp256k1 git-subtree-split: d8311688bd383d3a923a1b11789cded3cc8e5e03
1 parent 1093da6 commit 9392628

27 files changed

+366
-369
lines changed

.github/actions/install-homebrew-valgrind/action.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ runs:
1616
cat valgrind_fingerprint
1717
shell: bash
1818
19-
- uses: actions/cache@v3
19+
- uses: actions/cache@v4
2020
id: cache
2121
with:
2222
path: ${{ env.CI_HOMEBREW_CELLAR_VALGRIND }}

.github/actions/run-in-docker-action/action.yml

+5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ runs:
3636
load: true
3737
cache-from: type=gha
3838

39+
- # Workaround for https://github.com/google/sanitizers/issues/1614 .
40+
# The underlying issue has been fixed in clang 18.1.3.
41+
run: sudo sysctl -w vm.mmap_rnd_bits=28
42+
shell: bash
43+
3944
- # Tell Docker to pass environment variables in `env` into the container.
4045
run: >
4146
docker run \

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ The Contributor Workflow & Peer Review in libsecp256k1 are similar to Bitcoin Co
4444

4545
In addition, libsecp256k1 tries to maintain the following coding conventions:
4646

47-
* No runtime heap allocation (e.g., no `malloc`) unless explicitly requested by the caller (via `secp256k1_context_create` or `secp256k1_scratch_space_create`, for example). Morever, it should be possible to use the library without any heap allocations.
47+
* No runtime heap allocation (e.g., no `malloc`) unless explicitly requested by the caller (via `secp256k1_context_create` or `secp256k1_scratch_space_create`, for example). Moreover, it should be possible to use the library without any heap allocations.
4848
* The tests should cover all lines and branches of the library (see [Test coverage](#coverage)).
4949
* Operations involving secret data should be tested for being constant time with respect to the secrets (see [src/ctime_tests.c](src/ctime_tests.c)).
5050
* Local variables containing secret data should be cleared explicitly to try to delete secrets from memory.

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ To maintain a pristine source tree, CMake encourages to perform an out-of-source
101101

102102
$ mkdir build && cd build
103103
$ cmake ..
104-
$ make
105-
$ make check # run the test suite
106-
$ sudo make install # optional
104+
$ cmake --build .
105+
$ ctest # run the test suite
106+
$ sudo cmake --build . --target install # optional
107107

108108
To compile optional modules (such as Schnorr signatures), you need to run `cmake` with additional flags (such as `-DSECP256K1_ENABLE_MODULE_SCHNORRSIG=ON`). Run `cmake .. -LH` to see the full list of available flags.
109109

ci/ci.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ print_environment() {
1717
SECP256K1_TEST_ITERS BENCH SECP256K1_BENCH_ITERS CTIMETESTS\
1818
EXAMPLES \
1919
HOST WRAPPER_CMD \
20-
CC CFLAGS CPPFLAGS AR NM
20+
CC CFLAGS CPPFLAGS AR NM \
21+
UBSAN_OPTIONS ASAN_OPTIONS LSAN_OPTIONS
2122
do
2223
eval "isset=\${$var+x}"
2324
if [ -n "$isset" ]; then

configure.ac

+17-109
Original file line numberDiff line numberDiff line change
@@ -1541,126 +1541,34 @@ fi
15411541

15421542
dnl ZMQ check
15431543

1544-
if test "$use_zmq" = "yes"; then
1545-
PKG_CHECK_MODULES([ZMQ], [libzmq >= 4],
1546-
AC_DEFINE([ENABLE_ZMQ], [1], [Define this symbol to enable ZMQ functions]),
1547-
[AC_MSG_WARN([libzmq version 4.x or greater not found, disabling])
1548-
use_zmq=no])
1544+
# Processing must be done in a reverse topological sorting of the dependency graph
1545+
# (dependent module first).
1546+
if test x"$enable_module_ellswift" = x"yes"; then
1547+
SECP_CONFIG_DEFINES="$SECP_CONFIG_DEFINES -DENABLE_MODULE_ELLSWIFT=1"
15491548
fi
15501549

1551-
if test "$use_zmq" = "yes"; then
1552-
dnl Assume libzmq was built for static linking
1553-
case $host in
1554-
*mingw*)
1555-
ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC"
1556-
;;
1557-
esac
1558-
fi
1559-
1560-
AM_CONDITIONAL([ENABLE_ZMQ], [test "$use_zmq" = "yes"])
1561-
1562-
dnl libmultiprocess library check
1563-
1564-
libmultiprocess_found=no
1565-
if test "$with_libmultiprocess" = "yes" || test "$with_libmultiprocess" = "auto"; then
1566-
PKG_CHECK_MODULES([LIBMULTIPROCESS], [libmultiprocess], [
1567-
libmultiprocess_found=yes;
1568-
libmultiprocess_prefix=`$PKG_CONFIG --variable=prefix libmultiprocess`;
1569-
], [true])
1570-
elif test "$with_libmultiprocess" != "no"; then
1571-
AC_MSG_ERROR([--with-libmultiprocess=$with_libmultiprocess value is not yes, auto, or no])
1572-
fi
1573-
1574-
dnl Enable multiprocess check
1575-
1576-
if test "$enable_multiprocess" = "yes"; then
1577-
if test "$libmultiprocess_found" != "yes"; then
1578-
AC_MSG_ERROR([--enable-multiprocess=yes option specified but libmultiprocess library was not found. May need to install libmultiprocess library, or specify install path with PKG_CONFIG_PATH environment variable. Running 'pkg-config --debug libmultiprocess' may be helpful for debugging.])
1550+
if test x"$enable_module_schnorrsig" = x"yes"; then
1551+
if test x"$enable_module_extrakeys" = x"no"; then
1552+
AC_MSG_ERROR([Module dependency error: You have disabled the extrakeys module explicitly, but it is required by the schnorrsig module.])
15791553
fi
1580-
build_multiprocess=yes
1581-
elif test "$enable_multiprocess" = "auto"; then
1582-
build_multiprocess=$libmultiprocess_found
1583-
else
1584-
build_multiprocess=no
1554+
enable_module_extrakeys=yes
1555+
SECP_CONFIG_DEFINES="$SECP_CONFIG_DEFINES -DENABLE_MODULE_SCHNORRSIG=1"
15851556
fi
15861557

1587-
AM_CONDITIONAL([BUILD_MULTIPROCESS], [test "$build_multiprocess" = "yes"])
1588-
AM_CONDITIONAL([BUILD_BGL_NODE], [test "$build_multiprocess" = "yes"])
1589-
AM_CONDITIONAL([BUILD_BGL_GUI], [test "$build_multiprocess" = "yes"])
1590-
1591-
dnl codegen tools check
1592-
1593-
if test "$build_multiprocess" != "no"; then
1594-
if test "$with_mpgen" = "yes" || test "$with_mpgen" = "auto"; then
1595-
MPGEN_PREFIX="$libmultiprocess_prefix"
1596-
elif test "$with_mpgen" != "no"; then
1597-
MPGEN_PREFIX="$with_mpgen";
1598-
fi
1599-
AC_SUBST(MPGEN_PREFIX)
1558+
if test x"$enable_module_extrakeys" = x"yes"; then
1559+
SECP_CONFIG_DEFINES="$SECP_CONFIG_DEFINES -DENABLE_MODULE_EXTRAKEYS=1"
16001560
fi
16011561

1602-
AC_MSG_CHECKING([whether to build BGLd])
1603-
AM_CONDITIONAL([BUILD_BGLD], [test $build_BGLd = "yes"])
1604-
AC_MSG_RESULT($build_BGLd)
1605-
1606-
AC_MSG_CHECKING([whether to build BGL-cli])
1607-
AM_CONDITIONAL([BUILD_BGL_CLI], [test $build_BGL_cli = "yes"])
1608-
AC_MSG_RESULT($build_BGL_cli)
1609-
1610-
AC_MSG_CHECKING([whether to build BGL-tx])
1611-
AM_CONDITIONAL([BUILD_BGL_TX], [test $build_BGL_tx = "yes"])
1612-
AC_MSG_RESULT($build_BGL_tx)
1613-
1614-
AC_MSG_CHECKING([whether to build BGL-wallet])
1615-
AM_CONDITIONAL([BUILD_BGL_WALLET], [test $build_BGL_wallet = "yes"])
1616-
AC_MSG_RESULT($build_BGL_wallet)
1617-
1618-
AC_MSG_CHECKING([whether to build BGL-util])
1619-
AM_CONDITIONAL([BUILD_BGL_UTIL], [test $build_BGL_util = "yes"])
1620-
AC_MSG_RESULT($build_BGL_util)
1621-
1622-
AC_MSG_CHECKING([whether to build experimental BGL-chainstate])
1623-
if test "$build_BGL_chainstate" = "yes"; then
1624-
if test "$build_experimental_kernel_lib" = "no"; then
1625-
AC_MSG_ERROR([experimental BGL-chainstate cannot be built without the experimental BGLkernel library. Use --with-experimental-kernel-lib]);
1626-
fi
1562+
if test x"$enable_module_recovery" = x"yes"; then
1563+
SECP_CONFIG_DEFINES="$SECP_CONFIG_DEFINES -DENABLE_MODULE_RECOVERY=1"
16271564
fi
1628-
AM_CONDITIONAL([BUILD_BGL_CHAINSTATE], [test $build_BGL_chainstate = "yes"])
1629-
AC_MSG_RESULT($build_BGL_chainstate)
16301565

1631-
AM_CONDITIONAL([BUILD_BGL_KERNEL_LIB], [test "$build_experimental_kernel_lib" != "no" && ( test "$build_experimental_kernel_lib" = "yes" || test "$build_BGL_chainstate" = "yes" )])
1632-
1633-
AC_LANG_POP
1634-
1635-
if test "$use_ccache" != "no"; then
1636-
AC_MSG_CHECKING([if ccache should be used])
1637-
if test "$CCACHE" = ""; then
1638-
if test "$use_ccache" = "yes"; then
1639-
AC_MSG_ERROR([ccache not found.]);
1640-
else
1641-
use_ccache=no
1642-
fi
1643-
else
1644-
use_ccache=yes
1645-
CC="$ac_cv_path_CCACHE $CC"
1646-
CXX="$ac_cv_path_CCACHE $CXX"
1647-
fi
1648-
AC_MSG_RESULT($use_ccache)
1649-
if test "$use_ccache" = "yes"; then
1650-
AX_CHECK_COMPILE_FLAG([-fdebug-prefix-map=A=B], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -fdebug-prefix-map=\$(abs_top_srcdir)=."], [], [$CXXFLAG_WERROR])
1651-
AX_CHECK_PREPROC_FLAG([-fmacro-prefix-map=A=B], [DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -fmacro-prefix-map=\$(abs_top_srcdir)=."], [], [$CXXFLAG_WERROR])
1652-
fi
1566+
if test x"$enable_module_ecdh" = x"yes"; then
1567+
SECP_CONFIG_DEFINES="$SECP_CONFIG_DEFINES -DENABLE_MODULE_ECDH=1"
16531568
fi
16541569

1655-
dnl enable wallet
1656-
AC_MSG_CHECKING([if wallet should be enabled])
1657-
if test "$enable_wallet" != "no"; then
1658-
AC_MSG_RESULT([yes])
1659-
AC_DEFINE_UNQUOTED([ENABLE_WALLET],[1],[Define to 1 to enable wallet functions])
1660-
enable_wallet=yes
1661-
1662-
else
1663-
AC_MSG_RESULT([no])
1570+
if test x"$enable_external_default_callbacks" = x"yes"; then
1571+
SECP_CONFIG_DEFINES="$SECP_CONFIG_DEFINES -DUSE_EXTERNAL_DEFAULT_CALLBACKS=1"
16641572
fi
16651573

16661574
dnl enable upnp support

doc/release-process.md

+41-38
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Release Process
1+
# Release process
22

33
This document outlines the process for releasing versions of the form `$MAJOR.$MINOR.$PATCH`.
44

@@ -17,8 +17,9 @@ This process also assumes that there will be no minor releases for old major rel
1717
* Update manpages (see previous section)
1818
* Write release notes (see "Write the release notes" below).
1919

20-
## Sanity Checks
21-
Perform these checks before creating a release:
20+
## Sanity checks
21+
Perform these checks when reviewing the release PR (see below):
22+
2223

2324
* On both the master branch and the new release branch:
2425
- update `CLIENT_VERSION_MAJOR` in [`configure.ac`](../configure.ac)
@@ -121,7 +122,7 @@ git fetch origin "v${VERSION}"
121122
git checkout "v${VERSION}"
122123
popd
123124
```
124-
<<<<<<< HEAD
125+
125126

126127
Ensure your guix.sigs are up-to-date if you wish to `guix-verify` your builds
127128
against other `guix-attest` signatures.
@@ -153,28 +154,30 @@ pushd ./guix.sigs
153154
git add "${VERSION}/${SIGNER}"/noncodesigned.SHA256SUMS{,.asc}
154155
git commit -m "Add attestations by ${SIGNER} for ${VERSION} non-codesigned"
155156
popd
156-
=======
157+
158+
1. Ensure `make distcheck` doesn't fail.
159+
```shell
160+
./autogen.sh && ./configure --enable-dev-mode && make distcheck
161+
```
162+
157163
2. Check installation with autotools:
158-
```shell
159-
dir=$(mktemp -d)
160-
./autogen.sh && ./configure --prefix=$dir && make clean && make install && ls -RlAh $dir
161-
gcc -o ecdsa examples/ecdsa.c $(PKG_CONFIG_PATH=$dir/lib/pkgconfig pkg-config --cflags --libs libsecp256k1) -Wl,-rpath,"$dir/lib" && ./ecdsa
162-
```
164+
```shell
165+
dir=$(mktemp -d)
166+
./autogen.sh && ./configure --prefix=$dir && make clean && make install && ls -RlAh $dir
167+
gcc -o ecdsa examples/ecdsa.c $(PKG_CONFIG_PATH=$dir/lib/pkgconfig pkg-config --cflags --libs libsecp256k1) -Wl,-rpath,"$dir/lib" && ./ecdsa
168+
```
163169
3. Check installation with CMake:
164-
```shell
165-
dir=$(mktemp -d)
166-
build=$(mktemp -d)
167-
cmake -B $build -DCMAKE_INSTALL_PREFIX=$dir && cmake --build $build --target install && ls -RlAh $dir
168-
gcc -o ecdsa examples/ecdsa.c -I $dir/include -L $dir/lib*/ -l secp256k1 -Wl,-rpath,"$dir/lib",-rpath,"$dir/lib64" && ./ecdsa
169-
>>>>>>> 29fde0223a... Squashed 'src/secp256k1/' changes from 199d27cea3..efe85c70a2
170-
```
171-
4. Use the [`check-abi.sh`](/tools/check-abi.sh) tool to ensure there are no unexpected ABI incompatibilities and that the version number and release notes accurately reflect all potential ABI changes. To run this tool, the `abi-dumper` and `abi-compliance-checker` packages are required.
172-
173-
```shell
174-
tools/check-abi.sh
175-
```
170+
```shell
171+
dir=$(mktemp -d)
172+
build=$(mktemp -d)
173+
cmake -B $build -DCMAKE_INSTALL_PREFIX=$dir && cmake --build $build --target install && ls -RlAh $dir
174+
gcc -o ecdsa examples/ecdsa.c -I $dir/include -L $dir/lib*/ -l secp256k1 -Wl,-rpath,"$dir/lib",-rpath,"$dir/lib64" && ./ecdsa
175+
```
176+
4. Use the [`check-abi.sh`](/tools/check-abi.sh) tool to verify that there are no unexpected ABI incompatibilities and that the version number and the release notes accurately reflect all potential ABI changes. To run this tool, the `abi-dumper` and `abi-compliance-checker` packages are required.
177+
```shell
178+
tools/check-abi.sh
179+
```
176180
177-
<<<<<<< HEAD
178181
Then open a Pull Request to the [guix.sigs repository](https://github.com/bitcoin-core/guix.sigs).
179182
180183
## Codesigning
@@ -350,48 +353,48 @@ Notes:
350353
* adding a section for the release (make sure that the version number is a link to a diff between the previous and new version),
351354
* removing the `[Unreleased]` section header, and
352355
* including an entry for `### ABI Compatibility` if it doesn't exist,
353-
* sets `_PKG_VERSION_IS_RELEASE` to `true` in `configure.ac`, and
354-
* if this is not a patch release
355-
* updates `_PKG_VERSION_*` and `_LIB_VERSION_*` in `configure.ac` and
356+
* sets `_PKG_VERSION_IS_RELEASE` to `true` in `configure.ac`, and,
357+
* if this is not a patch release,
358+
* updates `_PKG_VERSION_*` and `_LIB_VERSION_*` in `configure.ac`, and
356359
* updates `project(libsecp256k1 VERSION ...)` and `${PROJECT_NAME}_LIB_VERSION_*` in `CMakeLists.txt`.
357-
2. After the PR is merged, tag the commit and push it:
360+
2. Perform the [sanity checks](#sanity-checks) on the PR branch.
361+
3. After the PR is merged, tag the commit, and push the tag:
358362
```
359363
RELEASE_COMMIT=<merge commit of step 1>
360364
git tag -s v$MAJOR.$MINOR.$PATCH -m "libsecp256k1 $MAJOR.$MINOR.$PATCH" $RELEASE_COMMIT
361365
git push [email protected]:bitcoin-core/secp256k1.git v$MAJOR.$MINOR.$PATCH
362366
```
363-
3. Open a PR to the master branch with a commit (using message `"release cleanup: bump version after $MAJOR.$MINOR.$PATCH"`, for example) that
367+
4. Open a PR to the master branch with a commit (using message `"release cleanup: bump version after $MAJOR.$MINOR.$PATCH"`, for example) that
364368
* sets `_PKG_VERSION_IS_RELEASE` to `false` and increments `_PKG_VERSION_PATCH` and `_LIB_VERSION_REVISION` in `configure.ac`,
365369
* increments the `$PATCH` component of `project(libsecp256k1 VERSION ...)` and `${PROJECT_NAME}_LIB_VERSION_REVISION` in `CMakeLists.txt`, and
366370
* adds an `[Unreleased]` section header to the [CHANGELOG.md](../CHANGELOG.md).
367371
368372
If other maintainers are not present to approve the PR, it can be merged without ACKs.
369-
4. Create a new GitHub release with a link to the corresponding entry in [CHANGELOG.md](../CHANGELOG.md).
373+
5. Create a new GitHub release with a link to the corresponding entry in [CHANGELOG.md](../CHANGELOG.md).
374+
6. Send an announcement email to the bitcoin-dev mailing list.
370375
371376
## Maintenance release
372377
373-
Note that bugfixes only need to be backported to releases for which no compatible release without the bug exists.
378+
Note that bug fixes need to be backported only to releases for which no compatible release without the bug exists.
374379
375380
1. If there's no maintenance branch `$MAJOR.$MINOR`, create one:
376381
```
377382
git checkout -b $MAJOR.$MINOR v$MAJOR.$MINOR.$((PATCH - 1))
378383
git push [email protected]:bitcoin-core/secp256k1.git $MAJOR.$MINOR
379384
```
380385
2. Open a pull request to the `$MAJOR.$MINOR` branch that
381-
* includes the bugfixes,
386+
* includes the bug fixes,
382387
* finalizes the release notes similar to a regular release,
383388
* increments `_PKG_VERSION_PATCH` and `_LIB_VERSION_REVISION` in `configure.ac`
384389
and the `$PATCH` component of `project(libsecp256k1 VERSION ...)` and `${PROJECT_NAME}_LIB_VERSION_REVISION` in `CMakeLists.txt`
385390
(with commit message `"release: bump versions for $MAJOR.$MINOR.$PATCH"`, for example).
386-
3. After the PRs are merged, update the release branch and tag the commit:
391+
3. Perform the [sanity checks](#sanity-checks) on the PR branch.
392+
4. After the PRs are merged, update the release branch, tag the commit, and push the tag:
387393
```
388394
git checkout $MAJOR.$MINOR && git pull
389395
git tag -s v$MAJOR.$MINOR.$PATCH -m "libsecp256k1 $MAJOR.$MINOR.$PATCH"
390-
```
391-
4. Push tag:
392-
```
393396
git push [email protected]:bitcoin-core/secp256k1.git v$MAJOR.$MINOR.$PATCH
394397
```
395-
5. Create a new GitHub release with a link to the corresponding entry in [CHANGELOG.md](../CHANGELOG.md).
396-
6. Open PR to the master branch that includes a commit (with commit message `"release notes: add $MAJOR.$MINOR.$PATCH"`, for example) that adds release notes to [CHANGELOG.md](../CHANGELOG.md).
397-
>>>>>>> 29fde0223a... Squashed 'src/secp256k1/' changes from 199d27cea3..efe85c70a2
398+
6. Create a new GitHub release with a link to the corresponding entry in [CHANGELOG.md](../CHANGELOG.md).
399+
7. Send an announcement email to the bitcoin-dev mailing list.
400+
8. Open PR to the master branch that includes a commit (with commit message `"release notes: add $MAJOR.$MINOR.$PATCH"`, for example) that adds release notes to [CHANGELOG.md](../CHANGELOG.md).

0 commit comments

Comments
 (0)