OP_CAT: The Purr-fect Solution for Covenants?

Is OP_CAT occurring? The covenants proposal was simply assigned BIP quantity #347. However earlier than we delve deeper, let’s discover what covenants are and why Bitcoiners might want them.

Is Bitcoin a really perfect state of digital e-cash or do we would like extra from our cash on-chain?

Scratching the Floor: Bitcoin Scripts Limitations

To know covenant proposals like OP_CAT, it is essential to grok the basic limitations of Bitcoin Script as it’s in the present day. Underneath the hood, Bitcoin permits for the creation of fundamental good contracts by way of codes that outline the foundations for locking and unlocking funds. Nevertheless, Bitcoin Script, as a programming language, is pretty restricted to fundamental logic that comes into play solely when transferring cash in a brand new transaction.

In Bitcoin in the present day there isn’t any solution to pre-configure or dictate your cash’ transaction paths, or how briskly cash can transfer on the time they’re being locked up (other than hacky workflows utilizing PSBT, partially signed bitcoin transactions, which can’t correctly embody transaction charges, show deletion if unused, or stop broadcasting later).

This simplicity, whereas core to Bitcoin’s safety mannequin, introduces vital limitations within the scripting language’s capability to help even fundamental good contracts.

Linear Execution Mannequin

One limitation of Bitcoin Script is its operational mannequin the place opcodes are executed sequentially with no loops.

From this instance of a P2PKH transaction, you may see how the script executes linearly: duplicating the general public key, hashing it to an handle, verifying the hash in opposition to the lock script, and eventually checking the signature in opposition to the general public key.

The absence of looping implies that scripts usually are not Turing full and are assured to terminate, stopping points like infinite loops that might probably halt or considerably decelerate the community. Whereas this design selection permits useful resource utilization to be statically bounded, it additionally limits Script’s functionality to handle complicated workflows.

Lack of Fundamental Arithmetic

Bitcoin Script has slightly below 100 nontrivial opcodes, and considerably surprisingly there isn’t any capability to multiply, divide, or mix objects on the stack. As many customers curious about OP_CAT will know, Satoshi disabled a number of opcodes in Bitcoin in 2010, together with OP_OR, OP_MUL (multiply), OP_DIV (divide), and OP_CAT (concatenate) amongst others. The disabled opcodes have been eliminated as a result of their unique implementations had exploitable vulnerabilities that might compromise the community’s safety. However the absence of those opcodes makes it tough to do fundamental math, which may very well be helpful in easy eventualities like calculating transaction charges in a contract.

Lack of Transaction Information Visibility

Superficially, I believe most individuals assume that Bitcoin good contracts are in a position to see worth quantities and some other elements of transaction knowledge, since this data is already publicly viewable on the blockchain. However opposite to this assumption, contracts on Bitcoin usually are not in a position to set spend circumstances based mostly on transaction knowledge, as a result of Bitcoin Script has a really restricted capability to see into transaction knowledge in any respect.

If script had the flexibility to interpret extra particulars inside transaction knowledge, we may construct way more strong contracts that might do all of the enjoyable issues like implement particular spending circumstances, create multi-stage transactions, and allow extra superior safety features like vaults.

What will we do about it?

We all know Bitcoin has these limitations, and through the years many various proposals have been mentioned to introduce (or in some circumstances reintroduce) this performance. Broader experiments with Bitcoin Script, resembling Simplicity and others, goal to offer an alternative choice to stack-based constraints. Opcodes like OP_MULTISHA256, OP_LESS, and OP_LE32TOLE64 goal to improve Bitcoin’s arithmetic talents. Proposals like OP_CTV and OP_CAT that cope with introspection opcodes are grouped below the time period covenants.

So what precisely is the distinction between good contracts and new time period covenants?

Good Contracts vs. Covenants

Good contracts are self-executing transactions that switch funds with out intermediaries. In Bitcoin in the present day, the good contracts are restricted to the act of locking and unlocking bitcoin with Bitcoin Script. Covenants goal to boost Bitcoin’s good contracts performance by enabling customers to regulate how their funds are spent in future transactions.

By enabling Script to interpret transaction knowledge, we successfully create a method for that knowledge for use in contract logic.

These are simply among the extra fascinating introspection opcodes for covenants performance:

  1. OP_TXHASH: Gives the hash of a transaction’s inputs (or outputs), and offers Script the flexibility to confirm and implement circumstances based mostly on transaction knowledge.
  2. OP_CSFS + OP_CAT: The 2 collectively enable scripts to test signatures in opposition to any knowledge, not simply the transaction itself. This implies Script can confirm circumstances based mostly on transaction knowledge or exterior data, increasing the chances for validation inside Bitcoin scripts.

These two opcodes are deliberately broad, enabling complicated validation processes and introspection capabilities. Others are extra slim in scope and are designed to be a extra restricted type of covenants.

  1. OP_CHECKTEMPLATEVERIFY (CTV): Permits a transaction output to embed a template of a future spending transaction, enabling covenants in a extra constrained method.
  2. OP_VAULT: Allows a selected type of covenant used for “vaulting”, which lets customers specify a transaction vacation spot however not truly transfer cash besides after a delay.

Then there may be OP_CAT by itself, which isn’t instantly an introspection opcode…

  1. OP_CAT: Allows Script to concatenate two components on the stack, which is helpful for combining completely different items of knowledge inside a script.

OP_CAT doesn’t appear to have any introspection talents, so what’s occurring right here?

OP_CAT: Unraveling The entire Potentialities

Transaction Introspection

In 2021, Andrew Poelstra wrote about OP_CAT introspection methods in a weblog publish. He supplied particular examples however presumed readers had prior information of comparable strategies. Right here, I am going to goal to simplify that clarification for higher understanding.

In Bitcoin Script, there are solely three main opcodes that let you introspect the transaction knowledge: CHECKLOCKTIMEVERIFY, CHECKSEQUENCEVERIFY, and CHECKSIG. Moreover, there are variants like CHECKSIGVERIFY, CHECKSIGADD, CHECKMULTISIG, and CHECKMULTISIGVERIFY, that are primarily minor variations of CHECKSIG. The primary two solely allow you to see if the test is verified, offering a reasonably slim performance. CHECKSIG is comparable, however the distinction right here is that it means that you can seize the signature and the general public key on the stack. Attention-grabbing.

Historically, we consider concatenation as a perform that joins two objects collectively, however we will additionally use it to separate or break up an merchandise, on this case—the signature into an (r, s) pair.

How will we derive OP_SPLIT performance from OP_CAT?

“You probably have some huge object you may break up it into two by asking the consumer to spend time to offer the 2 items. You CAT them collectively and test equality mainly. You may all the time invert each operation this manner. With CAT by itself you may break aside signatures.” — Andrew Poelstra, TABConf 2021

What is going on right here?

By requiring the consumer to offer the signature, public key, and transaction, you may break up the signature into its element elements, then checking every half independently in opposition to the transaction knowledge. This system may be considered as a type of splitting or combining, because it validates that the signature and public key are certainly the elements of a legitimate transaction.

How does all this get us introspection?

“In Taproot the place we now have Schnorr signatures utilizing OP_CAT and the Schnorr signature verification opcode it seems that it’s attainable to get a type of non-recursive covenant the place you actually get a transaction hash. Not even like a humorous mangled transaction hash however a literal SHA2 hash of all of the transaction knowledge onto the stack.” — Andrew Poelstra, TABConf 2021

Poelstra goes on to exhibit how one can get a SHA2 hash for transaction inputs or outputs left on the stack. We’ll skip the moon math right here, however the implication is that with OP_CAT we will constrain elements of a transaction as a requirement of the unlocking script. We are able to constrain the ship handle or worth being despatched of that transaction, the place the transaction hash serves as the important thing to unlock it.

Vaults

Utilizing the identical strategies give us transaction introspection and rapidly give us a fundamental model of vaults. Following the logic outlined in Poelstra’s weblog, a developer by the title of Rijndael proved that we will do that with OP_CAT alone in his implementation of Purrfect Vaults.

“Re-building a TXID on the stack to introspect earlier transactions was truly simpler than I anticipated.” — Rijndael

With vaults, customers specify the following handle that their funds should go to, offering mechanisms for fund restoration in case of key compromise, and decreasing the motivation for personal key theft.

Merkle Bushes for Script

In Bitcoin in the present day, Merkle Bushes are the information construction used for knowledge verification, synchronization, and kind of ‘chaining’ the blockchain’s transactions and blocks collectively. The OP_CAT opcode, which allows the concatenation of two stack variables, when used alongside SHA256 hashes of public keys, facilitates a simple Merkle tree verification course of for scripts. This method, initially proposed by Pieter Wuille in 2015, was efficiently carried out within the Liquid community.

Think about a tree construction brimming with numerous spending circumstances, resembling hash preimages, timelocks, and public keys, generally known as tree signatures.

Tree Signatures

OP_CAT allows the creation of Tree Signatures which:

“…Present a multisignature script whose measurement may be logarithmic within the variety of public keys and might encode spend circumstances past n-of-m. As an illustration, a transaction lower than 1KB in measurement may help tree signatures with a thousand public keys. This additionally allows generalized logical spend circumstances.” — BIP writer Ethan Heilman, on the bitcoin-dev mailing record

This may allow the validation of any hashed content material inside the tree, sustaining knowledge integrity and trustworthiness with out including pointless bulk or bloat to the blockchain.

What’s fascinating about all of this?

Recursive Covenants

You probably have the flexibility to look at a transaction and apply constraints to sure elements of it, you may arrange circumstances that carry over by way of a number of transactions, successfully creating a sequence of ongoing restrictions. This idea known as a recursive covenant. OP_CAT is a singular proposal as a result of it provides us a lot energy for simply 10 new traces of code. It has the flexibility to deal with all three of the preliminary limitations we lined on the onset of the publish: transaction knowledge visibility, higher math performance, and its linear execution mannequin.

Whereas OP_CAT could seem easy at first, it unlocks vital potential when leveraged creatively. It serves as a constructing block for much more performance method past the scope of this dialogue, like Put up-Quantum Lamport Signatures.

Is This Protected?

Earlier than OP_CAT was initially eliminated, when mixed with OP_DUP (duplicate), and used repetitively to duplicate an initially-1-byte worth on the stack, reminiscence utilization may very well be made to blow up. This might have been used as a denial-of-service (DoS) assault because of elevated reminiscence consumption. The brand new proposal trivially prevents this assault by imposing a 520-byte restrict on stack components.

Is there a hazard of a contract operating without end?

If by this we imply, does OP_CAT change the execution mannequin of Script to imply that it now not statically bounds its useful resource utilization (as a linear perform of the Script measurement)? No.

Would covenants create a marketplace for different cash on high of Bitcoin?

You probably have a recursive covenant, sure, you may technically construct up complicated layer-2 functions, together with NFTs, decentralized exchanges, and quantum cats. Nevertheless, doing so isn’t trivial. It’s laborious to see any critical markets achieve this.

Are you able to completely “taint” cash through the use of CAT?

Within the case of coloured cash and NFTs, issuing these belongings the consumer successfully ‘burns’ a satoshi, marking it in a method that signifies possession of the ‘layer-2’ asset. This course of is named ‘tainting’ cash. However solely the proprietor of a coin can mark their coin, and Bitcoin wallets will now not acknowledge it (except their authors explicitly add code to allow this). The ensuing cash wouldn’t be accepted by bitcoin wallets. Most likely they might be accepted by cryptocat wallets or one thing like that, however that is irrelevant to most bitcoin customers.

Would this create an MEV downside on Bitcoin?

A key level of distinction between Bitcoin and Ethereum is transaction visibility. In contrast to Ethereum, not all elements of the contract are essentially clear, that means that Bitcoin miners don’t have the identical capability to see inner contract state and front-run them.

The principle concern of OP_CAT by economically minded Bitcoiners is the potential for Miner Extractable Worth (MEV). As mentioned extra extensively in my earlier publish on the topic. Many customers are involved that if we make layer-2 contracts technically attainable, MEV will develop into inevitable. However is that this true? Particularly, does the technical feasibility of layer-2 cash on Bitcoin suggest their inevitable creation and adoption?

You could possibly think about constructing easy swap contracts or comparatively inefficient NFTs, however increase one thing as complicated as DEXs with automated market makers appears extraordinarily unlikely and isn’t ever one thing we’ve seen on Liquid regardless of the ‘technical chance’ for it.

So is OP_CAT actually excellent?

Hardly, removed from it. Some of us would like to see recursive covenants, whereas others merely don’t wish to see Bitcoin change in any respect.

A faction of Bitcoiners, “ossificationists”, advocate for preserving Bitcoin in its present state and think about any protocol upgrades with skepticism. They’re notably involved that vital modifications, just like the introduction of covenants, may undermine the community’s decentralization. Their argument hinges on the assumption that it is best to stay intently to Bitcoin’s unique imaginative and prescient. The irony being that OP_CAT was initially a part of Bitcoin, fuels a counterargument. Some consider that bringing OP_CAT again may truly realign Bitcoin with Satoshi’s preliminary imaginative and prescient.

If you would like to see among the safety features that recursive covenants may make attainable, OP_CAT can be good, however undoubtedly not as good as a full-blown Lisp-esque scripting language. The issue right here being that this may be a large change to Bitcoin, that’s not more likely to discover its footing anytime quickly.

Or perhaps, you are on the opposite finish, and also you’d want the simplicity of non-recursive like OP_CTV or OP_VAULT. Non-recursive covenants are less complicated and simpler to cause about, with out the chance of making an uncontrolled chain of constraints.

What if some model of recursive covenants have been inevitable?

Through the years, builders have seen that nearly any extension to the transaction validation logic may very well be used to emulate the performance of OP_CAT.

Within the Script universe, there are two realms, based mostly on the dimensions of the stack components. For stack components bigger than 4 bytes, you may examine for equality, interpret as a key a signature, or hash it. For stack components lower than or equal to 4 bytes, you may deal with them as objects to do arithmetic or branching. With a RISC-V processor operating on a BitVM, you are able to do actually something. Something that means that you can emulate OP_CAT, break stack components up, or concatenate them collectively brings these two realms collectively, so to ‘do something’ with Script.

Researchers like Andrew Poelstra anticipate we may do recursive covenants with just about any new opcode. If true, that might be a justification for working in direction of a solution to do them nicely.

Is OP_CAT the seemingly path ahead for covenants?

If covenants usually are not simply fascinating, however inevitable, how will we guarantee it is carried out in such a method that will get extra Bitcoin customers sending trustlessly like Satoshi initially envisioned? Whereas ossificationists stay divided, nonetheless OP_CAT continues to ascend as a powerful contender within the covenants debate.

OP_CAT isn’t probably the most elegant chisel, nevertheless it’s one with one of the best ratio of energy to complexity, that might enable builders to carve up some superb new options.

It is a visitor publish by Kiara Bickers. Opinions expressed are totally their very own and don’t essentially mirror these of BTC Inc or Bitcoin Journal.