Portfele i konta z wieloma podpisami (multi-sig) umożliwiają wielu osobom dostęp do ich zasobów w oparciu o określone parametry. Portfel z wieloma podpisami może na przykład zawierać zdecentralizowaną organizację autonomiczną (DAO) lub wspólny skarbiec innej grupy. Portfel może wymagać podpisania transakcji przez 25 procent członków przed przeniesieniem jakichkolwiek aktywów.

W przeciwieństwie do prostych portfeli jednego właściciela, portfele z wieloma podpisami otwierają świat możliwych zastosowań, umożliwiając tworzenie komponentów gier i aplikacji handlowych, jako dwa przykłady, które mogą być odblokowane tylko przez wielu użytkowników. Wymaganie kworum użytkowników lub ustawienie innych warunków odblokowania chroni zasoby cyfrowe przed wtargnięciem jednego nieuczciwego użytkownika na konto.

Inteligentny kontrakt z wieloma podpisami, napisany w Move, służy jako podstawowy element składowy tego typu aplikacji na Sui. Inteligentny kontrakt multi-sig przedstawiony w tym artykule weryfikuje adresy multi-sig i obsługuje różne kombinacje kluczy, takie jak 2-z-3 lub M-of-N, gdzie M i N to parametry zdefiniowane przez użytkownika.

Tworzenie i używanie umowy Multi-Sig Checker w Move

Adres z wieloma podpisami to specjalny typ adresu, który wymaga wielu podpisów w celu autoryzacji transakcji. Inteligentny kontrakt sprawdzający wiele podpisów wyprowadza adres wielopodpisowy na podstawie zestawu kluczy publicznych, wag i progu i porównuje go z oczekiwanym adresem. 

Adresy z wieloma podpisami wymagają wielu podpisów, aby autoryzować transakcję. Często wykorzystuje się je w celu zwiększenia bezpieczeństwa funduszy poprzez podział kontroli pomiędzy wiele stron. Na przykład adres z wieloma podpisami 2 z 3 wymaga zatwierdzenia transakcji przez co najmniej dwóch z trzech sygnatariuszy. Adresy Multi-Sig mogą być również używane do celów zarządzania, depozytu lub tworzenia kopii zapasowych.

Inteligentny kontrakt multi-sig spełnia trzy funkcje. Wyznacza adresy multi-sig, weryfikuje je i może sprawdzić adres multi-sig nadawcy.

Wyprowadź adresy multi-sig

Moduł multisig definiuje

pochodna_multisig_address_quiet

który przyjmuje trzy parametry: pks, wagi i próg. 

The

pks

parametr jest wektorem wektorów bajtów reprezentujących klucze publiczne osób podpisujących.

The

ciężary

parametr jest wektorem bajtów reprezentującym wagi każdego podpisującego.

The

próg

parametr jest 16-bitową liczbą całkowitą bez znaku, reprezentującą minimalną sumę wag wymaganych do wykonania transakcji z adresu z wieloma podpisami.

Funkcja zwraca adres, który jest wyprowadzonym adresem z wieloma podpisami.

zabawa publiczna pochodna_multisig_address_quiet(         pks: wektor<vector<u8>>,         wagi: wektor<u8>,         próg: u16,     ): adres {

 Funkcja wykonuje następujące kroki:

Definiuje zmienną,

multiSigFlag

, typu 8-bitowa liczba całkowita bez znaku i przypisuje jej wartość 0x03, która jest flagą dla adresów z wieloma podpisami.

niech multiSigFlag = 0x03;

Tworzy pusty wektor bajtów o nazwie

hash_data

, który będzie przechowywać dane do zaszyfrowania.

niech hash_data = wektor<u8>[];

Pobiera długości

pks

oraz waży wektory i sprawdza, czy są one równe. Jeśli nie, przerywa wykonywanie z kodem błędu: ELengthsOfPksAndWeightsAreNotEqual.

niech pks_len = pgs.length(); niech wagi_len = wagi.długość(); twierdzenie!(pks_len ==weights_len, ELengthsOfPksAndWeightsAreNotEqual);

Inicjuje zmienną,

suma

, typu 16-bitowa liczba całkowita bez znaku i przypisuje jej wartość 0. Następnie przechodzi przez wektor wag i dodaje wartości każdego elementu do sumy. Następnie sprawdza, czy próg jest dodatni i nie większy niż suma. Jeśli nie, przerywa wykonywanie z kodem błędu: EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights.

       niech suma = 0;         niech mut i = 0;         while (i <weights_len) {             niech w = wagi[i] jak u16;             suma = suma + w;             ja = ja + 1;         };         twierdzić!(próg > 0 && próg <= suma, EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights);

 Popycha

multiSigFlag

do wektora hash_data. Następnie serializuje próg za pomocą funkcji bcs::to_bytes i dołącza wynik do wektora hash_data.

       hash_data.push_back(multiSigFlag);        niech próg_bajtów: wektor<u8> = bcs::to_bytes(&próg);        hash_data.append(threshold_bytes);

Przebiega przez

pks

i waży wektory i dołącza elementy każdej pary do wektora hash_data.

        niech mut i = 0;         while (i < pks_len) { hash_data.append(pks[i]); hash_data.push_back(wagi[i]);           ja = ja + 1;         };

Hashuje

hash_data

wektor za pomocą funkcji blake2b256 i konwertuje wynik na adres za pomocą funkcji adres::from_bytes. Następnie przypisuje adres do zmiennej ms_address i zwraca ją.

        niech ms_address = adres::from_bytes(blake2b256(&hash_data));         adres_ms     }

Wylicza adres z wieloma podpisami i zwraca adres z wieloma podpisami.

Weryfikacja adresów multi-sig

The

multisygn

moduł definiuje również check_multisig_address_eq, który sprawdza, czy utworzony adres multi-sig pasuje do oczekiwanego adresu. Jak wspomnieliśmy powyżej, adres multi-sig to specjalny rodzaj adresu, który wymaga wielu podpisów w celu autoryzacji transakcji. Adres z wieloma podpisami jest definiowany przez zestaw kluczy publicznych, wag i progu.

Funkcja

check_multisig_address_eq

przyjmuje cztery parametry: pks, wagi, próg i oczekiwany adres. Pierwsze trzy parametry są takie same, jak te, których użyliśmy w poprzedniej funkcji, pochodnej_multisig_address_quiet. Ostatni parametr, oczekiwany_adres, to wartość adresu, którą chcemy porównać z adresem multi-sig.

   wpis publiczny zabawa check_multisig_address_eq(        pks: wektor<vector<u8>>,        wagi: wektor<u8>,         próg: u16,         oczekiwany adres: adres,     ): bool {

Funkcja najpierw wywołuje funkcję,

pochodne_multisig_address_quiet

, który tworzy adres z wieloma podpisami na podstawie podanych kluczy publicznych, wag i progu. Ta funkcja wykorzystuje algorytm oparty na mieszaniu do łączenia kluczy publicznych i progu w 16-bajtową wartość, która następnie jest konwertowana na adres.

niech ms_address = pochodna_multisig_address_quiet(pks, wagi, próg);

 Funkcja następnie porównuje adres multi-sig z oczekiwanym adresem i zwraca wartość true, jeśli adresy są równe, lub false w przeciwnym razie.

powrót (adres_ms == adres oczekiwany)

Funkcja

check_multisig_address_eq

można wykorzystać do sprawdzenia, czy adres multi-sig jest poprawny i odpowiada oczekiwanej wartości. Może to być przydatne do celów testowania, debugowania lub inspekcji. Na przykład można użyć tej funkcji do sprawdzenia, czy adres multi-sig jest zgodny z kluczami publicznymi i progiem uzgodnionym przez sygnatariuszy.

Sprawdzanie adresu multi-sig nadawcy

Wreszcie,

multisygn

moduł definiuje również adres check_if_sender_is_multisig_address, który sprawdza, czy nadawca jest tym samym adresem multi-sig, który wynika z podanych pks, wag i progu.

The

check_if_sender_is_multisig_adres

przyjmuje cztery parametry: pks, wagi, próg i ctx. Pierwsze trzy parametry definiują schemat adresu multi-sig, natomiast ostatni parametr określa kontekst transakcji.

The

pks

parametr jest wektorem wektorów bajtów reprezentujących klucze publiczne osób podpisujących.

The

ciężary

parametr jest wektorem bajtów reprezentującym wagi każdego podpisującego.

The

próg

parametr jest 16-bitową liczbą całkowitą bez znaku, reprezentującą minimalną sumę wag wymaganych do wykonania transakcji z adresu multi-sig.

Wreszcie,

ctx

jest zmienną referencją do TxContext, która zawiera informacje o bieżącej transakcji, np. o nadawcy.

   zabawa publiczna check_if_sender_is_multisig_address(         pks: wektor<vector<u8>>,         weights: wektor<u8>,         threshold: u16,        ctx: &mut TxContext     ): bool {

The

check_if_sender_is_multisig_adres

funkcja wywołuje funkcję check_multisig_address_eq, która porównuje adres multi-sig z adresem nadawcy.

      check_multisig_address_eq(pks, wagi, próg, ctx.sender())             }

Funkcja

check_multisig_address_eq

zwraca wartość true, jeśli adres nadawcy odpowiada schematowi adresów z wieloma podpisami, lub false w przeciwnym razie.

Zacznij korzystać z multi-sig

Adresy z wieloma podpisami są przydatne w scenariuszach, w których istnieje potrzeba zwiększonego bezpieczeństwa, odpowiedzialności lub współpracy między wieloma stronami. Biorąc pod uwagę cenne zasoby cyfrowe przechowywane na Sui, adres z wieloma podpisami może pomóc w ich zabezpieczeniu.

Inteligentna umowa opisana w tym artykule może pomóc w rozpoczęciu tworzenia aplikacji przeznaczonych do współpracy i wspólnej opieki nad zasobami. Jako dodatkowe źródło informacji możesz zapoznać się z kodem źródłowym i dokumentacją tego projektu w serwisie GitHub.