Bitcoin Ordinals, Inscriptions and Curses: A Primer
By enabling widely-used NFTs on Bitcoin for the first time, Ordinals have become one of the most exciting recent developments in the Bitcoin ecosystem. As of writing (early 2024), Bitcoin Ordinals trading volume rivals that of other major NFT ecosystems, including Ethereum and Solana.
The implementation of Ordinals differs from NFT implementations on other ecosystems in notable ways, however, and it can often be confusing to understand the nuances, terminology, and implications of how they work. In this primer, we’re going to dive deeper into what some of the commonly used terms and concepts in the Ordinals ecosystem mean, how they work, and what developers building NFT applications in this space need to know.
Context: Why have NFTs on Bitcoin been difficult to implement?
Historically, the primary challenge to implementing NFTs on Bitcoin stems from its limited scripting language and lack of native support for smart contracts, or a similar concept. Bitcoin's scripting language, Script, is intentionally simplistic and not Turing-complete, meaning it doesn't support complex logic and computations. This design choice prioritizes security and stability but limits Bitcoin's ability to directly support advanced functions like those required for smart contracts.
In contrast, Ethereum was built with a different philosophy, incorporating a Turing-complete language (Solidity) and native smart contract functionality. This enables the creation of decentralized applications (dApps) and intricate token standards like ERC721, the backbone of Ethereum's NFT ecosystem. Similarly, Solana offers a high-performance blockchain with its token program, which simplifies the process of creating and managing tokens, including NFTs, on its network. The token program provides a framework for defining and using tokens, making Solana an attractive platform for NFT development. These features in Ethereum and Solana offer a stark contrast to Bitcoin's more rudimentary scripting capabilities, explaining why NFTs have historically been challenging to implement on the Bitcoin blockchain.
What is an Ordinal?
Developers and NFT enthusiasts often refer to a specific NFT as a “Bitcoin Ordinal”, but strictly speaking these NFTs on Bitcoin are making use of a system called Ordinals.
In mathematics, the term "ordinal" typically refers to ordinal numbers, used to describe the order of elements in a set or sequence. Ordinal numbers extend the concept of natural numbers by not only denoting quantity but also indicating position or rank in a well-defined sequence, such as first, second, third, and so on.
It’s this simple concept that underpins the ability to generate NFTs on Bitcoin, by linking it with “satoshis” - which are the smallest unit of Bitcoin (equal to 1/(100^8) of a single Bitcoin). Each satoshi can be numbered by the order in which they were mined. As each satoshi can therefore be uniquely identified, this insight unlocked the ability to associate them with non-fungible data.
Inscriptions - actually creating NFTs on Bitcoin
Simply numbering satoshis isn’t enough in of itself to create NFTs on Bitcoin of course. That’s where Inscriptions come in.
Inscriptions are a way to create bitcoin-native NFTs (often also referred to within the Bitcoin community as “digital artifacts”), without needing a side-chain or a separate token. These inscriptions are essentially arbitrary content inscribed onto each ordinal-ly ordered satoshi, which can then be transacted like any normal bitcoin. The technical structure of an inscription often mimics that of a web response, with fields for content type, encoding, and other metadata before an optional body. Due to limitations of space within each Bitcoin block, inscriptions are generally limited to data of less than 4MB in size (although newer standards like recursive inscriptions and BRC721E are changing this).
Inscriptions are immutable - so unlike NFT standards on other ecosystems, once they have been created, they cannot be altered. (Recursive inscriptions help overcome this limitation, which will be the subject of another upcoming article).
Therefore, if ordinals are the system by which Bitcoin NFTs are organized, Inscriptions are the way in which they are actually embedded on to the blockchain itself.
Take this Bitcoin Puppet for example:
Here’s a link providing info on the transaction in which it was originally inscribed.
It involves satoshi number (or sat number) 1534051521927656. Digging into the details of the transaction itself, you can see the metadata that defines the NFT / digital artifact:
Breaking some of this down:
- OP_PUSHBYTES_3 6f7264 - this pushes a small amount of data on to the stack, and the hex string 6f7264 translates to 'ord' in ASCII - this signifies an Ordinal within the standard
- OP_PUSHBYTES_10 696d6167652f77656270 - this pushes another 10 bytes onto the stack. The hex string 696d6167652f77656270 translates to 'image/webp' - indicating the type
- OP_PUSHDATA1 a26a61747472… - this pushes a larger amount of data, and is where the main content (the image) begins
As can be seen, this is a creative use of Bitcoin transactions to generate NFT-like objects, with heavy emphasis on efficiency. Despite the limitations, the range and types of Ordinals NFTs generated so far have been diverse, and rapid experimentation continues throughout the ecosystem.
Querying inscriptions using Inscription IDs
While Ordinals define the numbering system, and inscriptions are the actual process by which NFTs are embedded within the Bitcoin blockchain, additional concepts are required to actually reference and query specific NFTs. That’s where inscription IDs come in. Inscription IDs are a combination of the transaction hash involved with the inscription, plus an index. As they do not change, inscription IDs are the preferred way to query and reference a specific Bitcoin Ordinal NFT. Most marketplaces supporting Ordinal trading will reference items by inscription ID, for example.
For developers, by using SimpleHash’s NFT by Token ID endpoint, it's possible to directly pass an Inscription ID to get the relevant Ordinal. Bitcoins indexed in the SimpleHash platform are identified by their Inscription ID, keeping it consistent across the schema and the available endpoints. The Bitcoin Puppet above has an inscription ID beginning with 514b67a849d... for example.
Inscription numbers and “curses”
Inscription IDs aren’t the only way Bitcoin NFTs are referenced however - developers have to contend with another major approach that involves inscription numbers, and so-called “cursed” inscriptions.
Inscription numbers are intended to reference each inscription - from earliest to newest - except that there’s debate over where counting should begin from.
After inscription numbers began to be used, certain segments of the community argued that certain inscription types should have actually already been included as part of this approach. Instead of re-ordering all existing inscriptions, negative numbers were used instead. (i.e., from -1 and becoming successively more negative). These inscriptions are known as “cursed” inscriptions and are still being created - meaning there are now inscriptions being created at higher and higher positive inscription numbers, and (until a very recent change) ones that are more and more negative too.
Partly because of this ambiguity and complexity, it’s usually recommended for developers to stick to inscription IDs.
Piecing it all together
Imagine that to date, there have been only 1000 satoshis created, numbered 0 through 999 as part of the ordinals system.
As Bitcoin transactions occur, new inscriptions are embedded in some of them, and are mapped to a particular satoshi. Since satoshis are now mixed across many different wallets, the inscriptions don’t occur in the same order as the satoshis are numbered. Satoshi number 247 might be associated with an inscription before satoshi 602, which might be after satoshi 510 is mapped to one, and so on.
In this simplified view, each satoshi is numbered by the ordinals system, from 0 to N. As Bitcoin transactions occur, some are inscribed with inscriptions - the transaction hash plus an index will then define the Inscription ID of that particular NFT. The satoshi involved will be decorated with one more more inscriptions that can then subsequently be referenced. With regards to inscription numbers, this inscription can also be referenced by a number one higher (or lower, if negative) than the previous ordinal inscription on Bitcoin.
Transactions are permanent and immutable, so historically they have only included the inscription(s) included at the time of the transaction. (With recursive inscriptions shaking this up). Satoshis can be mapped to multiple inscriptions (and therefore also inscription numbers) as the number of Ordinals increases, and the satoshis involved in new Bitcoin transactions get re-used.
Even though using inscription IDs is recommended, querying Bitcoin NFTs by inscription number doesn’t have to be confusing either (even if using cursed numbers) - and SimpleHash offers a convenience endpoint to do so. Pass the positive or negative inscription number to NFTs by Inscription Number and get back the correct NFT in question. The Bitcoin Puppet above has the inscription number 53147207 for example.
An ecosystem in flux
It’s important to note that the standards associated with Ordinals, Inscriptions and NFTs on Bitcoin more broadly are in a state of flux, and not nearly as well defined in terms of documentation, or developer consensus as on other chains. Given that Bitcoin Ordinals only jumped to the fore in 2023, this isn’t surprising, and it’s likely the ecosystem will continue to evolve, and cover additional use cases, with even more experimentation as the adoption and types of NFTs / digital artifacts expand.
SimpleHash helps with this by keeping up with the latest developments within the Bitcoin NFT ecosystem, incorporating the core changes, and handling edge cases and emerging standards. Using the SimpleHash NFT API, developers can query Bitcoin NFTs using a schema that is consistent with NFT types on other chains.
If you’re building within the Bitcoin Ordinals ecosystem, or NFTs more broadly, we’d love to hear from you - feel free to reach out at firstname.lastname@example.org.