Peněženky a účty s více podpisy (multi-sig) umožňují více lidem přístup k jejich aktivům na základě specifických parametrů. Peněženka s více značkami může například obsahovat komunální pokladnu decentralizované autonomní organizace (DAO) nebo jiné skupiny. Peněženka může vyžadovat, aby 25 procent členů podepsalo transakci, než bude možné přesunout jakýkoli majetek.

Na rozdíl od jednoduchých peněženek jednoho vlastníka otevírají peněženky s více značkami svět možných použití a umožňují vám vytvářet herní komponenty a obchodní aplikace, jako dva příklady, které může odemknout pouze více uživatelů. Vyžadování kvora uživatelů nebo nastavení jiných podmínek pro odemknutí udržuje digitální aktiva zabezpečená před jediným nepoctivým uživatelem, který přepadne účet.

Inteligentní smlouva s více značkami, napsaná v Move, slouží jako primární stavební blok pro tento typ aplikace na Sui. Inteligentní smlouva s více značkami uvedená v tomto článku ověřuje adresy s více značkami a podporuje různé kombinace klíčů, jako je 2-of-3 nebo M-of-N, kde M a N jsou parametry definované uživatelem.

Vytváření a používání multi-sig checker kontraktu v Move

Multi-sig adresa je speciální typ adresy, která vyžaduje více podpisů k autorizaci transakce. Inteligentní kontrakt pro kontrolu více signálů odvozuje vícesig adresu ze sady veřejných klíčů, vah a prahové hodnoty a porovnává ji s očekávanou adresou. 

Multi-sig adresy vyžadují více podpisů k autorizaci transakce. Často se používají ke zvýšení bezpečnosti finančních prostředků rozdělením kontroly mezi více stran. Například adresa 2 ze 3 s více značkami vyžaduje ke schválení transakce alespoň dva ze tří podepisujících. Multi-sig adresy lze také použít pro účely správy, úschovy nebo zálohování.

Multi-sig smart contract plní tři funkce. Odvozuje multi-sig adresy, ověřuje je a může kontrolovat multi-sig adresu odesílatele.

Odvodit multi-sig adresy

Modul multisig definuje

derive_multisig_address_quiet

který má tři parametry: pks, váhy a práh. 

The

pks

parametr je vektor vektorů bytů, představující veřejné klíče podepisujících osob.

The

závaží

parametr je vektor bajtů, představující váhy každého podepisujícího.

The

práh

Parametr je 16bitové celé číslo bez znaménka, které představuje minimální součet vah požadovaných k provedení transakce z adresy s více podpisy.

Funkce vrací adresu, což je odvozená adresa s více podpisy.

veřejná zábava derive_multisig_address_quiet(         pks: vector<vector<u8>>,         váhy: vector<u8>,         práh: u16,     ): adresa {

 Funkce provádí následující kroky:

Definuje proměnnou,

multiSigFlag

, typu 8-bit unsigned integer a přiřadí mu hodnotu 0x03, což je příznak pro adresy s více podpisy.

nechť multiSigFlag = 0x03;

Vytváří prázdný vektor bajtů tzv

hash_data

, který uloží data, která mají být hašována.

nech hash_data = vector<u8>[];

Dostává délky

pks

a váží vektory a kontroluje, zda jsou stejné. Pokud ne, přeruší provádění s chybovým kódem: ELengthsOfPksAndWeightsAreNotEqual.

nech pks_len = pgs.length(); nech vahy_délka = vahy.délka(); tvrdit!(pks_len == váhy_délka, ELengthsOfPksAndWeightsAreNotEqual);

Inicializuje proměnnou,

součet

, typu 16bitové celé číslo bez znaménka a přiřadí mu hodnotu 0. Poté prochází vektor vah a přičte hodnoty každého prvku k součtu. Poté zkontroluje, zda je práh kladný a není větší než součet. Pokud ne, přeruší provádění s chybovým kódem: EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights.

       nechť mut součet = 0;         nechť mut i = 0;         while (i < weights_len) {             nechť w = váhy[i] jako u16;             součet = součet + w;             i = i + 1;         };         tvrdit!(prah > 0 && práh <= součet, EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights);

 To tlačí na

multiSigFlag

do vektoru hash_data. Poté serializuje práh pomocí funkce bcs::to_bytes a připojí výsledek k vektoru hash_data.

       hash_data.push_back(multiSigFlag);        nech prahové_bajty: vector<u8> = bcs::to_bytes(&threshold);        hash_data.append(threshold_bytes);

Prochází přes

pks

a váží vektory a připojuje prvky každého páru k vektoru hash_data.

        nechť mut i = 0;         while (i < pks_len) { hash_data.append(pks[i]); hash_data.push_back(váhy[i]);           i = i + 1;         };

To hashuje

hash_data

vector pomocí funkce blake2b256 a převede výsledek na adresu pomocí funkce address::from_bytes. Poté přiřadí adresu proměnné ms_address a vrátí ji.

        let ms_address = adresa::from_bytes(blake2b256(&hash_data));         ms_address     }

Odvozuje multi-sig adresu a vrací multi-sig adresu.

Ověřování multi-sig adres

The

multisig

modul také definuje check_multisig_address_eq, který kontroluje, zda vytvořená multi-sig adresa odpovídá očekávané adrese. Jak jsme zmínili výše, multi-sig adresa je speciální typ adresy, která vyžaduje více podpisů k autorizaci transakce. Multi-sig adresa je definována sadou veřejných klíčů, vah a prahové hodnoty.

Funkce

check_multisig_address_eq

přebírá čtyři parametry: pks, váhy, práh a očekávaná_adresa. První tři parametry jsou stejné jako ty, které jsme použili v předchozí funkci derive_multisig_address_quiet. Poslední parametr, očekávaná_adresa, je hodnota adresy, kterou chceme porovnat s multi-sig adresou.

   veřejný vstup fun check_multisig_address_eq(         pks: vector<vector<u8>>,         váhy: vector<u8>,         práh: u16,         očekávaná_adresa: adresa,     ):

Funkce nejprve volá funkci,

derive_multisig_address_quiet

, který z daných veřejných klíčů, vah a prahu vytvoří multi-sig adresu. Tato funkce používá algoritmus založený na hash pro spojení veřejných klíčů a prahové hodnoty do 16bajtové hodnoty, která je poté převedena na adresu.

nech ms_address = derive_multisig_address_quiet (pks, váhy, práh);

 Funkce pak porovná vícesig adresu s očekávanou adresou a vrátí hodnotu true, pokud jsou adresy stejné, a v opačném případě vrací hodnotu false.

návrat (ms_address == očekávaná_adresa)

Funkce

check_multisig_address_eq

lze použít k ověření, že adresa s více značkami je správná a odpovídá očekávané hodnotě. To může být užitečné pro účely testování, ladění nebo auditování. Tuto funkci lze například použít ke kontrole, zda je adresa s více značkami konzistentní s veřejnými klíči a prahem, na kterém se signatáři dohodli.

Kontrola multi-sig adresy odesílatele

Konečně,

multisig

modul také definuje adresu check_if_sender_is_multisig_address, která kontroluje, zda je odesílatel stejná multi-sig adresa, která je odvozena z poskytnutých pks, vah a prahu.

The

check_if_sender_is_multisig_address

přebírá čtyři parametry: pks, váhy, práh a ctx. První tři parametry definují schéma multi-sig adres, zatímco poslední parametr poskytuje kontext transakce.

The

pks

parametr je vektor vektorů bytů, představující veřejné klíče podepisujících osob.

The

závaží

parametr je vektor bajtů, představující váhy každého podepisujícího.

The

práh

Parametr je 16bitové celé číslo bez znaménka, které představuje minimální součet vah požadovaných k provedení transakce z adresy s více sig.

Konečně,

ctx

je měnitelný odkaz na TxContext, který obsahuje informace o aktuální transakci, jako je například odesílatel.

   veřejná zábava check_if_sender_is_multisig_address(         pks: vector<vector<u8>>,          váhy: vector<u8>,         práh: u16,          ctx: &mut    ): bo 

The

check_if_sender_is_multisig_address

funkce volá funkci check_multisig_address_eq, která porovnává multi-sig adresu s adresou odesílatele.

      check_multisig_address_eq(pks, váhy, práh, ctx.sender())             }

Funkce

check_multisig_address_eq

vrací true, pokud adresa odesílatele odpovídá schématu multi-sig adresy, a v opačném případě vrací hodnotu false.

Začněte s multi-sig

Multi-sig adresy jsou užitečné pro scénáře, kde je potřeba zlepšit zabezpečení, odpovědnost nebo spolupráci mezi více stranami. Vzhledem k cenným digitálním aktivům uloženým na Sui může adresa s více značkami pomoci udržet tato aktiva v bezpečí.

Inteligentní smlouva popsaná v tomto článku vám může pomoci začít s vytvářením aplikací navržených pro spolupráci a společnou správu aktiv. Jako další zdroj se můžete podívat na zdrojový kód a dokumentaci k tomuto projektu na GitHubu.