Overview

A Universe is repository for genesis/issuance events, helping users verify that the assets they’re receiving were actually issued by the issuer they expect. Anyone can run a Universe as anyone could run a blockchain explorer but issuers of a given asset will certainly run one for their users.

A universe is just a centralized SMT storage/coordination service (like GitHub in the git case) that people can use, but it can also be fully distributed, each party can have the same distributed SMT that they can sync by exchanging transactions accompanied by proof files for those transactions. From a pure technical perspective, Universes aren’t needed, they exist mainly to improve the user experience and provide transparency

With Taproot Assets, your assets UTXOs are living inside a Bitcoin UTXO. As in Bitcoin, with Taproot Assets, you will have to ask a universe to verify the genesis/issuance events to check if the transaction you receive or send are valid.

You can download a Taproot Assets wallet, sync with an issuer’s Universe server, and immediately be able to verify the total supply of a given asset, in which block each issuance transaction occurred, and validate that the assets someone is trying to transfer to her were issued by the issuer she’s expecting.

Universe servers like bitcoin nodes for a specific Taproot asset, in that they contain the historical data necessary to validate that assets being received were actually issued by the expected issuer.

Universe is a service and a service may know about multiple assets (Multiverse) or only about a single output (Pocket Universe).

An Asset Universe is a publicly auditable merkle-sum sparse merkle tree (MS-SMT) over one or several assets. Unlike the normal Taproot Asset tree, a Universe isn’t used to custody Taproot Assets. Instead, a Universe commits to a subset of the history of one, or many assets. A close analogue to a public Universe is a block explorer

A UniverseKey is composed of the Universe ID (asset_id/group_key) and also a leaf key (outpoint || script_key)