diff --git a/src/script/script.cpp b/src/script/script.cpp --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -262,6 +262,35 @@ } } +std::vector +MinimalizeBigEndianArray(const std::vector &data) { + std::vector res; + + // Ensure we have a byte to work with. + if (bin.size() == 0) { + bin.push_back(0); + } + + // Check for a negative bit + uint8_t neg = 0; + if ((bin[0] & 0x80) != 0) { + // Trim down + bin[0] ^= 0x80; + neg = 0x80; + } + bool start = false; + for (size_t i = 0; i < bin.size(); ++i) { + if (!start && bin[i] == 0) { + start = true; + continue; + } + res.push_back(bin[i]); + } + res[0] ^= neg; + + return std::move(res); +} + unsigned int CScript::GetSigOpCount(bool fAccurate) const { unsigned int n = 0; const_iterator pc = begin(); diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -414,6 +414,16 @@ } } // namespace +BOOST_AUTO_TEST_CASE(MinimalizeBigEndianArray) { + std::vector input = { + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}; + std::vector check = {{0x81}}; + + out = MinimalizeBigEndianArray(input); + + BOOST_CHECK_EQUAL(out, check); +} + BOOST_AUTO_TEST_CASE(script_build) { const KeyData keys;