
Os contratos multisig nas redes descentralizadas modernas são uma ferramenta poderosa que permite proteger de forma simples e confiável os fundos em contas coletivas, além de realizar transações com vários participantes. Se você estiver interessado em usar esses endereços, basta entender a mecânica de possuí-los e ter uma boa idéia da ordem das transações. Trabalhar com esses endereços requer a participação de várias contas.
Apesar do mesmo nome e lógica de trabalho semelhante, algoritmos e métodos internos para interagir com endereços protegidos por várias assinaturas são bastante diferentes no Bitcoin e no Ethereum. É sobre esse dispositivo interno que será discutido neste artigo.
Falaremos sobre duas redes: Bitcoin e Ethereum. Em outras blockchains, o acesso multisig a ativos criptográficos pode ser implementado de uma maneira completamente diferente.
1. Introdução
Suponha que tenhamos uma tarefa de proteger os fundos contra o acesso não autorizado no endereço (conta, se a terminologia bancária estiver mais próxima de você), onde o dinheiro da organização é armazenado. O acesso ao endereço (a capacidade de criar uma transação dele para um externo) está disponível para várias pessoas, por exemplo, o contador geral, financeiro e chefe. Para proteger o dinheiro, se alguém desta trindade é forçado a assinar uma conclusão, existe multisig. No Bitcoin e no Ethereum, você pode criar um endereço, cuja retirada de fundos exige não um, mas várias confirmações.
Agora, cada um dos três participantes, desejando criar uma transação para retirada, deve fornecer sua assinatura confirmando seu consentimento para a transação. Quando assinaturas suficientes são coletadas, os fundos são transferidos. Essa lógica é chamada multisig: enviando N de M assinaturas (M> N) para confirmar a operação.
Para redes descentralizadas, multisig é um padrão nativo, já que qualquer transação válida enviada para algum endereço por design contém uma assinatura eletrônica criada pela chave secreta do remetente, de modo que quase toda a funcionalidade necessária para endereços multisig já está presente nas blockchains mais modernas.
O mais interessante é o endereço multisig mais simples 2/3, cuja conclusão é possível apenas com a concordância de dois dos três participantes. Esse multisig é capaz de fazer muitas transações com três partes convenientes e seguras e resolver problemas quando dois participantes confiam no terceiro para julgá-los. Quase todos os serviços financeiros nos quais existe uma terceira parte confiável são implementados usando o multisig 2/3. Por exemplo, pegue uma carta de crédito: o pagador ganha o dinheiro e não pode aceitá-lo, a menos que convença o banco (onde os documentos de compra não chegaram) ou o destinatário (por vontade própria) a concordar com isso. O destinatário também não poderá cobrar o dinheiro se o vendedor não o devolver (por vontade própria) ou o banco não informar que os documentos necessários chegaram até ele e ele os verificou. No esquema, o serviço do banco é indecentemente simples: quando ele vê um acordo sobre a compra de um apartamento, em vez de levar a chave da célula para a loja, simplesmente envia uma aprovação para um endereço multisig.
As tarefas de contabilidade e pagamento por serviços também gravitam em direção a multisig 2/3: muitas vezes exige que terceiros decidam se o serviço foi prestado e em que medida. Multisig, onde uma das três assinaturas pertence à organização, que decide se o serviço foi prestado ou não (por exemplo, ao tribunal), significa que o tribunal, tendo decidido a favor de uma das partes, simplesmente assina sua decisão e envia a transação, desbloqueando automaticamente os fundos para o lado vencedor. Para serviços B2C, como Uber ou AirBnB, o multisig, embora implicitamente, é o principal padrão de trabalho: quando o serviço é prestado, é a assinatura do pedido pelo serviço que inicia o envio de fundos do cliente para o motorista ou o proprietário do apartamento.
Em geral, um fuzil de assalto Kalashnikov, multisig - convenientemente implementado: barato e alegre, é adequado para uso doméstico e a taxas de milhões de dólares. E no blockchain, tudo isso é "sem registro e SMS" (do ponto de vista da segurança, essa, aliás, é uma tese bastante séria, se você pensar sobre isso).
Vamos considerar duas blockchains - Bitcoin e Ethereum. Devo dizer que o dispositivo multisig interno neles é bem diferente, tudo funciona de maneira diferente. Mas não vamos nos antecipar.
Bitcoin multisig
Bitcoin na verdade não é tão simples como pode parecer para muitos. Seu design permite implementar esquemas leves e ao mesmo tempo muito seguros para obter acesso a fundos. Bem, acrescento que, puramente na minha opinião pessoal, as estruturas e algoritmos do Bitcoin são bem pensados, ideais e simplesmente bonitos. A tradução padrão de X bitcoins de endereço para endereço é apenas o tipo padrão de transação, a ponta do iceberg de potenciais recursos de Bitcoin. A transação padrão para traduzir o BTC do ponto de vista do código é o multisig 1/1 mais simples: para usar bitcoins X do endereço a1, você precisa anexar uma assinatura eletrônica à transação usando a chave secreta que pertence ao endereço a1. Vamos dar uma olhada na estrutura de uma transação de Bitcoin e aprofundar um pouco mais sobre como ela funciona.

Existe um requisito no Bitcoin: todo o BTC armazenado em um determinado endereço é sempre gasto como um todo. Ou seja, tendo confirmado seu direito de possuir um endereço, a transação gasta todo o saldo, distribuindo-o em várias saídas. Na vida real, deixando a diferença entre entradas e saídas para o mineiro como comissão, mas para este artigo isso não é significativo.
Imagine a situação. Vasya recebeu 50 BTC. Vasya quer enviar Peta 0,5 BTC. Para fazer isso, ele deve gastar todos os 50 BTC. Para obter uma alteração, Vasya pega uma entrada (50 BTC) e cria duas saídas:
- 0,5 BTC para o endereço de Petit;
- 49,5 BTC para um de seus endereços.
Quando eles dizem "Vasya assina a transação" - isso não é totalmente exato para Bitcoin. Vasya assina todas as entradas da transação e cada entrada é um endereço de bitcoin separado, e cada uma delas precisa de uma chave secreta correspondente. Suponha que Vasya tenha três endereços para os quais três de seus amigos enviaram 0,1 BTC cada. Para gastar 0,25 BTC, Vasya terá que assinar três entradas (cada uma de 0,1) e formar duas saídas (0,25 para o endereço do destinatário e 0,05 para si mesmo, como alteração). Esse esquema permite, em particular, nunca usar o mesmo endereço duas vezes e retornar a alteração toda vez para um novo. Algumas carteiras, como a Electrum, permitem que o proprietário escolha a estratégia para reutilizar endereços, mais privada (cada vez que um novo endereço) ou mais simples, mas com endereços permanentes (esse esquema é mais conveniente se você recorrer a transações regulares complexas). Lembro que a diferença entre a soma de entradas e saídas é uma comissão para o mineiro: simples e confiável.
Agora, em vez de "Vasya assina a transação", digo, "Vasya assina a entrada". Mas, deliberadamente, perdi mais alguns pontos, para não complicar o esquema geral. O fato é que os endereços no Bitcoin não são uma chave pública em sua forma mais pura, mas seu hash (duas vezes por hash com vários bytes de serviço e versão, detalhes no artigo Bitcoinwiki), ou seja, em uma transação normal, o remetente nem conhece a chave pública do destinatário. Portanto, Vasya, assinando a entrada, além da própria assinatura, apresenta o Bitcoin Script com sua própria chave pública, revelando-a. Naturalmente, conhecendo a chave pública, você pode gerar facilmente um endereço de Bitcoin.
Além de assinar entradas, o Vasya também define uma condição para cada saída, como gastar o BTC dessa saída específica. Mas os "requisitos" foram fornecidos a ele por quem receberá bitcoins: é sua preocupação como ele gastará seu BTC. Este é um ponto extremamente importante. O endereço Bitcoin contém um hash do código que decidirá se o BTC deve ser permitido a partir desse endereço.
Se você ainda procurar analogias, o Vasya para cada saída (que ele recebeu pelos que recebem o BTC) anexará os dados que respondem à pergunta "Que código e em quais dados o retorno verdadeiro deve ser verdadeiro para que o assinante seja considerado o proprietário dessa saída?" . Aqui está outra analogia para os pythonists: você pode imaginar que cada saída contém uma função lambda, que, executada por Petya, que forneceu argumentos a ela, retornará verdadeiro ou falso. Se true for retornado, o Petya poderá usar a saída como entrada para transações subsequentes. Na versão padrão, o programa pode pegar dois argumentos fornecidos pelo Petya - a assinatura da saída e a chave pública de Petin - e verificar a assinatura. Se true for retornado, Petya tem o direito de produzir e pode gastá-lo; portanto, a transação é válida. Não é necessário aprofundar este artigo no Script, mas é altamente desejável. By the way, resgatar script - este é o contrato muito inteligente, ou seja, uma regra formal pela qual o direito ao BTC passa de um endereço para outro. Os clientes da rede, durante a transação, executam cada script em cada transação, verificando se é válido. Se válido - desperdício válido e inegável de bitcoins de um endereço específico.
Aqui está o primeiro excelente artigo sobre esse tópico, eu recomendo a leitura, todo o mecanismo bruto com exemplos em python é bem pintado: Bitcoins da maneira mais difícil: usando o protocolo Bitcoin bruto . E aqui está outra: Bitcoin em poucas palavras - Transação .
Vamos voltar ao multisig 2/3, observando que a transação usual com a transferência de bitcoins também pode ser considerada como multisig 1/1. Suponha que Petya queira que Vasya simplesmente transfira o BTC para ele. Petya fornece a Vasya o endereço no qual o hash do script padrão é costurado, e o Bitcoins pode pegar os bitcoins nesse endereço, fornecendo um código de verificação de assinatura padrão e a própria assinatura. Esses endereços "tradicionais" no Bitcoin começam com o número 1 (unidade). Os endereços nos quais o código "não convencional" é costurado (verificando o script multisig) são chamados de pay-to-script e começam com 3 (triplos).
O Bitcoin nos permite criar um endereço no qual o hash do NOSSO PRÓPRIO script de resgate será costurado. Afinal, esse é o nosso problema, pois gastaremos nosso BTC, e não o remetente. Não nos importamos com quem transfere os bitcoins para um endereço, mas é importante que, quando quisermos gastá-los, forneçamos um código correspondente ao endereço. Ou seja, ao solicitar que eu transfira o BTC para um endereço de pagamento para script, comprometo-me a fornecer o próprio script posteriormente, em uma transação que usa essa entrada.
De acordo com a documentação, para código multisig deste tipo é usado:
----------------------------------------------------------- Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Signature script: <sig> [sig] [sig...] <redeemScript> -----------------------------------------------------------
( Artigo continuado sobre script e multisig )
Precisamos de um script para que todas as assinaturas necessárias sejam apresentadas imediatamente na transação de gastos. Se, por exemplo, nosso multisig 2/3 contiver os endereços de três participantes (CEO, contador principal e administrador do sistema) e as chaves secretas das assinaturas estiverem em seus computadores separadamente, para formar uma transação de gastos, o administrador do sistema precisará:
- gerar uma transação de gasto;
- crie sua própria assinatura;
- transferir o conteúdo da transação para o segundo signatário (por exemplo, vá para o departamento de contabilidade ou para o general com uma unidade flash);
- peça ao segundo assinante para adicionar uma assinatura à transação;
- envie uma transação para a rede com duas das três assinaturas.
Essa não é uma maneira muito simples, mas permite que você use como um dos signatários um computador completamente desconectado da rede e que não seja garantido para mesclar a chave secreta. Nesse caso, a retirada de fundos é completamente “manual”, o que é bastante bom para grandes quantias. Amigos do século XXI, agora está na moda colocar um laptop zero em um cofre sem uma conexão de rede e com o único software instalado - uma carteira Bitcoin.
Ethereum multisig
A implementação do multisig no Ethereum é muito diferente da do Bitcoin devido ao design diferente dos algoritmos da rede do cliente interno, mas existem paralelos. No Ethereum, uma transação especial do tipo "create_contract" cria um endereço na rede à qual o código de um contrato específico está vinculado. Este endereço também possui um equilíbrio de éter. Se você enviar éter para lá, o endereço "levará o equilíbrio". E vice-versa, se você enviar éter do endereço, ele será "removido do balanço".
Faço imediatamente analogias bastante precisas para entender uma cozinha muito simples e lógica. Se esquecermos o consenso e como os nós atualizam a cadeia de blocos e considerarmos a cadeia de blocos como um armazenamento abstrato, a colocação do contrato poderá ser comparada, por exemplo, à instanciação de um objeto, ou seja, transformar a classe em um objeto real na RAM. Em uma analogia, a memória é uma cadeia de blocos e o código de classe é um código de contrato. Após a instanciação, o objeto (contrato) recebe seu próprio endereço na “memória” e a rede conhece a interface, apresentada na forma descrita na classe de métodos.
As transações que chegam ao endereço em um esquema desse tipo são métodos de gravação, elas alteram o estado interno do objeto do contrato. Qualquer cliente da rede executa leitores de métodos que simplesmente leem dados do estado do contrato, porque é certo que sua cópia do objeto está correta e confirmada pelo consenso dos produtores de blocos. Também é importante entender que o código do contrato é executado quando o minerador “aplica” a transação que chegou ao contrato existente e, em nossa versão, simplesmente chama um dos métodos de contrato com argumentos incorporados na transação.
Bem, como um contrato tem um estado interno (campos de objeto em nossa analogia), ele pode implementar um multisig sem a necessidade de enviar assinaturas em uma transação. Criamos um contrato, nele codificamos os endereços dos signatários, quando as transações de retirada chegam - transferimos o contrato sequencialmente para o estado de espera do número necessário de confirmações. Se estamos falando de multisig 2/3, pode ser algo como isto:
- o administrador do sistema implementará um contrato multisig na rede e incluirá os endereços do diretor geral e do contador principal;
- clientes felizes enviam toneladas de éter ao contrato;
- o contador principal fará um grande pagamento e envia uma transação ao contrato com o desejo de transferir algum éter para um endereço externo;
- o contrato multisig entra no estado "Espero N confirmações"; no nosso caso, basta:
- o CEO quer ajudar o contador-chefe, mas esqueceu em qual laptop a chave secreta é necessária;
- o administrador do sistema envia uma transação - confirmação da retirada de fundos para o contrato;
- o contrato, tendo aceito a transação do administrador do sistema, entende que as N confirmações necessárias foram discadas e envia a transmissão para o endereço reservado pelo contador principal, retornando ao estado de simples recebimento de fundos.
Muitas coisas podem ser implementadas de maneira diferente, dependendo da implementação do contrato multisig. Isso se aplica ao armazenamento de pedidos pendentes de retirada, ao intervalo de tempo de espera pela retirada e a restrições convenientes. Por exemplo, você pode permitir a retirada de valores até um determinado limite sem várias assinaturas e exigir confirmação se o limite for excedido.
Existem várias opções para o código de contrato de carteira multisig; você pode encontrá-los facilmente. O mais oficial deles é este . Existem muitas outras modificações nos contratos multisig, bem como contratos multisig, mas que nem sequer sabem disso, porque qualquer contrato com várias funções no sentido filosófico é multisig.
Conclusão
Examinamos o esquema de operação de um dos tijolos mais importantes para a construção de sistemas complexos de contratos e organização de transações multilaterais. Onde está a maneira mais fácil de sentir os endereços multisig ativos:
- para Bitcoin: a carteira da Electrum possui instruções detalhadas passo a passo com capturas de tela sobre como criar e configurar um endereço multisig e como usá-lo. Basta procurar por Electrum multisig;
- para Ethereum: há uma seção Contratos na carteira padrão da carteira Ethereum e é possível criar facilmente multisig. Além disso, o multisig certamente será apresentado de várias formas nas plataformas para o lançamento de contratos padrão; por exemplo, já temos um em nosso Smartz.io .
Como você pode ver, na blockchain, esses esquemas são muito tecnológicos e simples, então use-os para seu prazer e proteja sua riqueza de criptografia corretamente.