-
Notifications
You must be signed in to change notification settings - Fork 386
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Prepare 23.3.0rc3 #1396
Merged
delta1
merged 32 commits into
ElementsProject:elements-23.x
from
psgreco:elem-23.3.0rc3
Feb 10, 2025
Merged
Prepare 23.3.0rc3 #1396
delta1
merged 32 commits into
ElementsProject:elements-23.x
from
psgreco:elem-23.3.0rc3
Feb 10, 2025
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
We have the code fragment `txTo.GetHash().begin()`, which takes a transaction, computes its txid as a uint256, and then saves a pointer to the internal data of the uint256. However, in C++, expressions of the form a.b().c() lead to the return value of `b` being dropped immediately after the call to `c`. This is fine if `c` is something like `GetHex` which returns a new independently allocated object with no pointers to its input. It is not fine for `begin` which returns a pointer into the return value of `GetHash`. So this fragment returns a dangling pointer, which is later used by the Simplicity interpreter, leading to UB. In practice this code appeared to work, possibly because the stack layout was such that it actually did work ok. Or possibly because we don't test with enough fidelity to tell that Simplicity's view of the txid of a transaction was mangled.
Without this patch, the --with-sanitizers config flag has no effect on the copy of libsimplicity in Elements Core. This means that we aren't running asan or tsan when we intend to, and also means that when fuzzing we aren't instrumenting the Simplicity binary. The result is extremely bad fuzz coverage and missed bugs. ubsan suppression for simplicity sha256.c ubsan detects when a left shift would overflow an integer type. This is not UB (it would be if you tried to shift more than the type's width in one shot) but "may be unintentional" and is therefore detected. Add a whitelist to the giant list of whitelists.
c2d4c3d07b Update elements-sources.mk 5ba4a709ac Add explicit deallocation functions to the Simplicity API fd3a1a7c3f Fix comments e10d34fa49 Clarify comment about illegal hidden children 3b55e8150e Rename STOP code error message f67d1ad145 Generate contents of decodePrimitive automatically 991fddcb6a Correctly name identity hashes a840706c2f Static asserts on imr_buf not needed 7e91641218 Prep C code for VST proving git-subtree-dir: src/simplicity git-subtree-split: c2d4c3d07bb7e5973fc22cf172ed8fb9a84b4365
The main difference is that there is now explicit simplicity deallocation functions to go with the allocation functions in the API. There are some minor changes to error message text. The deserialization code is now automatically generated. The are some other minor internal changes.
While the bitcoin/elements project testing isn't trying to gain coverage of the regular libsecp256k1 library, in our case we do want our (fuzz) testing to cover simplicity's own copy of libsecp256k1, which has been specifically trimmed down to only include functionality needed by simplicity's jets.
Update to latest Simplicity
In Bitcoin Core the notion of a "null" amount (and therefore a "null" txout) is one which cannot be serialized or deserialized. In Core this is implemented using a value of -1. In Elements we use the CT notion of "nullness" which is that the flag on the confidential value is 0. See d53479c which implemented this. This is reasonable, but because we don't have checks on deserialization, we can deserialize objects that cannot be reserialized. In particular, in coins.h, we deserialize a coin by deserializing its txout. When reserializing we assert that !out.IsNull(). This assertion is hit by the `coins_deserialize` fuzztest. There are a few potential fixes here: * Remove the assertion from coins.h, which is there to catch logic bugs in Core, on the assumption that if they have no bugs then we don't either. This seems like a bad idea. * Change "nullness" for amounts to be an encoding of -1, like in Core. This seems dangerous because we call `GetAmount` all over the place, and if this could return the -1 amount, this will likely blow something up. Probably this is safe for the same reason it is in Core -- that is, we never create null txouts except as sentinel values. But do you wanna bet that this is true now? That it'll always be true? * Same as above, but assert that the amount is not null. This is safer than just blindly hoping that no overflows will occur but still not obviously safe. * Refuse to deserialize null CT objects. This is impossible because we use null nonce values in txouts. * Refuse to deserialize null CT values. Similarly, this is impossible because we use null values in null asset issuances, which are legal. * Refused to deserialize CTxOuts with null values or assets. We are going with the latter solution, because it is narrowly scoped, does not increase the "crash surface" (we throw an exception, and we already throw exceptions for other kinds of invalid serializations), and is very unlikely to cause bugs (null values are invalid on the network anyway; this is the first check in VerifyAmounts) (so are null assets for that matter, which we maybe also should refuse to deserialize).
We cannot fuzz RBF (or do anything mempool-related, really) without chainparams. This has been true since 2019 at least. I suspect this fuzz test has never really been run.
… descriptor wallets
…ble for descriptor wallets
… descriptor wallets
…isable for descriptor wallets
…fuzz-fixes A couple miscellaneous fixes for fuzztests
…onal Fix some functional tests when bdb is not available
See: miniupnp/miniupnp@c0a50ce The return value of 2 now indicates: "A valid connected IGD has been found but its IP address is reserved (non routable)" We continue to ignore any return value other than 1. (cherry picked from commit 8acdf66)
Github-Pull: bitcoin#24572 Rebased-From: fa43933
CI: Fix Win64 native build, TSAN and CentOS 8 test
delta1
approved these changes
Feb 10, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
utACK a5852ce
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Changes included:
1 . Version bump
2. Updated manpages
3. Updates from master up to bd551ad