This required a few changes in the grammar describing descriptor templates: the single symbol KP
is no longer enough to cleanly represent the syntax. Therefore, it’s now replaced by a more fine-grained symbol hierarchy:
KEY
, mapping 1-on-1 toKEY
expressions of descriptorsKP
, key placeholders, that represent a single root key, or an aggregate musig key; regardless of the nature of the key, key placeholders are what is followed by/**
or/<M;N>/*
.KI
, key index, the actual “pointer” to the key information vector.
While the validity checks to avoid pubkey reuse before this change were feasible by looking at all the @i
expressions in the descriptor template, they are now at the level of the KEY expressions, by comparing their key placeholders.
This means that the specs do not prevent having @i
somewhere and musig(@i,...)
elsewhere (which does not cause pubkey reuse in the actual scripts).
Note that there is no breaking change with the previous specs, just more fine-grained grammar in order to keep everything working in the presence of musig
.