
Multisig-Verträge in modernen dezentralen Netzwerken sind ein leistungsstarkes Tool, mit dem Sie Gelder auf Sammelkonten einfach und zuverlässig schützen sowie Transaktionen mit mehreren Teilnehmern durchführen können. Wenn Sie daran interessiert sind, wie solche Adressen verwendet werden, müssen Sie lediglich die Mechanismen ihres Besitzes verstehen und eine gute Vorstellung von der Reihenfolge der Transaktionen haben. Um mit solchen Adressen arbeiten zu können, müssen mehrere Konten beteiligt sein.
Trotz des gleichen Namens und einer ähnlichen Arbeitslogik unterscheiden sich interne Algorithmen und Methoden für die Interaktion mit Adressen, die durch Mehrfachsignaturen geschützt sind, in Bitcoin und Ethereum erheblich. Es geht um dieses interne Gerät, das in diesem Artikel behandelt wird.
Wir werden über zwei Netzwerke sprechen: Bitcoin und Ethereum. In anderen Blockchains kann der Multisig-Zugriff auf Krypto-Assets auf völlig andere Weise implementiert werden.
Einführung
Angenommen, wir haben die Aufgabe, Gelder vor unbefugtem Zugriff an der Adresse (Konto, wenn die Bankenterminologie näher bei Ihnen liegt) zu schützen, an der das Geld des Unternehmens gespeichert ist. Der Zugriff auf die Adresse (die Möglichkeit, eine Transaktion von dieser zu einer externen zu erstellen) steht mehreren Personen zur Verfügung, z. B. dem allgemeinen, dem finanziellen und dem Hauptbuchhalter. Um Geld zu schützen, gibt es Multisig, wenn jemand aus dieser Dreifaltigkeit gezwungen ist, eine Schlussfolgerung zu unterschreiben. In Bitcoin und Ethereum können Sie eine Adresse erstellen, für deren Abhebung nicht nur eine, sondern mehrere Bestätigungen erforderlich sind.
Nun muss jeder der drei Teilnehmer, der eine Transaktion zum Abheben erstellen möchte, seine Unterschrift vorlegen, um seine Zustimmung zur Transaktion zu bestätigen. Wenn genügend Unterschriften gesammelt wurden, werden Gelder überwiesen. Diese Logik wird als Multisig bezeichnet: Senden von N von M Signaturen (M> N), um den Vorgang zu bestätigen.
Für dezentrale Netzwerke ist Multisig ein natives Muster, da jede gültige Transaktion, die per Design an eine Adresse gesendet wird, eine elektronische Signatur enthält, die vom geheimen Schlüssel des Absenders erstellt wird. Daher sind fast alle für Multisig-Adressen erforderlichen Funktionen bereits in den meisten modernen Blockchains enthalten.
Am interessantesten ist die einfachste Multisig-Adresse 2/3, deren Schlussfolgerung nur mit Zustimmung von zwei der drei Teilnehmer möglich ist. Mit einem solchen Multisig können viele Transaktionen mit drei Parteien bequem und sicher durchgeführt und Probleme gelöst werden, wenn zwei Teilnehmer darauf vertrauen, dass der dritte sie beurteilt. Fast alle Finanzdienstleistungen, bei denen ein Dritter vertrauenswürdig ist, werden mit Multisig 2/3 implementiert. Nehmen Sie zum Beispiel ein Akkreditiv: Der Zahler verdient das Geld und kann es nicht nehmen, es sei denn, er überzeugt entweder die Bank (wo die Kaufunterlagen nicht eingetroffen sind) oder den Empfänger (aus freiem Willen), dem zuzustimmen. Der Empfänger kann das Geld auch nicht abholen, wenn der Verkäufer es nicht (freiwillig) zurückgibt oder die Bank nicht darüber informiert, dass die erforderlichen Dokumente bei ihm eingegangen sind, und er sie überprüft hat. In dem System ist der Service der Bank unangemessen einfach: Wenn sie eine Vereinbarung über den Kauf einer Wohnung sieht, anstatt den Schlüssel für die Zelle zum Geschäft zu tragen, sendet sie einfach eine Genehmigung an eine Multisig-Adresse.
Die Aufgaben der Rechnungslegung und Bezahlung von Dienstleistungen konzentrieren sich auch auf Multisig 2/3: Oft muss ein Dritter entscheiden, ob und in welchem Umfang die Dienstleistung erbracht wurde. Multisig, bei dem eine der drei Unterschriften der Organisation gehört, die letztendlich entscheidet, ob die Dienstleistung erbracht wurde oder nicht (z. B. dem Gericht), bedeutet, dass das Gericht, nachdem es sich für eine der Parteien entschieden hat, einfach seine Entscheidung unterzeichnet und die Transaktion sendet und die Gelder automatisch freischaltet für die Gewinnerseite. Bei B2C-Diensten wie Uber oder AirBnB ist das Multisig, wenn auch implizit, das Hauptarbeitsmuster: Wenn der Dienst bereitgestellt wird, ist es die Signatur der Anfrage des Dienstes, die das Senden von Geldern vom Kunden an den Fahrer oder den Eigentümer der Wohnung initiiert.
Im Allgemeinen eignet sich ein bequem implementiertes Multisig - wie ein Kalaschnikow-Sturmgewehr: billig und fröhlich - für den Einsatz zu Hause und für Gebühren in Millionenhöhe. Und in der Blockchain ist das alles „ohne Registrierung und SMS“ (aus Sicherheitsgründen ist dies übrigens eine ziemlich ernsthafte These, wenn Sie darüber nachdenken).
Wir werden zwei Blockchains betrachten - Bitcoin und Ethereum. Ich muss sagen, dass das interne Multisig-Gerät in ihnen ganz anders ist, alles funktioniert anders. Aber lasst uns nicht weiterkommen.
Bitcoin Multisig
Bitcoin ist eigentlich nicht so einfach, wie es vielen erscheinen mag. Dank seines Designs können Sie leichte und gleichzeitig sehr sichere Systeme implementieren, um Zugang zu Geldern zu erhalten. Nun, ich füge hinzu, dass die Strukturen und Algorithmen in Bitcoin rein meiner persönlichen Meinung nach gut durchdacht, optimal und einfach schön sind. Die Standardübersetzung von X-Bitcoins von Adresse zu Adresse ist nur die Standardtransaktionsart, die Spitze des Eisbergs potenzieller Bitcoin-Funktionen. Die Standardtransaktion für die Übersetzung von BTC aus der Sicht des Codes ist die einfachste Multisig 1/1: Um X-Bitcoins von Adresse a1 zu verwenden, müssen Sie der Transaktion eine elektronische Signatur mit dem geheimen Schlüssel hinzufügen, der zu Adresse a1 gehört. Schauen wir uns die Struktur einer Bitcoin-Transaktion an und gehen wir etwas genauer auf deren Funktionsweise ein.

In Bitcoin gibt es eine Anforderung: Alle an einer bestimmten Adresse gespeicherten BTC werden immer als Ganzes ausgegeben. Das heißt, nachdem die Transaktion sein Recht bestätigt hat, eine Adresse zu besitzen, gibt die Transaktion den gesamten Restbetrag aus und verteilt ihn auf mehrere Ausgaben. Im wirklichen Leben überlässt man den Unterschied zwischen Ein- und Ausgängen dem Bergmann als Provision, aber für diesen Artikel ist dies nicht signifikant.
Stellen Sie sich die Situation vor. Vasya erhielt 50 BTC. Vasya will Peta 0.5 BTC schicken. Dazu muss er alle 50 BTC ausgeben. Um eine Änderung zu erhalten, nimmt Vasya einen Eingang (50 BTC) und erstellt zwei Ausgänge:
- 0,5 BTC an Petits Adresse;
- 49.5 BTC an eine Ihrer eigenen Adressen.
Wenn sie sagen "Vasya unterschreibt die Transaktion" - ist dies für Bitcoin nicht ganz richtig. Vasya signiert alle Eingaben in der Transaktion, und jede Eingabe ist eine separate Bitcoin-Adresse, und jede von ihnen benötigt einen entsprechenden geheimen Schlüssel. Angenommen, Vasya hat drei Adressen, an die drei seiner Freunde jeweils 0,1 BTC gesendet haben. Um 0,25 BTC auszugeben, muss Vasya drei Eingaben (jeweils 0,1) signieren und zwei Ausgaben bilden (0,25 an die Adresse des Empfängers und 0,05 an sich selbst als Änderung). Ein solches Schema ermöglicht es insbesondere, niemals dieselbe Adresse zweimal zu verwenden und jedes Mal eine Änderung an eine neue zurückzugeben. Bei einigen Brieftaschen, z. B. Electrum, kann der Eigentümer die Strategie für die Wiederverwendung von Adressen wählen, die privater (jedes Mal eine neue Adresse) oder einfacher, aber mit permanenten Adressen ist (dieses Schema ist praktischer, wenn Sie auf komplexe reguläre Transaktionen zurückgreifen). Ich erinnere Sie daran, dass der Unterschied zwischen der Summe der Ein- und Ausgänge sowohl eine Provision für den Bergmann ist: einfach und zuverlässig.
Anstelle von "Vasya unterschreibt die Transaktion" sage ich jetzt "Vasya unterschreibt die Eingabe". Aber ich habe absichtlich noch ein paar Punkte übersehen, um das Gesamtsystem nicht zu komplizieren. Tatsache ist, dass Adressen in Bitcoin kein öffentlicher Schlüssel in seiner reinsten Form sind, sondern sein Hash (zweimal ein Hash mit mehreren Service-Bytes und Versionen, Details im Bitcoinwiki- Artikel ), dh bei einer normalen Transaktion kennt der Absender nicht einmal den öffentlichen Schlüssel des Empfängers. Daher präsentiert Vasya, der die Eingabe zusätzlich zur Signatur selbst signiert, Bitcoin Script seinen eigenen öffentlichen Schlüssel und enthüllt ihn so. Wenn Sie den öffentlichen Schlüssel kennen, können Sie natürlich problemlos eine Bitcoin-Adresse generieren.
Zusätzlich zum Signieren von Eingaben legt Vasya für jede Ausgabe eine Bedingung fest, wie BTC für diese bestimmte Ausgabe ausgegeben werden soll. Die „Anforderungen“ wurden ihm jedoch von demjenigen gestellt, der Bitcoins erhalten wird: Es ist seine Sorge, wie er seine BTC ausgeben wird. Dies ist ein äußerst wichtiger Punkt. Die Bitcoin-Adresse enthält einen Hash aus dem Code, der entscheidet, ob BTC von dieser Adresse zugelassen wird.
Wenn Sie immer noch nach Analogien suchen, fügt Vasya für jede Ausgabe (die er von denjenigen erhalten hat, die BTC erhalten) Daten hinzu, die die Frage beantworten: "Welcher Code und auf welchen Daten sollte wahr sein, damit der Unterzeichner als Eigentümer dieser Ausgabe betrachtet wird?" . Hier ist eine weitere Analogie für Pythonisten: Sie können sich vorstellen, dass jede Ausgabe eine Lambda-Funktion enthält, die, ausgeführt von Petja, die ihr Argumente lieferte, wahr oder falsch zurückgibt. Wenn true zurückgegeben wird, kann Petya die Ausgabe als Eingabe für nachfolgende Transaktionen verwenden. In der Standardversion kann das Programm zwei von Petya bereitgestellte Argumente verwenden - die Signatur der Ausgabe und den öffentlichen Schlüssel von Petin - und die Signatur überprüfen. Wenn true zurückgegeben wird, hat Petya das Recht zur Ausgabe und kann es ausgeben. Daher ist die Transaktion gültig. Es ist nicht notwendig, tiefer in diesen Artikel im Skript einzutauchen, aber es ist sehr wünschenswert. Übrigens, Skript einlösen - dies ist der sehr intelligente Vertrag, dh eine formale Regel, nach der das Recht auf BTC von einer Adresse zur anderen übertragen wird. Clients des Netzwerks führen während der Transaktion jedes Skript in jeder Transaktion aus und prüfen, ob es gültig ist. Wenn gültig - gültige und unbestreitbare Verschwendung von Bitcoins von einer bestimmten Adresse.
Hier ist der erste ausgezeichnete Artikel zu diesem Thema. Ich empfehle dringend, ihn zu lesen. Der gesamte Rohmechanismus mit Beispielen in Python ist perfekt gemalt: Bitcoins auf die harte Tour: Verwenden des Roh-Bitcoin-Protokolls . Und hier ist noch eines: Bitcoin auf den Punkt gebracht - Transaktion .
Kehren wir zu Multisig 2/3 zurück und stellen fest, dass die übliche Transaktion mit der Übertragung von Bitcoins auch als Multisig 1/1 betrachtet werden kann. Angenommen, Petya möchte, dass Vasya BTC einfach an ihn überträgt. Petya gibt Vasya die Adresse, an die der Hash des Standardskripts genäht wird, und Bitcoins kann die Bitcoins von dieser Adresse abholen, indem sie einen Standard-Signaturprüfcode und die Signatur selbst bereitstellen. Solche "traditionellen" Adressen in Bitcoin beginnen mit der Nummer 1 (Einheit). Die Adressen, in die der "unkonventionelle" Code eingenäht wird (Überprüfung des Multisig-Skripts), werden als Pay-to-Script bezeichnet und beginnen mit 3 (Dreifach).
Mit Bitcoin können wir eine Adresse erstellen, in die der Hash unseres EIGENEN Einlöseskripts genäht wird. Dies ist schließlich unser Problem, da wir dann unsere BTC ausgeben und nicht die sendende. Es ist uns egal, wer die Bitcoins an eine Adresse überträgt, aber es ist wichtig, dass wir, wenn wir sie ausgeben möchten, einen Code angeben müssen, der der Adresse entspricht. Das heißt, indem ich gebeten werde, BTC an eine Pay-to-Script-Adresse zu übertragen, verpflichte ich mich, das Skript später selbst in einer Transaktion bereitzustellen, die diese Eingabe verwendet.
Gemäß der Dokumentation wird für Multisig-Code dieser Art Folgendes verwendet:
----------------------------------------------------------- Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Signature script: <sig> [sig] [sig...] <redeemScript> -----------------------------------------------------------
( Fortsetzung Artikel über Skript und Multisig )
Wir benötigen ein Skript, damit alle erforderlichen Signaturen sofort in der Ausgabentransaktion angezeigt werden. Wenn unser Multisig 2/3 beispielsweise die Adressen von drei Teilnehmern (CEO, Hauptbuchhalter und Systemadministrator) enthält und die geheimen Schlüssel für Signaturen separat auf ihren Computern gespeichert sind, muss der Systemadministrator:
- eine Ausgabentransaktion generieren;
- Erstellen Sie Ihre eigene Signatur.
- Übertragen Sie den Inhalt der Transaktion an den zweiten Unterzeichner (z. B. mit einem Flash-Laufwerk an die Buchhaltungsabteilung oder an den General).
- Bitten Sie den zweiten Unterzeichner, der Transaktion eine Signatur hinzuzufügen.
- Senden Sie eine Transaktion mit zwei der drei Signaturen an das Netzwerk.
Dies ist kein sehr einfacher Weg, aber Sie können als einer der Unterzeichner einen Computer verwenden, der vollständig vom Netzwerk getrennt ist und bei dem nicht garantiert wird, dass der geheime Schlüssel zusammengeführt wird. In diesem Fall erfolgt die Abhebung von Geldern vollständig „manuell“, was für große Beträge recht gut ist. Freunde des 21. Jahrhunderts, es ist jetzt in Mode, einen Zero-Laptop ohne Netzwerkverbindung und mit der einzigen installierten Software - einer Bitcoin-Brieftasche - in einen Safe zu legen.
Ethereum multisig
Die Implementierung von Multisig in Ethereum unterscheidet sich stark von der in Bitcoin, da die internen Client-Netzwerkalgorithmen unterschiedlich gestaltet sind, es gibt jedoch Parallelen. In Ethereum erstellt eine spezielle Transaktion vom Typ "create_contract" eine Adresse im Netzwerk, an die der Code für einen bestimmten Vertrag gebunden ist. Diese Adresse hat auch ein Äthergleichgewicht. Wenn Sie Äther dorthin senden, wird die Adresse "es zum Ausgleich bringen". Und umgekehrt, wenn Sie Äther von der Adresse senden, wird er „aus der Bilanz entfernt“.
Ich stelle sofort einige ziemlich genaue Analogien auf, um eine sehr einfache und logische Küche zu verstehen. Wenn wir den Konsens vergessen und wissen, wie die Knoten die Blockkette aktualisieren, und die Blockchain als abstrakten Speicher betrachten, kann die Platzierung des Vertrags beispielsweise mit der Instanziierung eines Objekts verglichen werden, dh die Klasse wird in ein reales Objekt im RAM umgewandelt. In einer Analogie ist Speicher eine Blockchain und Klassencode ein Vertragscode. Nach der Instanziierung erhält das Objekt (Vertrag) eine eigene Adresse im „Speicher“, und das Netzwerk kennt die Schnittstelle zu diesem Objekt, die in der in der Methodenklasse beschriebenen Form dargestellt wird.
Transaktionen, die in einem solchen Schema an der Adresse ankommen, sind Schreibmethoden, sie ändern den internen Status des Vertragsobjekts. Jeder Client des Netzwerks führt Methodenleser aus, die einfach Daten aus dem Vertragsstatus lesen, da sicher ist, dass die Kopie des Objekts korrekt ist und vom Konsens der Blockproduzenten bestätigt wird. Es ist auch wichtig zu verstehen, dass der Vertragscode ausgeführt wird, wenn der Miner die Transaktion, die auf den vorhandenen Vertrag eingegangen ist, „anwendet“. In unserer Version ruft er einfach eine der Vertragsmethoden mit in die Transaktion eingebetteten Argumenten auf.
Nun, da der Vertrag einen internen Status hat (Objektfelder in unserer Analogie), kann er Multisig implementieren, ohne dass Signaturen in einer Transaktion gesendet werden müssen. Wir erstellen einen Vertrag, in dem wir die Adressen der Unterzeichner festschreiben, wenn Transaktionen zum Widerruf eintreffen - wir übertragen den Vertrag nacheinander in den Wartezustand der erforderlichen Anzahl von Bestätigungen. Wenn wir über Multisig 2/3 sprechen, könnte es ungefähr so aussehen:
- Der Systemadministrator stellt einen Multisig-Vertrag für das Netzwerk bereit und trägt die Adressen des Generaldirektors und des Hauptbuchhalters ein.
- zufriedene Kunden schicken Tonnen von Äther zum Vertrag;
- Der Hauptbuchhalter wird eine große Zahlung leisten und eine Transaktion an den Vertrag senden, mit dem Wunsch, etwas Äther an eine externe Adresse zu übertragen.
- Multisig-Vertrag geht in den Zustand "Ich erwarte N Bestätigungen", in unserem Fall ist eine ausreichend;
- Der CEO möchte dem Hauptbuchhalter helfen, hat jedoch vergessen, auf welchem Laptop der geheime Schlüssel benötigt wird.
- Der Systemadministrator sendet eine Transaktion - Bestätigung der Auszahlung von Geldern an den Vertrag.
- Nachdem der Vertrag die Transaktion vom Systemadministrator akzeptiert hat, versteht er, dass die erforderlichen N Bestätigungen gewählt wurden, und sendet die Sendung an die vom Hauptbuchhalter bestellte Adresse, während er zum Zustand des einfachen Geldeingangs zurückkehrt.
Viele Dinge können abhängig von der Implementierung des Multisig-Vertrags unterschiedlich implementiert werden. Dies gilt für die Speicherung ausstehender Widerrufsbelehrungen, das Zeitintervall für das Warten auf Widerruf, zweckmäßige Einschränkungen. Sie können beispielsweise die Auszahlung von Beträgen bis zu einem bestimmten Limit ohne Mehrfachsignatur zulassen und eine Bestätigung verlangen, wenn das Limit überschritten wird.
Es gibt verschiedene Optionen für den Multisig Wallet-Vertragscode, die Sie leicht finden können. Der offiziellste von ihnen ist dieser . Es gibt viel mehr Modifikationen von Multisig-Verträgen sowie von Verträgen, die Multisig-Verträge sind, aber nicht einmal darüber Bescheid wissen, da jeder Vertrag mit mehreren Rollen im philosophischen Sinne Multisig ist.
Fazit
Wir haben das Betriebsschema eines der wichtigsten Bausteine für den Aufbau komplexer Vertragssysteme und die Organisation multilateraler Transaktionen untersucht. Wo lässt sich Multisig-Adressen am einfachsten live fühlen:
- für Bitcoin: Die Electrum-Brieftasche enthält eine detaillierte Schritt-für-Schritt-Anleitung mit Screenshots zum Erstellen und Konfigurieren einer Multisig-Adresse und deren Verwendung. Suchen Sie einfach nach Electrum multisig;
- für Ethereum: In der Standard-Brieftasche von Ethereum befindet sich ein Abschnitt mit Verträgen, in dem Sie problemlos Multisig erstellen können. Außerdem wird Multisig sicherlich in vielen Formen auf Plattformen für den Start von Standardverträgen präsentiert, zum Beispiel haben wir bereits einen auf unserem Smartz.io .
Wie Sie in der Blockchain sehen können, sind diese Schemata sehr technologisch und einfach. Verwenden Sie sie daher zu Ihrem Vergnügen und schützen Sie Ihren Krypto-Reichtum korrekt.