Dompet dan akun multi-tanda tangan (multi-sig) memungkinkan banyak orang mengakses aset mereka berdasarkan parameter tertentu. Dompet multi-sig mungkin berisi organisasi otonom terdesentralisasi (DAO) atau perbendaharaan komunal kelompok lain, misalnya. Dompet tersebut mungkin memerlukan 25 persen anggota untuk menandatangani transaksi sebelum aset apa pun dapat dipindahkan.

Berbeda dengan dompet satu pemilik yang sederhana, dompet multi-sig membuka banyak kemungkinan penggunaan, memungkinkan Anda membuat komponen game dan aplikasi perdagangan, sebagai dua contoh, yang hanya dapat dibuka oleh banyak pengguna. Mewajibkan kuorum pengguna, atau menetapkan kondisi buka kunci lainnya, menjaga aset digital tetap aman dari satu pengguna nakal yang menyerbu sebuah akun.

Kontrak pintar multi-tanda tangan, yang ditulis dalam Move, berfungsi sebagai blok penyusun utama untuk jenis aplikasi ini di Sui. Kontrak pintar multi-sig yang disajikan dalam artikel ini memverifikasi alamat multi-sig, dan mendukung kombinasi kunci yang berbeda, seperti 2-of-3 atau M-of-N, di mana M dan N adalah parameter yang ditentukan pengguna.

Membuat dan menggunakan kontrak pemeriksa multi-sig di Move

Alamat multi-sig adalah jenis alamat khusus yang memerlukan banyak tanda tangan untuk mengotorisasi suatu transaksi. Kontrak pintar pemeriksa multi-sig memperoleh alamat multi-sig dari sekumpulan kunci publik, bobot, dan ambang batas, dan membandingkannya dengan alamat yang diharapkan.

Alamat multi-sig memerlukan banyak tanda tangan untuk mengotorisasi suatu transaksi. Mereka sering digunakan untuk meningkatkan keamanan dana dengan mendistribusikan kendali kepada banyak pihak. Misalnya, alamat multi-tanda 2 dari 3 memerlukan setidaknya dua dari tiga penandatangan untuk menyetujui transaksi. Alamat multi-sig juga dapat digunakan untuk tujuan tata kelola, escrow, atau cadangan.

Kontrak pintar multi-sig menjalankan tiga fungsi. Ini memperoleh alamat multi-sig, memverifikasinya, dan dapat memeriksa alamat multi-sig pengirim.

Dapatkan alamat multi-sig

Modul multisig mendefinisikan

turunkan_multisig_address_quiet

yang mengambil tiga parameter: pks, bobot, dan ambang batas.

Itu

pks

parameter adalah vektor vektor byte, mewakili kunci publik dari penandatangan.

Itu

beban

parameter adalah vektor byte, yang mewakili bobot setiap penanda tangan.

Itu

ambang

parameter adalah bilangan bulat 16-bit yang tidak ditandatangani, mewakili jumlah bobot minimum yang diperlukan untuk mengeksekusi transaksi dari alamat multi-tanda tangan.

Fungsi ini mengembalikan sebuah alamat, yang merupakan alamat multi-tanda tangan turunan.

kesenangan publik descend_multisig_address_quiet(         pks: vector<vector<u8>>,         bobot: vector<u8>,         ambang batas: u16,     ): alamat {

Fungsi ini melakukan langkah-langkah berikut:

Ini mendefinisikan variabel,

multiSigFlag

, bertipe integer unsigned 8-bit dan memberinya nilai 0x03, yang merupakan tanda untuk alamat multi-tanda tangan.

biarkan multiSigFlag = 0x03;

Ini menciptakan vektor byte kosong yang disebut

hash_data

, yang akan menyimpan data yang akan di-hash.

biarkan hash_data = vector<u8>[];

Itu mendapatkan panjang

pks

dan menimbang vektor dan memeriksa apakah keduanya sama. Jika tidak, eksekusi akan dibatalkan dengan kode kesalahan: ELengthsOfPksAndWeightsAreNotEqual.

biarkan pks_len = pgs.length(); biarkan bobot_len = bobot.panjang(); menegaskan!(pks_len == bobot_len, ELengthsOfPksAndWeightsAreNotEqual);

Ini menginisialisasi variabel,

jumlah

, bertipe integer unsigned 16-bit dan memberinya nilai 0. Ia kemudian melakukan loop melalui vektor bobot dan menambahkan nilai setiap elemen ke dalam jumlah. Ia kemudian memeriksa apakah ambang batasnya positif dan tidak lebih besar dari jumlahnya. Jika tidak, eksekusi akan dibatalkan dengan kode kesalahan: EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights.

misalkan jumlah mut = 0; misalkan mut i = 0; while (i < Weights_len) {             misalkan w = bobot[i] sebagai u16; jumlah = jumlah + w; saya = saya + 1; }; menegaskan!(ambang batas > 0 && ambang batas <= jumlah, EThresholdIsPositiveAndNotGreaterThanTheSumOfWeights);

Ini mendorong

multiSigFlag

ke vektor hash_data. Kemudian membuat serial ambang batas menggunakan fungsi bcs::to_bytes dan menambahkan hasilnya ke vektor hash_data.

hash_data.push_back(multiSigFlag); biarkan ambang batas_bytes: vektor<u8> = bcs::ke_bytes(&ambang batas); hash_data.append(threshold_bytes);

Itu berputar melalui

pks

dan memberi bobot pada vektor dan menambahkan elemen dari setiap pasangan ke vektor hash_data.

misalkan mut i = 0; while (i < pks_len) { hash_data.append(pks[i]); hash_data.push_back(bobot[i]); saya = saya + 1; };

Itu hash

hash_data

vektor menggunakan fungsi blake2b256 dan mengubah hasilnya menjadi alamat menggunakan fungsi address::from_bytes. Ia kemudian memberikan alamat ke variabel, ms_address, dan mengembalikannya.

biarkan ms_address = alamat::from_bytes(blake2b256(&hash_data)); ms_address     }

Ini memperoleh alamat multi-sig dan mengembalikan alamat multi-sig.

Memverifikasi alamat multi-sig

Itu

multitanda

modul juga mendefinisikan check_multisig_address_eq, yang memeriksa apakah alamat multi-sig yang dibuat cocok dengan alamat yang diharapkan. Seperti yang kami sebutkan di atas, alamat multi-sig adalah jenis alamat khusus yang memerlukan banyak tanda tangan untuk mengotorisasi suatu transaksi. Alamat multi-sig ditentukan oleh sekumpulan kunci publik, bobot, dan ambang batas.

Fungsinya

check_multisig_address_eq

membutuhkan empat parameter: pks, bobot, ambang batas, dan alamat_yang diharapkan. Tiga parameter pertama sama dengan yang kita gunakan pada fungsi sebelumnya, descend_multisig_address_quiet. Parameter terakhir, Expected_address, adalah nilai alamat yang ingin kita bandingkan dengan alamat multi-sig.

entri publik fun check_multisig_address_eq(          pks: vector<vector<u8>>,         bobot: vector<u8>,         ambang batas: u16,         expected_address: alamat,     ): bool {

Fungsi tersebut pertama-tama memanggil fungsi tersebut,

turunkan_multisig_address_quiet

, yang membuat alamat multi-sig dari kunci publik, bobot, dan ambang batas tertentu. Fungsi ini menggunakan algoritma berbasis hash untuk menggabungkan kunci publik dan ambang batas menjadi nilai 16 byte, yang kemudian diubah menjadi alamat.

biarkan ms_address = descend_multisig_address_quiet(pks, bobot, ambang batas);

Fungsi tersebut kemudian membandingkan alamat multi-sig dengan alamat yang diharapkan dan mengembalikan nilai true jika alamatnya sama, dan false jika sebaliknya.

kembali (ms_address == alamat_yang diharapkan)

Fungsinya

check_multisig_address_eq

dapat digunakan untuk memverifikasi bahwa alamat multi-sig sudah benar dan cocok dengan nilai yang diharapkan. Ini dapat berguna untuk tujuan pengujian, debugging, atau audit. Misalnya, seseorang dapat menggunakan fungsi ini untuk memeriksa apakah alamat multi-sig konsisten dengan kunci publik dan ambang batas yang disepakati oleh penandatangan.

Memeriksa alamat multi-sig pengirim

Akhirnya, itu

multitanda

modul juga mendefinisikan check_if_sender_is_multisig_address, yang memeriksa apakah pengirimnya adalah alamat multi-sig yang sama yang berasal dari pks, bobot, dan ambang batas yang disediakan.

Itu

check_if_sender_is_multisig_address

mengambil empat parameter: pks, bobot, ambang batas, dan ctx. Tiga parameter pertama menentukan skema alamat multi-sig, sedangkan parameter terakhir menyediakan konteks transaksi.

Itu

pks

parameter adalah vektor vektor byte, mewakili kunci publik dari penandatangan.

Itu

beban

parameter adalah vektor byte, yang mewakili bobot setiap penanda tangan.

Itu

ambang

parameter adalah bilangan bulat 16-bit yang tidak ditandatangani, mewakili jumlah bobot minimum yang diperlukan untuk mengeksekusi transaksi dari alamat multi-sig.

Akhirnya, itu

ctx

adalah referensi yang bisa diubah ke TxContext, yang berisi informasi tentang transaksi saat ini, seperti pengirim.

public fun check_if_sender_is_multisig_address (          pks: vector<vector<u8>>,          bobot: vector<u8>,          ambang batas: u16,          ctx: &mut TxContext     ): bool {

Itu

check_if_sender_is_multisig_address

fungsi memanggil fungsi check_multisig_address_eq, yang membandingkan alamat multi-sig dengan alamat pengirim.

check_multisig_address_eq(pks, bobot, ambang batas, ctx.sender())             }

Fungsinya

check_multisig_address_eq

mengembalikan nilai benar jika alamat pengirim cocok dengan skema alamat multi-sig, dan salah jika sebaliknya.

Memulai dengan multi-tanda tangan

Alamat multi-sig berguna untuk skenario di mana terdapat kebutuhan untuk meningkatkan keamanan, akuntabilitas, atau kolaborasi di antara banyak pihak. Mengingat aset digital berharga yang disimpan di Sui, alamat multi-sig dapat membantu menjaga keamanan aset tersebut.

Kontrak pintar yang dijelaskan dalam artikel ini dapat membantu Anda mulai membangun aplikasi yang dirancang untuk kolaborasi dan hak asuh aset bersama. Sebagai sumber lebih lanjut, Anda dapat melihat kode sumber dan dokumentasi untuk proyek ini di GitHub.