def streamable(cls: Any): """ This is a decorator for class definitions. It applies the strictdataclass decorator, which checks all types at construction. It also defines a simple serialization format, and adds parse, from bytes, stream, and __bytes__ methods. Serialization format: - Each field is serialized in order, by calling from_bytes/__bytes__. - For Lists, there is a 4 byte prefix for the list length. - For Optionals, there is a one byte prefix, 1 iff object is present, 0 iff not. All of the constituents must have parse/from_bytes, and stream/__bytes__ and therefore be of fixed size. For example, int cannot be a constituent since it is not a fixed size, whereas uint32 can be. Furthermore, a get_hash() member is added, which performs a serialization and a sha256. This class is used for deterministic serialization and hashing, for consensus critical objects such as the block header. Make sure to use the Streamable class as a parent class when using the streamable decorator, as it will allow linters to recognize the methods that are added by the decorator. Also, use the @dataclass(frozen=True) decorator as well, for linters to recognize constructor arguments. """ cls1 = strictdataclass(cls) return type(cls.__name__, (cls1, Streamable), {})
def cbor_message(cls: Any) -> Type: """ Decorator, converts a class into a strictdataclass, which checks all arguments to make sure they are the right type. """ cls1 = strictdataclass(cls=cls) return type(cls.__name__, (cls1, ), {"__cbor_message__": True})