SiaFoundation / core

Core packages for the Sia project
MIT License
51 stars 7 forks source link

types: Implement generic encoder functions #170

Closed lukechampine closed 1 month ago

lukechampine commented 1 month ago

Adds EncodeSlice, EncodeSliceCast, EncodeSliceFn, and their decoder counterparts, as well as Cast methods for increased type safety. This makes most encoding methods more succinct, but the real motivation was that it allows us to centralized the handling of malicious slice lengths (see discussion on #166). I will grudgingly admit that generics solved a real problem here. 😝

I'm not crazy about the API; it would be nicer if we could somehow unify these three functions, and if we could ditch the Cast methods. I explored replacing EncodeSliceFn with a BasicEncodable type (wrapping uint64, bool, etc.), but it was kinda gross, requiring a run-time type-switch on every encode call.

I ran one manual benchmark to see whether this had a big performance impact, and it looked ok. We should benchmark it more thoroughly though.