Bitcoin ABC  0.22.12
P2P Digital Currency
bitfield.cpp
Go to the documentation of this file.
1 // Copyright (c) 2019 The Bitcoin developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <script/bitfield.h>
6 
7 #include <script/script_error.h>
8 
9 #include <cstddef>
10 #include <limits>
11 
12 bool DecodeBitfield(const std::vector<uint8_t> &vch, unsigned size,
13  uint32_t &bitfield, ScriptError *serror) {
14  if (size > 32) {
15  return set_error(serror, ScriptError::INVALID_BITFIELD_SIZE);
16  }
17 
18  const size_t bitfield_size = (size + 7) / 8;
19  if (vch.size() != bitfield_size) {
20  return set_error(serror, ScriptError::INVALID_BITFIELD_SIZE);
21  }
22 
23  bitfield = 0;
24  for (size_t i = 0; i < bitfield_size; i++) {
25  // Decode the bitfield as little endian.
26  bitfield |= uint32_t(vch[i]) << (8 * i);
27  }
28 
29  const uint32_t mask = (uint64_t(1) << size) - 1;
30  if ((bitfield & mask) != bitfield) {
31  return set_error(serror, ScriptError::INVALID_BIT_RANGE);
32  }
33 
34  return true;
35 }
ScriptError
Definition: script_error.h:9
bool DecodeBitfield(const std::vector< uint8_t > &vch, unsigned size, uint32_t &bitfield, ScriptError *serror)
Definition: bitfield.cpp:12