An Illustrated Guide to Plumbing of Genetic Provenance
A do-it-at-home manual
See on Ordinals Explorer: Initial Root, Collection Root, and Collection Member.
Stitching
Let’s review the following collection that we made:
ProtoGene (Initial Root)
Here is the ProtoGne (Initial Root), a.k.a the author’s representation (click here to see it on ordinals explorer):
Note the Initial Root genesis transaction 4957c...a,
and the output transaction 2eeb3...:1.
This is key information for Generic Provenance.
Initial Root was created in transaction 4957c...a. Let's check this transaction using any block explorer:
Note the Initial Root’s genesis transaction output - bc1psk...9.
If we dig deeper and check all transactions related to its address, we can easily see the on-chain connection. Genetic information spreads from transaction 4957c...a and goes through subsequent transactions until reaching ead0d...c:
Collection Root (aka Parent)
The last transaction associated with the Initial Root’s genesis transaction (ead0d...c) became the second input (#1) for the genesis transaction of the Collection Root.
You can see it here on the Ordinals Explorer:
Here is how the Blockstream explorer shows it:
First Collection Member (aka Children)
The genesis transaction for the First Collection Member (“Quote #001”) uses the Collection Root’s transaction output (2eeb3...9) as the second input (#1).
You can see it here on the Ordinals Explorer:
Here is how the Blockstream explorer shows it:
Second Collection Member
The Second Collection Member (“Quote #002”), similar to the First Collection Member, uses the current transaction output of its Collection Root (3996d...d) after the creation of the first collection member.
You can see it here on the ord explorer:
And here's how Quote #002 looks like on the Blockstream explorer:
… et cetera.
Tag 3
We also use tag 3 (<0x03>
) in the witness script of a child to refer to the genesis TrxID of its parent:
<taproot_pubk> OP_CHECKSIG;
OP_0 OP_IF
<'ord'>
<0x01> <'conten-type=\'<some relevant format>''>
<0x03> <parent-genesis-TrxID>
OP_0
<content_0>
<content_1>
<content_2>
<content_3>
.....
OP_ENDIF;
For example,
rpc.getrawtransaction('93314da0a9cfb410cdbc09df020898f0249d6a86144c0a80cb0c491855852a9b', True)
which is the reveal of the second inscription in the collection, will be:
2f8b1...
OP_CHECKSIG
OP_0
OP_IF 6f7264
01 696d6167652f7376672b786d6c
03 891251b21f3e13db1aada8bd9297c0841d41635960e66c54dd2f893ba839eb2e
OP_0 3c737667207769647 ... <content>
The 891251b21f... <32 bytes> ... 93ba839eb2e
is the Collection Root Transaction ID recorded as little-endian binary. Let’s check it by reversing the bytes:
>>> ba = bytearray.fromhex("891251b21f3e13db1aada8bd9297c0841d41635960e66c54dd2f893ba839eb2e")
>>> ba.reverse()
>>> print(ba.hex())
2eeb39a83b892fdd546ce6605963411d84c09792bda8ad1adb133e1fb2511289
The returned value is the Collection Root Transaction ID.