Comprobar si varias firmas coinciden con una clave pública específica

Supongamos que tiene una empresa que tiene tres líderes principales llamados A, B y C, además la empresa tiene 5 accionistas llamados S1 a S5. La regla de decisión para gastar cualquier moneda de la dirección de la empresa es presentar 1 de la firma de los principales líderes y otras tres firmas de los accionistas. Por ejemplo, el siguiente script de desbloqueo funciona (ya que contiene uno de los líderes):

<sig_S1> <sig_A> <sig_S2> <sig_S5> 

pero no este:

<sig_S1> <sig_S4> <sig_S3> <sig_S5> 

¿Cómo puedo comprobar si entre las multifirmas existe una firma que corresponde a una clave pública específica, en este caso, aprenderé que la firma de un líder seguramente existe? por ejemplo, si nos enteramos de 5 firmas siempre que exista la firma de A, y el código de bloqueo se verá de la siguiente manera:

(3 times duplicate of all signatures provided)
(check for the existence of A in signatures)
OP_IF 
   4 <pub_A> <pub_S1> <pub_S2> ... <pub_S5> 5 OP_CHECKMULTISIG
OP_ENDIF
(the same as above for B)
(the same as above for C)

Respuestas (1)

Creo que podría funcionar con un RedeemScript como este (no he probado los scripts):

OP_IF
  3 <pub_A><pub_B><pub_C> 3 OP_CheckMultiSig
OP_ELSE
  1 <pub_A><pub_B><pub_C> 3 OP_CheckMultiSigVerify
  4 <pub_S1><pub_S2><pub_S3><pub_S4><pub_S5> 5 OP_CheckMultiSig

Explicación: El script de redención tiene dos partes:
- OP_IF: esta parte podría eliminarse, está ahí para permitir que los "líderes" gasten los fondos sin necesidad de las firmas de los "accionistas". Dependiendo del propósito, podría eliminarse (elimine las primeras 3 líneas de RedeemScript y la firma no requiere OP_TRUE/OP_FALSE).
- OP_ELSE: esto proporciona lo que necesita con 2 operaciones de firma múltiple. El primero requiere al menos una firma de 3 firmas de "líderes" y realiza una verificación OP_CheckMultiSig ( no queda verdadero/falso en la pila después de la ejecución) y el segundo requiere 4 de 5 firmas de "accionistas".

Para gastar, se debe proporcionar uno de estos scripts de firma ( OP_0es obligatorio debido al error en los CheckMultiSigOP):

OP_0 <sig_A><sig_B><sig_C> OP_TRUE <RedeemScript>

o

OP_0 <sig_S1><sig_S2><sig_S4><sig_S5> OP_0 <sig_A or B or C> OP_FALSE <RedeemScript>
Que tal primero chequear con toda la clave publica de los accionistas con checkmultisig, si el resultado fuera cierto sabemos que en las firmas siempre no existe ninguno de los lideres, si eso no fuera cierto podriamos chequear por 4 s1, s2,.., s5, a, b, c 8 comprobar multisig.
Eso requeriría que cada accionista firme la transacción dos veces, también aumenta mucho el tamaño de la firma (y la transacción).
En lugar de dos firmas, podríamos duplicarla en el script de suerte.