Open real-or-random opened 1 year ago
In secp256k1-zkp the scratch space gets actual usage, and I find it has a much nicer API than malloc/free. The API lets us:
So I think it has more benefit than just replacing malloc
and free
for freestanding systems. Though it may still make sense to drop the code here and have it exclusively live in secp-zkp for a while.
@apoelstra We've discussed this a bit IRL, and it seems to me there are just a whole lot of only vaguely-overlapping concerns:
malloc
... however, that functionality isn't currently exposed.My thinking is that the interface at least needs to be dropped from the API today, because it serves no purpose, and it seems to be guiding our thinking for future APIs. We can keep the internal logic for now - and possibly bring it back if it makes sense for a particular use case - but it's easier to discuss all of that without being pre-biased by the scratch API.
@sipa these are all good points. concept ACK from me on removing the API from this library.
The fact that the scratch space API forces us to write code which has predictable (and settable) memory usage, is both very useful (but only to some users) and a large source of the complexity of accomodating the current scratch space API. However, nothing prevents us from having that property too in different ways (e.g. by passing a "max memory usage" argument to functions).
In the case of ecmult_multi
, it can be argued that we could achieve similar predictability by adding a max_batch_size
argument to ecmult_multi
and the user-facing API (e.g., schnorrsig_batch_verify
and musig_keyagg
).
This would have the advantage of freeing us from the complexity of dealing with memory usage.
The predictability of max_batch_size
is arguably similar because even with max_memory_usage
and the current scratch space's size
, developers concerned about memory usage should test the functions they call with a large number of inputs.
This is best practice and allows measuring actual memory usage (which is different due to overhead in the malloc implementation).
If testing with a large number of inputs is necessary anyway, developers could run the same tests to determine a suitable max_batch_size
.
A downside of this approach is that adding more functions that dynamically allocate memory besides ecmult_multi
risks leaking more max_...
arguments to user-facing APIs in addition to max_batch_size
.
The scratch space has been removed from the public API in #1620.
The scratch space has been removed from the public API in #1620.
Should we close this then? AFAIU there's nothing actionable for this particular issue. Of course, we still need to think about this when work on https://github.com/bitcoin-core/secp256k1/issues/1087 or MuSig2 key aggregation is continue.
I didn't close this yet because we still have a scratch space in the code base that we intend to rework.
I didn't close this yet because we still have a scratch space in the code base that we intend to rework.
Ok, sure, it's still in the code, just not in the public API. Nevermind.
Our confidence in the scratch space code isn't particularly high. It reinvents bump allocation, but it had a few issues in the past. All the code that uses scratch space is currently unreachable from the public API (except that we have
secp256k1_scratch_create
andsecp256k1_scratch_destroy
themselves in the public API.A much simpler alternative is to get rid of scratch spaces and just assume the existence of
malloc
/free
and use these directly. The disadvantage of this is that it's a bit harder for platforms that don't havemalloc
.Another alternative is to rework the scratch space code. It may be possible to simply it and improve its usability.
I think our future directions on this should be guided by whatever we feel is best for our cases: