Skip to content
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

Avoid unnecessary witness initializations, style, comments. #1500

Merged
merged 3 commits into from
Jul 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion include/bitcoin/system/chain/input.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,25 @@ class BC_API input
size_t witnessed_size() const NOEXCEPT;
void set_witness(reader& source) NOEXCEPT;

inline const chain::witness& get_witness() const NOEXCEPT
{
return witness_ ? *witness_ : no_witness();
}

inline const chain::witness::cptr& get_witness_cptr() const NOEXCEPT
{
return witness_ ? witness_ : no_witness_cptr();
}

typedef struct { size_t nominal; size_t witnessed; } sizes;

void assign_data(reader& source) NOEXCEPT;
////void assign_data(reader& source) NOEXCEPT;
////static input from_data(reader& source) NOEXCEPT;
static sizes serialized_size(const chain::script& script) NOEXCEPT;
static sizes serialized_size(const chain::script& script,
const chain::witness& witness) NOEXCEPT;
static const chain::witness& no_witness() NOEXCEPT;
static const chain::witness::cptr& no_witness_cptr() NOEXCEPT;
bool extract_sigop_script(chain::script& out,
const chain::script& prevout_script) const NOEXCEPT;

Expand Down
95 changes: 62 additions & 33 deletions src/chain/input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,25 @@ static_assert(max_script_size <
max_size_t / multisig_default_sigops / heavy_sigops_factor,
"input sigop overflow guard");

// static/private
const witness& input::no_witness() NOEXCEPT
{
static const chain::witness empty_witness{};
return empty_witness;
}

// static/private
const witness::cptr& input::no_witness_cptr() NOEXCEPT
{
BC_PUSH_WARNING(NO_NEW_OR_DELETE)
static const std::shared_ptr<const chain::witness> empty
{
new const chain::witness{}
};
BC_POP_WARNING()
return empty;
}

// Constructors.
// ----------------------------------------------------------------------------

Expand Down Expand Up @@ -151,12 +170,10 @@ input::input(reader& source) NOEXCEPT
script_(
source.get_allocator().new_object<chain::script>(source, true),
source.get_allocator().deleter<chain::script>(source.get_arena())),
witness_(
source.get_allocator().new_object<chain::witness>(/*empty*/),
source.get_allocator().deleter<chain::witness>(source.get_arena())),
witness_(nullptr),
sequence_(source.read_4_bytes_little_endian()),
valid_(source),
size_(serialized_size(*script_, *witness_))
size_(serialized_size(*script_))
{
////assign_data(source);
}
Expand All @@ -181,7 +198,7 @@ bool input::operator==(const input& other) const NOEXCEPT
return (sequence_ == other.sequence_)
&& (point_ == other.point_ || *point_ == *other.point_)
&& (script_ == other.script_ || *script_ == *other.script_)
&& (witness_ == other.witness_ || *witness_ == *other.witness_);
&& (witness_ == other.witness_ || get_witness() == other.get_witness());
}

bool input::operator!=(const input& other) const NOEXCEPT
Expand All @@ -206,28 +223,26 @@ bool input::operator!=(const input& other) const NOEXCEPT
//// };
////}

// private
void input::assign_data(reader&) NOEXCEPT
{
////auto& allocator = source.get_allocator();
////
////allocator.construct<chain::point::cptr>(&point_,
//// allocator.new_object<chain::point>(source),
//// allocator.deleter<chain::point>(source.get_arena()));
////
////allocator.construct<chain::script::cptr>(&script_,
//// allocator.new_object<chain::script>(source, true),
//// allocator.deleter<chain::script>(source.get_arena()));
////
////// Witness is deserialized and assigned by transaction.
////allocator.construct<chain::witness::cptr>(&witness_,
//// allocator.new_object<chain::witness>(/*empty*/),
//// allocator.deleter<chain::witness>(source.get_arena()));
////
////sequence_ = source.read_4_bytes_little_endian();
////size_ = serialized_size(*script_, *witness_);
////valid_ = source;
}
////// private
////void input::assign_data(reader& source) NOEXCEPT
////{
//// auto& allocator = source.get_allocator();
////
//// allocator.construct<chain::point::cptr>(&point_,
//// allocator.new_object<chain::point>(source),
//// allocator.deleter<chain::point>(source.get_arena()));
////
//// allocator.construct<chain::script::cptr>(&script_,
//// allocator.new_object<chain::script>(source, true),
//// allocator.deleter<chain::script>(source.get_arena()));
////
//// // Witness is deserialized and assigned by transaction.
//// allocator.construct<chain::witness::cptr>(&witness_, nullptr);
////
//// sequence_ = source.read_4_bytes_little_endian();
//// size_ = serialized_size(*script_);
//// valid_ = source;
////}

// Serialization.
// ----------------------------------------------------------------------------
Expand All @@ -254,6 +269,20 @@ void input::to_data(writer& sink) const NOEXCEPT
sink.write_4_bytes_little_endian(sequence_);
}

// static/private
input::sizes input::serialized_size(const chain::script& script) NOEXCEPT
{
constexpr auto const_size = ceilinged_add(
point::serialized_size(),
sizeof(sequence_));

const auto nominal_size = ceilinged_add(
const_size,
script.serialized_size(true));

return { nominal_size, zero };
}

// static/private
input::sizes input::serialized_size(const chain::script& script,
const chain::witness& witness) NOEXCEPT
Expand Down Expand Up @@ -334,7 +363,7 @@ const chain::script& input::script() const NOEXCEPT

const chain::witness& input::witness() const NOEXCEPT
{
return *witness_;
return get_witness();
}

const point::cptr& input::point_ptr() const NOEXCEPT
Expand All @@ -349,7 +378,7 @@ const chain::script::cptr& input::script_ptr() const NOEXCEPT

const chain::witness::cptr& input::witness_ptr() const NOEXCEPT
{
return witness_;
return get_witness_cptr();
}

uint32_t input::sequence() const NOEXCEPT
Expand Down Expand Up @@ -405,10 +434,10 @@ bool input::is_locked(size_t height, uint32_t median_time_past) const NOEXCEPT

bool input::reserved_hash(hash_digest& out) const NOEXCEPT
{
if (!witness::is_reserved_pattern(witness_->stack()))
if (!witness::is_reserved_pattern(get_witness().stack()))
return false;

std::copy_n(witness_->stack().front()->begin(), hash_size, out.begin());
std::copy_n(get_witness().stack().front()->begin(), hash_size, out.begin());
return true;
}

Expand Down Expand Up @@ -452,7 +481,7 @@ size_t input::signature_operations(bool bip16, bool bip141) const NOEXCEPT
// Embedded/witness scripts are deserialized here and again on scipt eval.

chain::script witness;
if (bip141 && witness_->extract_sigop_script(witness, prevout->script()))
if (bip141 && get_witness().extract_sigop_script(witness, prevout->script()))
{
// Add sigops in the witness script (bip141).
return ceilinged_add(sigops, witness.signature_operations(true));
Expand All @@ -461,7 +490,7 @@ size_t input::signature_operations(bool bip16, bool bip141) const NOEXCEPT
chain::script embedded;
if (bip16 && extract_sigop_script(embedded, prevout->script()))
{
if (bip141 && witness_->extract_sigop_script(witness, embedded))
if (bip141 && get_witness().extract_sigop_script(witness, embedded))
{
// Add sigops in the embedded witness script (bip141).
return ceilinged_add(sigops, witness.signature_operations(true));
Expand Down
6 changes: 3 additions & 3 deletions src/chain/operation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ BC_PUSH_WARNING(NO_THROW_IN_NOEXCEPT)
// Gotta set something when invalid minimal result, test is_valid.
static constexpr auto any_invalid = opcode::op_xor;

// static
// static/private
const data_chunk& operation::no_data() NOEXCEPT
{
static const data_chunk empty_data{};
return empty_data;
}

// static
// static/private
const chunk_cptr& operation::no_data_cptr() NOEXCEPT
{
BC_PUSH_WARNING(NO_NEW_OR_DELETE)
Expand All @@ -58,7 +58,7 @@ const chunk_cptr& operation::no_data_cptr() NOEXCEPT
return empty;
}

// static
// static/private
// Push data is not possible with an invalid code, combination is invalid.
const chunk_cptr& operation::any_data_cptr() NOEXCEPT
{
Expand Down
22 changes: 4 additions & 18 deletions src/chain/transaction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,21 +98,12 @@ transaction::transaction(const transaction& other) NOEXCEPT
other.valid_)
{
// Optimized for faster optional, not for copy.

if (other.nominal_hash_)
nominal_hash_ = to_unique(*other.nominal_hash_);
else
nominal_hash_.reset();

if (other.witness_hash_)
witness_hash_ = to_unique(*other.witness_hash_);
else
witness_hash_.reset();

if (other.sighash_cache_)
sighash_cache_ = to_unique(*other.sighash_cache_);
else
sighash_cache_.reset();
}

transaction::transaction(uint32_t version, chain::inputs&& inputs,
Expand Down Expand Up @@ -211,22 +202,17 @@ transaction& transaction::operator=(const transaction& other) NOEXCEPT
valid_ = other.valid_;
size_ = other.size_;

// Optimized for faster optional, not for copy.
nominal_hash_.reset();
witness_hash_.reset();
sighash_cache_.reset();

// Optimized for faster optional, not for copy.
if (other.nominal_hash_)
nominal_hash_ = to_unique(*other.nominal_hash_);
else
nominal_hash_.reset();

if (other.witness_hash_)
witness_hash_ = to_unique(*other.witness_hash_);
else
witness_hash_.reset();

if (other.sighash_cache_)
sighash_cache_ = to_unique(*other.sighash_cache_);
else
sighash_cache_.reset();

return *this;
}
Expand Down
Loading