No description
Find a file
Andrew Poelstra a3b7e71a3d
transaction: refuse to deserialize TxOuts with null values
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 d53479c9ff
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).
2025-02-06 21:31:47 +00:00
.github doc: Remove label from good first issue template 2020-08-24 09:31:24 +02:00
.tx qt: Update transifex resource blob to 23.0 2022-02-03 13:18:28 +01:00
build-aux/m4 build: use header-only Boost unit test 2022-02-13 20:59:02 +00:00
build_msvc Add MSVC build configuration for libelementssimplicity 2024-10-07 14:39:09 -04:00
ci Lint simplicity subtree 2024-10-07 14:39:09 -04:00
contrib Merge b71a07778f into merged_master (Bitcoin PR bitcoin/bitcoin#24417) 2023-07-02 16:47:44 +00:00
depends build: upgrade depends Boost to 1.77.0 2022-02-22 15:53:45 +00:00
doc lint: fix codespell warnings 2023-09-27 15:56:20 +02:00
share Merge b6b7815ddc into merged_master (Bitcoin PR bitcoin/bitcoin#24277) 2023-06-30 13:12:30 +00:00
src transaction: refuse to deserialize TxOuts with null values 2025-02-06 21:31:47 +00:00
test Sanitize libsimplicity 2025-01-31 11:43:23 -05:00
.cirrus.yml ci: fix arm test file_env placement 2023-10-09 21:17:40 +00:00
.editorconfig ci: Drop AppVeyor CI integration 2021-09-07 06:12:53 +03:00
.gitattributes Separate protocol versioning from clientversion 2014-10-29 00:24:40 -04:00
.gitignore Merge 619f8a27ad into merged_master (Bitcoin PR bitcoin/bitcoin#24304) 2023-07-03 11:19:58 +00:00
.python-version Bump minimum python version to 3.6 2020-11-09 17:53:47 +10:00
.style.yapf test: .style.yapf: Set column_limit=160 2019-03-04 18:28:13 -05:00
autogen.sh scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
configure.ac simplicity: enable coverage in configure.ac 2024-10-07 14:39:09 -04:00
CONTRIBUTING.md Merge 0dc1002c30 into merged_master (Bitcoin PR bitcoin/bitcoin#24433) 2023-07-02 16:08:36 +00:00
COPYING doc: Update license year range to 2022 2022-01-03 04:48:41 +08:00
INSTALL.md doc: Added hyperlink for doc/build 2021-09-09 19:53:12 +05:30
libbitcoinconsensus.pc.in build: remove libcrypto as internal dependency in libbitcoinconsensus.pc 2019-11-19 15:03:44 +01:00
Makefile.am Enable coverage for simplicity/secp256k1 2025-02-04 12:14:28 -05:00
README.md Merge 9b28bd73a3 into merged_master (Bitcoin PR #20691) 2021-06-15 13:07:58 +00:00
REVIEWERS doc: update maintainer list in REVIEWERS 2022-02-25 11:46:26 +00:00
SECURITY.md Merge c702d1fefd into merged_master (Bitcoin PR bitcoin/bitcoin#23466) 2023-05-17 12:25:58 +00:00

Elements Project blockchain platform

Build Status

https://elementsproject.org

This is the integration and staging tree for the Elements blockchain platform, a collection of feature experiments and extensions to the Bitcoin protocol. This platform enables anyone to build their own businesses or networks pegged to Bitcoin as a sidechain or run as a standalone blockchain with arbitrary asset tokens.

Modes

Elements supports a few different pre-set chains for syncing. Note though some are intended for QA and debugging only:

  • Liquid mode: elementsd -chain=liquidv1 (syncs with Liquid network)
  • Bitcoin mainnet mode: elementsd -chain=main (not intended to be run for commerce)
  • Bitcoin testnet mode: elementsd -chain=testnet3
  • Bitcoin regtest mode: elementsd -chain=regtest
  • Elements custom chains: Any other -chain= argument. It has regtest-like default parameters that can be over-ridden by the user by a rich set of start-up options.

Confidential Assets

The latest feature in the Elements blockchain platform is Confidential Assets, the ability to issue multiple assets on a blockchain where asset identifiers and amounts are blinded yet auditable through the use of applied cryptography.

Features of the Elements blockchain platform

Compared to Bitcoin itself, it adds the following features:

Previous elements that have been integrated into Bitcoin:

  • Segregated Witness
  • Relative Lock Time

Elements deferred for additional research and standardization:

Additional RPC commands and parameters:

The CI (Continuous Integration) systems make sure that every pull request is built for Windows, Linux, and macOS, and that unit/sanity tests are run automatically.

License

Elements is released under the terms of the MIT license. See COPYING for more information or see http://opensource.org/licenses/MIT.

What is the Elements Project?

Elements is an open source, sidechain-capable blockchain platform. It also allows experiments to more rapidly bring technical innovation to the Bitcoin ecosystem.

Learn more on the Elements Project website

https://github.com/ElementsProject/elementsproject.github.io

Secure Reporting

See our vulnerability reporting guide