P2MS
Pay To Multisig — trava bitcoins a múltiplas chaves públicas
BIP 11: M-of-N Standard Transactions
P2MS (Pay To Multisig) é um padrão de script que permite travar bitcoins a múltiplas chaves públicas e exigir assinaturas de algumas (ou todas) dessas chaves para destravá-lo.
A notação geral para scripts multisig é "m-de-n":
- m é o número de assinaturas exigidas.
- n é o número total de chaves públicas.
Por exemplo, um script 2-de-3 exige 2 assinaturas de 3 chaves públicas para ser destravado.
Embora o P2MS seja um script padrão, é mais comum embrulhar esse tipo de script em um P2SH ou P2WSH.
Script Legado. Este é um padrão de script legado e raramente usado diretamente nas saídas.
Uso
Como o P2MS funciona?
ScriptPubKey (trava)
Para criar um script P2MS, você inclui no ScriptPubKey:
- Um opcode numérico
Mpara indicar quantas assinaturas são exigidas. - Cada uma das chaves públicas.
- Um opcode numérico
Npara indicar quantas chaves públicas há. - O opcode
OP_CHECKMULTISIGno fim.
Então, em um script 2-de-3, são exigidas OP_2 assinaturas para destravar as OP_3 chaves públicas:
OP_2 <chave pública 1> <chave pública 2> <chave pública 3> OP_3 OP_CHECKMULTISIG Um P2MS pode conter chaves públicas comprimidas (33 bytes) e não comprimidas (65 bytes).
O P2MS é um script padrão para até 3 chaves públicas. É possível criar um multisig com mais chaves, mas ele será considerado não padrão e não será retransmitido pelos nós. Porém, você pode usar até 15 chaves públicas se embrulhar o P2MS dentro de um P2SH.
ScriptSig (destrava)
Para destravar um P2MS, você fornece o número exigido de assinaturas. Para o exemplo 2-de-3, são 2 assinaturas:
OP_0 <assinatura 1> <assinatura 2> Bug do OP_CHECKMULTISIG.
Este opcode tem um bug em que ele retira um elemento a mais da pilha do que precisa (erro de "off-by-one"). É por isso que adicionamos um "valor dummy" no início do ScriptSig, para compensar isso e evitar que o script falhe.
Desde a BIP 147, esse valor dummy precisa ser OP_0 ao usar o P2MS diretamente, ou o byte vazio 00 ao usar o P2MS embrulhado em um P2WSH.
Você precisa fornecer as assinaturas correspondentes na mesma ordem das chaves públicas no ScriptPubKey.
Execução
Quando o script executa, todas as assinaturas e chaves públicas são empurradas para a pilha. O OP_CHECKMULTISIG então verifica cada assinatura contra as chaves públicas (na ordem), e empurra um OP_1 para a pilha se o número exigido de assinaturas for válido.