Multisignature
Un compte multisignature est un compte qu’aucune clé ne contrôle à elle seule. Il est défini par une liste de participants et un seuil, et il ne dépense que lorsqu’au moins ce nombre de participants ont signé la même transaction : deux sur trois, trois sur cinq, et ainsi de suite. Les participants peuvent utiliser différents types de clés, si bien qu’une clé ZooBC, une clé Ethereum et une clé Bitcoin peuvent partager un même compte.
Le compte
Un compte multisignature est défini par son seuil (d’un seul participant jusqu’au nombre total de participants), un nonce et les adresses de ses participants. Son adresse est un hachage de ces éléments :
address = SHA3-256( threshold ‖ nonce ‖ count ‖ sorted participant addresses )
Le résultat est utilisé comme un compte ordinaire de type 0 : il peut donc recevoir des ZBC comme n’importe quelle adresse. Personne ne détient de clé privée pour cette adresse, si bien que la seule façon d’en dépenser les fonds est de réunir des signatures de participants.
La dépense, étape par étape
- Quelqu’un propose une transaction interne, par exemple un paiement, à l’intérieur d’une transaction MultiSignature. La transaction interne n’est pas signée, et son expéditeur est le compte multisignature.
- Les participants ajoutent leurs signatures, toutes d’un coup ou dans des transactions MultiSignature ultérieures, dans n’importe quel ordre. Le corps d’une MultiSignature peut porter n’importe quelle combinaison de la définition du compte, de la transaction interne et de signatures, si bien que plusieurs de ces transactions englobantes peuvent construire peu à peu une même transaction interne.
- Chaque participant signe le condensé lié à la chaîne de la transaction interne,
SHA3-256("ZBC-TX" ‖ genesis hash ‖ inner bytes), avec le schéma propre à son type de clé (voir la signature d’une transaction). Les signatures sont stockées sous le hachage de la transaction interne. Une signature d’un non-participant, ou une signature qui ne se vérifie pas, n’est tout simplement pas comptée. - Lorsque les signatures valides atteignent le seuil, la transaction interne s’exécute une seule fois. Le compte multisignature paie ses frais, au moins le plancher de la transaction interne, et la transaction interne est marquée comme exécutée pour toujours : elle ne peut jamais être rejouée.
L’expéditeur de chaque transaction MultiSignature englobante paie les frais propres à celle-ci.
Aucune signature commune n’est construite hors chaîne et aucun ordre de signature n’est imposé : chaque clé signe seule, avec son propre schéma.
Ce qu’il peut faire
La transaction interne peut être de l’un de ces types :
- Empty ou SendZBC ;
- l’un des quatre types d’enregistrement de nœud (enregistrer, mettre à jour, retirer et revendiquer un enregistrement de nœud) ;
- SetSplitPolicy ;
- l’un des quatre types de groupe de comptes (LinkAccount, UnlinkAccount, SetMemberPermissions et TransferGroupControl).
Un compte multisignature peut donc payer en ZBC, détenir un enregistrement de nœud, partager ses revenus avec une politique de répartition et faire partie d’un groupe de comptes, mais il n’envoie pas directement de jetons. Il peut consentir à rejoindre un groupe en atteignant son seuil, de la même façon qu’une clé unique consent avec sa propre signature.
Selon la règle d’une transaction par compte et par bloc, une transaction interne compte pour le compte multisignature lorsqu’elle s’exécute.
Qui a son mot à dire
Seules les signatures des participants comptent. Les nœuds enregistrés ne signent pas pour le compte ; ils se contentent de vérifier les signatures des participants, comme ils vérifient toutes les autres. La ZooBC Foundation n’a pas non plus son mot à dire sur le compte, quel que soit le montant.