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.