Кошельки и учетные записи с мультиподписью (мультиподписью) позволяют нескольким людям получать доступ к своим активам на основе определенных параметров. Например, кошелек с несколькими подписями может содержать общую казну децентрализованной автономной организации (DAO) или другой группы. Кошелек может потребовать, чтобы 25 процентов участников подписали транзакцию, прежде чем можно будет переместить какие-либо активы.

В отличие от простых кошельков с одним владельцем, кошельки с несколькими подписями открывают целый мир возможных применений, позволяя создавать игровые компоненты и коммерческие приложения, например, которые могут быть разблокированы только несколькими пользователями. Требование кворума пользователей или установка других условий разблокировки обеспечивает безопасность цифровых активов от одного мошеннического пользователя, совершающего набег на учетную запись.

Смарт-контракт с несколькими подписями, написанный на Move, служит основным строительным блоком для приложений этого типа на Sui. Смарт-контракт с несколькими подписями, представленный в этой статье, проверяет адреса с несколькими подписями и поддерживает различные комбинации ключей, такие как 2-из-3 или M-of-N, где M и N — определяемые пользователем параметры.

Создание и использование контракта проверки с несколькими подписями в Move

Адрес с несколькими подписями — это особый тип адреса, который требует нескольких подписей для авторизации транзакции. Смарт-контракт средства проверки нескольких подписей получает адрес с несколькими подписями на основе набора открытых ключей, весов и порога и сравнивает его с ожидаемым адресом.

Адреса с несколькими подписями требуют нескольких подписей для авторизации транзакции. Они часто используются для повышения безопасности средств путем распределения контроля между несколькими сторонами. Например, для адреса с мультиподписью 2 из 3 требуется, чтобы как минимум двое из трех подписывающих лиц одобрили транзакцию. Адреса с несколькими подписями также можно использовать для управления, условного депонирования или резервного копирования.

Смарт-контракт с несколькими подписями выполняет три функции. Он получает адреса с несколькими подписями, проверяет их и может проверять адрес отправителя с несколькими подписями.

Получение мультиподписных адресов

Модуль multisig определяет

Derivate_multisig_address_quiet

который принимает три параметра: pks, веса и порог.

пкс

Параметр представляет собой вектор векторов байтов, представляющий открытые ключи подписывающих лиц.

гири

Параметр представляет собой вектор байтов, представляющий веса каждого подписывающего лица.

порог

Параметр представляет собой 16-битное целое число без знака, представляющее минимальную сумму весов, необходимую для выполнения транзакции с адреса с мультиподписью.

Функция возвращает адрес, который является производным адресом с мультиподписью.

public fun Derivate_multisig_address_quiet(         pks: вектор<vector<u8>>,         веса: вектор <u8>,         порог: u16,     ): адрес {

Функция выполняет следующие шаги:

Он определяет переменную,

мультисигфлаг

, типа 8-битного беззнакового целого числа и присваивает ему значение 0x03, которое является флагом для адресов с несколькими подписями.

пусть multiSigFlag = 0x03;

Он создает пустой вектор байтов, называемый

хэш_данные

, в котором будут храниться данные, подлежащие хешированию.

пусть hash_data = вектор<u8>[];

Он получает длины

пкс

и взвешивает векторы и проверяет, что они равны. В противном случае выполнение прерывается с кодом ошибки: ELengthsOfPksAndWeightsAreNotEqual.

пусть pks_len = pgs.length(); пусть Weights_len = Weights.length(); Assert!(pks_len == Weights_len, ELengthsOfPksAndWeightsAreNotEqual);

Он инициализирует переменную,

сумма

, типа 16-битного беззнакового целого числа и присваивает ему значение 0. Затем он перебирает вектор весов и добавляет значения каждого элемента к сумме. Затем он проверяет, что порог положителен и не превышает сумму. В противном случае выполнение прерывается с кодом ошибки: EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights.

пусть mut sum = 0; пусть mut i = 0; while (i <weights_len) {              let w = Weights[i] as u16; сумма = сумма + ш; я = я + 1; }; Assert!(порог > 0 && порог <= sum, EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights);

Это подталкивает

мультисигфлаг

к вектору hash_data. Затем он сериализует порог с помощью функции bcs::to_bytes и добавляет результат к вектору hash_data.

hash_data.push_back(multiSigFlag); пусть порог_байтов: вектор<u8> = bcs::to_bytes(&threshold); hash_data.append(threshold_bytes);

Он проходит через

пкс

и взвешивает векторы и добавляет элементы каждой пары к вектору hash_data.

пусть mut i = 0; while (i < pks_len) { hash_data.append(pks[i]); hash_data.push_back(веса[i]); я = я + 1; };

Он хэширует

хэш_данные

вектор с помощью функции blake2b256 и преобразует результат в адрес с помощью функции адрес::from_bytes. Затем он присваивает адрес переменной ms_address и возвращает его.

пусть ms_address = адрес::from_bytes(blake2b256(&hash_data)); ms_address     }

Он получает адрес с несколькими подписями и возвращает адрес с несколькими подписями.

Проверка мультиподписных адресов

мультиподпись

Модуль также определяет check_multisig_address_eq, который проверяет, соответствует ли созданный адрес с несколькими подписями ожидаемому адресу. Как мы упоминали выше, адрес с несколькими подписями — это особый тип адреса, который требует нескольких подписей для авторизации транзакции. Адрес с несколькими подписями определяется набором открытых ключей, весов и порога.

Функция

check_multisig_address_eq

принимает четыре параметра: pks, веса, порог и ожидаемый_адрес. Первые три параметра такие же, как те, которые мы использовали в предыдущей функции, Derivate_multisig_address_quiet. Последний параметр, ожидаемый_адрес, представляет собой значение адреса, которое мы хотим сравнить с адресом с несколькими подписями.

публичный вход fun check_multisig_address_eq(         pks: вектор<vector<u8>>,         веса: вектор <u8>,         порог: u16,         expected_address: адрес,     ): bool {

Функция сначала вызывает функцию,

Derivate_multisig_address_quiet

, который создает адрес с несколькими подписями на основе заданных открытых ключей, весов и порога. Эта функция использует алгоритм на основе хэша для объединения открытых ключей и порога в 16-байтовое значение, которое затем преобразуется в адрес.

let ms_address = Derivate_multisig_address_quiet (pks, Weights, Threshold);

Затем функция сравнивает адрес с несколькими подписями с ожидаемым адресом и возвращает true, если адреса равны, и false в противном случае.

возврат (ms_address == ожидаемый_адрес)

Функция

check_multisig_address_eq

может использоваться для проверки правильности адреса с несколькими подписями и соответствия ожидаемому значению. Это может быть полезно для целей тестирования, отладки или аудита. Например, эту функцию можно использовать для проверки соответствия адреса с несколькими подписями открытым ключам и пороговому значению, согласованному подписывающими сторонами.

Проверка мультиподписного адреса отправителя

Наконец,

мультиподпись

Модуль также определяет check_if_sender_is_multisig_address, который проверяет, является ли отправитель тем же адресом с несколькими подписями, который получен из предоставленных pks, весов и порога.

check_if_sender_is_multisig_address

принимает четыре параметра: pks, веса, порог и ctx. Первые три параметра определяют схему адреса с несколькими подписями, а последний параметр обеспечивает контекст транзакции.

пкс

Параметр представляет собой вектор векторов байтов, представляющий открытые ключи подписывающих сторон.

гири

Параметр представляет собой вектор байтов, представляющий веса каждого подписывающего лица.

порог

Параметр представляет собой 16-битное целое число без знака, представляющее минимальную сумму весов, необходимую для выполнения транзакции с адреса с несколькими подписями.

Наконец,

ctx

— это изменяемая ссылка на TxContext, которая содержит информацию о текущей транзакции, например об отправителе.

public fun check_if_sender_is_multisig_address(         pks: вектор<vector<u8>>,         weights: вектор <u8>,         порог: u16,         ctx: &mut TxContext     ): bool {

check_if_sender_is_multisig_address

Функция вызывает функцию check_multisig_address_eq, которая сравнивает адрес с несколькими подписями с адресом отправителя.

check_multisig_address_eq(pks, Weights, Threshold, ctx.sender())             }

Функция

check_multisig_address_eq

возвращает true, если адрес отправителя соответствует схеме адреса с несколькими подписями, и false в противном случае.

Начало работы с мультиподписью

Адреса с несколькими подписями полезны в сценариях, где требуется повышенная безопасность, подотчетность или сотрудничество между несколькими сторонами. Учитывая ценные цифровые активы, хранящиеся на Sui, адрес с несколькими подписями может помочь обеспечить безопасность этих активов.

Смарт-контракт, описанный в этой статье, может помочь вам начать создавать приложения, предназначенные для совместной работы и совместного хранения активов. В качестве дополнительного ресурса вы можете просмотреть исходный код и документацию этого проекта на GitHub.