Light
node101 language türkçeTR
Light
node101 language türkçeTR
Çok İmzalı Cüzdanlarla Blockchain Güvenliğini Artırma

Çok İmzalı Cüzdanlarla Blockchain Güvenliğini Artırma

Desig Labs çoklu imza teknolojisi, açmak için herhangi bir sayıda anahtar gerektiren blockchain cüzdanları oluşturmayı mümkün kılar.

Sui'deki çoklu imza cüzdanları, açmak için iki veya daha fazla kriptografik anahtar gerektirdiğinden, paylaşılan varlık kontrolü için benzersiz bir araç sunar. Geleneksel kullanım örneği, bir müşteri ve bir bankanın her ikisinin de kutunun kilidini açmak için gerekli olan fiziksel bir anahtara sahip olduğu güvenlik kasalarına geri döner.
Desig Labs'de, bu teknolojiyi entegre etmek isteyen inşaatçılar için hem bir çoklu imza SDK'i hem de bireyler ve kuruluşlar için paylaşılan hesapları yönetmek üzere çoklu imzalı, çok zincirli bir cüzdan geliştirdik.
Bir güvenlik kasasına benzemekle birlikte, bu tür bir cüzdan daha geniş bir kullanım alanı sunar. Kullanıcılar cüzdanı açmak için istedikleri sayıda kriptografik anahtar ya da bizim deyimimizle imza gerektirecek şekilde yapılandırabilirler. Daha da kullanışlı olanı, bu çoklu-imzalı cüzdan, açmak için gerekenden daha fazla sayıda yetkili imzaya sahip olabilir. Örneğin, her birinin yetkili bir anahtarı olan 40 kişilik bir komite düşünün, ancak cüzdandaki dijital varlıklara erişmek için yalnızca 10 anahtara ihtiyaç vardır.
Sui'de bu cüzdan her türlü dijital varlığı tutabilir. Bir emanet örneği düşünün. Taraflardan biri diğerinden fiziksel bir ürün satın almayı kabul edebilir. Alıcı, ödemeyi her iki tarafın da bir anahtara sahip olduğu çoklu-imzalı bir cüzdana koyabilir. Alıcı ürünü teslim aldıktan sonra anahtarıyla cüzdanın kilidini açabilir ve ardından satıcı da cüzdanın kilidini açıp parayı çekebilir.
Bu örnek dolandırıcılığı önler çünkü satıcı ürünü göndermemiş olsa bile alıcı anahtarını kullanana kadar parayı çekemez. Satın alma işlemiyle ilgili bir anlaşmazlık varsa, taraflar bu sorunu çözene kadar fonlara erişilemez.
Çoklu imza cüzdanlarının açılması için iki veya daha fazla kriptografik anahtar gerekir ve cüzdanın kilidini açmak için gereken miktardan daha fazla anahtar olabilir.
Paylaşılan hesap kullanım durumlarına ek olarak, çoklu imza cüzdanları daha fazla şeffaflık sunar. Tüm işlem politikaları, imzalayanlar ve gerçek işlemler blok zincirinde kamuya açıktır ve tam görünürlük ve hesap verebilirlik sağlar. Bu şeffaflık, işlemlerin izlenmesini ve denetlenmesini kolaylaştırır; bu da yasal gerekliliklere uyması gereken kurum ve kuruluşlar için çok önemlidir.
Çok İmzalı Avanslar
Geleneksel çoklu-imza cüzdanları bir süredir piyasada olsa da, araştırmacılar gelişmiş güvenlik özelliklerine yönelik artan talebi karşılamak için daha yeni ve daha sofistike çözümler geliştirmişlerdir. Yukarıda açıklandığı gibi, dijital çoklu imza cüzdanlarının ilk örnekleri, işlemleri yetkilendirmek için birden fazla anahtar gerektirir ve birçok farklı yapılandırma mümkündür.
Hesap Soyutlama
Yeni ERC-4337 standardı, akıllı kontratların işleme dahil olmasını gerektirmeden fonları çoklu-imzalı bir cüzdanda tutmasını sağlıyor. Ethereum blockchain'ine katkıda bulunanlar bu teknolojiyi, geleneksel bir dijital cüzdan oluşturmanın sürtünmesini azaltmak ve modern bankacılık uygulamalarında yaygın olan işlem türlerini mümkün kılmak için geliştirdi. Kullanıcıların tohum ifadelere ihtiyacı yoktur ve otomatik ve tekrarlayan ödemeler ayarlayabilirler.
Bu teknoloji, işlemler üzerinde daha fazla esneklik ve kontrol sağlayarak, akıllı kontratların avantajlarından faydalanmaya devam ederken yüksek güvenlik seviyesini korumak isteyenler için popüler bir seçim haline geliyor.
Eşik İmza Şeması ve Çok Taraflı Hesaplama
Çoklu imza cüzdanımız için eşik imza şeması ve çok partili hesaplama (TSS-MPC) adı verilen bir dizi teknoloji kullanıyoruz. Bu teknolojiler yeni olmamakla birlikte, çoklu-imzalı bir cüzdan için mükemmel bir kullanım alanı sunmaktadır.
TSS, birden fazla kriptografik anahtar oluşturmak yerine, bir özel anahtarı parçalara ayırır ve bunları birden fazla taraf arasında dağıtır. Her parça gönderildiğinde, bir ana anahtar oluştururlar. Zincir üzerinde bu anahtar tek anahtarlı cüzdan imzasına benzer şekilde çalışır.
MPC, anahtar paylaşımlarını saklamak için güvenli bir yöntem olarak TSS'yi tamamlar. MPC, her bir tarafın özel verilerini açığa çıkarmadan bir işlevi hesaplamak için kullanılan bir node ağıdır. Bu kombinasyon, tek bir tarafın özel anahtarın tamamına erişememesini sağlayarak saldırganların sistemi tehlikeye atmasını zorlaştırır.
SUI üzerinde TSS uygulanması
Sui, k'nın eşik ve n'nin tüm katılımcı tarafların toplam ağırlığı olduğu n çoklu imza işleminden k'sını destekler. Maksimum taraf sayısının <= 10 olması gerekmektedir.
Örnek İş Akışı
Aşağıdaki örnekte, Sui'nin komut satırı arayüzünde çoklu imza işleminde kullanılmak üzere anahtarların oluşturulması gösterilmektedir.
Adım 1: Anahtarları Sui anahtar deposuna ekleyin
Aşağıdaki komut, desteklenen her anahtar şeması için bir Sui adresi ve anahtarı oluşturur ve bunu sui.keystore'a ekler, ardından anahtarları listeler.
$SUI_BINARY client new-address ed25519
$SUI_BINARY client new-address secp256k1
$SUI_BINARY client new-address secp256r1
$SUI_BINARY keytool list
Yanıt aşağıdakine benzer, ancak gerçek adresleri ve anahtarları görüntüler:
Sui Address | Public Key (Base64) | Scheme
-----------------------------------------------------------------------
$ADDR_1 | $PK_1 | secp256r1
$ADDR_2 | $PK_2 | secp256k1
$ADDR_3 | $PK_3 | ed25519
Adım 2: Çoklu imza adresi oluşturma
Aşağıda gösterildiği gibi açık anahtarların ve bunlara karşılık gelen ağırlıkların bir listesini girerek çoklu imza adresi oluşturabilirsiniz.
$SUI_BINARY keytool multi-sig-address --pks $PK_1 $PK_2 $PK_3 --weights 1 2 3 --threshold 3
MultiSig address: $MULTISIG_ADDR
Yanıt aşağıdakine benzer:
Participating parties:
Sui Address | Public Key (Base64)| Weight
------------------------------------------
$ADDR_1 | $PK_1 | 1
$ADDR_2 | $PK_2 | 2
$ADDR_3 | $PK_3 | 3
Adım 3: Nesneleri çoklu imza adresine gönderme
Aşağıdaki kod parçacığı, Sui Docs’daki yönergeleri izleyerek varsayılan URL'yi kullanarak yerel bir ağdan gas talep eder.
curl --location --request POST '' --header 'Content-Type: application/json' --data-raw "{ \\"FixedAmountRequest\\": { \\"recipient\\": \\"$MULTISIG_ADDR\\" } }"
Yanıt aşağıdakine benzer:
{"transferred_gas_objects":[{"amount":200000,"id":"$OBJECT_ID", ...}]}
Adım 4: Bir işlemi serileştirin
Bu adımda, çoklu imza adresine ait bir nesnenin nasıl kullanılacağı ve imzalanacak bir transferin nasıl serileştirileceği gösterilmektedir. TX_BYTES'in, gönderenin çoklu imza adresi olduğu herhangi bir serileştirilmiş işlem verisi olabileceğini unutmayın. Base64 kodlu işlem baytlarının çıktısını almak için --serialize-output flag’ini kullanmanız yeterlidir.
$SUI_BINARY client transfer --to $MULTISIG_ADDR --object-id $OBJECT_ID --gas-budget 1000 --serialize-output
Raw tx_bytes to execute: $TX_BYTES
Step 5: Sign the transaction with two keys
Use the following code sample to sign the transaction with two keys in sui.keystore. Other tools can be used to sign the transaction as long as it is serialized with flag || sig || pk.
$SUI_BINARY keytool sign --address $ADDR_1 --data $TX_BYTES
Raw tx_bytes to execute: $TX_BYTES
Serialized signature (`flag || sig || pk` in Base64): $SIG_1
$SUI_BINARY keytool sign --address $ADDR_2 --data $TX_BYTES
Raw tx_bytes to execute: $TX_BYTES
Serialized signature (`flag || sig || pk` in Base64): $SIG_2
Adım 6: Bireysel imzaları çoklu imza adresinde birleştirin
Aşağıdaki örnekte iki imzanın nasıl birleştirileceği gösterilmektedir
$SUI_BINARY keytool multi-sig-combine-partial-sig --pks $PK_1 $PK_2 $PK_3 --weights 1 2 3 --threshold 3 --sigs $SIG_1 $SIG_2
MultiSig address: $MULTISIG_ADDRESS # Informational
MultiSig address: $MULTISIG_ADDRESS # Informational
MultiSig serialized: $SERIALIZED_MULTISIG
Adım 7: Çoklu imza adresi ile bir işlem gerçekleştirin
Bu örnek, bir işlemi yürütmek için çoklu imza adresi kullanır...
$SUI_BINARY client execute-signed-tx --tx-bytes $TX_BYTES --signatures $SERIALIZED_MULTISIG
MPC yöntemi, yukarıdaki bölümde oluşturulan çeşitli anahtar paylaşımlarını saklar. MPC uygulamamızda, Shamir'in Gizli Paylaşımı (SSS) adı verilen ve bir grup insan arasında bir sırrın paylaşılmasını sağlayan bir algoritmaya güveniyoruz; bu algoritma, sırrın yalnızca gruptaki eşik sayıda kişi bilgilerini birleştirdiğinde kurtarılabileceği kısıtlamasıyla.
SSS, tüm sırrın, bizim durumumuzda bir anahtarın, bu sırrın belirli sayıda parçasından matematiksel olarak türetilmesine izin verir. Örneğin 20 parçaya bölünmüş bir anahtarın tamamını elde etmek için bu parçalardan en az 10 tanesinin kullanılması gerekebilir. Eğer bir bilgisayar korsanı bu anahtarın beş parçasını bile çalmayı başarırsa, anahtarın tamamını elde edemeyecektir.
Bu özellik, blockchain gibi dağıtılmış bir sistemde çok iyi çalışır. Ortamın kendisi veri bütünlüğünü zorunlu kılar ve paylaşılan kaynaklar ilkesi üzerine inşa edilmiştir.
SSS'nin TSS-MPC'ye dahil edilmesi bir dizi avantaj sağlar. Birincisi, hacklenebilecek veya kaybolabilecek merkezi bir şifre yoktur. Anahtarın parçaları birden fazla kişi arasında yayıldığından, anahtarın tamamını elde etmek için bu kişilerin önemli bir kısmının hacklenmesi gerekecektir. Aynı şekilde, bu gruptaki birkaç kişi anahtarın parçalarını kaybetse bile, yeterli parça kalırsa anahtarın tamamı yine de elde edilebilir. Topluluk perspektifinden bakıldığında, bu teknoloji anahtarı kullanmak için bir yeter sayının anlaşmasını gerektirir ve herhangi bir kişinin eşik miktardan az ya da hiç anahtarı elde etmesini engeller.
TSS-MPC'nin karmaşıklığı, uygulamanın bir miktar uzmanlık gerektirdiği ve daha basit şemalara göre daha fazla hesaplama kaynağı kullandığı anlamına gelir. Bu son nokta, ağ sorunları ile birleştiğinde, başlangıçta anahtar oluştururken kullanıcılar için gecikmeye neden olabilir. Büyük bir grup arasında anahtar paylaşımını koordine etmek de genellikle iyi ve açık bir iletişim gerektiren sorunlar ortaya çıkarır.
SUI üzerinde TSS-MPC Çoklu İmza Oluşturma
TSS-MPC uygulamamız ve aşağıdaki kod örnekleri sayesinde, çoklu imza teknolojisini geliştiricilerin projelerine eklemesini kolaylaştırmayı umuyoruz. Başlamak için, Yarn paket yöneticisini kullanarak @desig/web3'ü yüklemeniz gerekecektir. Komut satırı arayüzünde yarn add @desig/web3 yazın.
Örnek 1:
Aşağıdaki kod örneği, bir çoklu imzanın, kilit açma eylemi için bir teklifin ve yeterli sayıda anahtar sahibinin kabul etmesi halinde kilidi açılacak sonuç işleminin nasıl hızlı bir şekilde oluşturulacağını göstermektedir.
import { encode } from 'bs58'
import { utils } from '@noble/ed25519'
import { DesigKeypair, Multisig, Signer, Proposal, Transaction } from '@desig/web3'
const cluster = '<https://mainnet.desig.io>'
const privkey = encode(utils.randomPrivateKey())
const secretShare = 'ed25519//'
const keypair = DesigKeypair.fromSecret(secret)
// Create multisig instance
const dMultisig = new Multisig(cluster, privkey)
await dMultisig.getMultisigs()
await dMultisig.getMultisig('multisigId')
// Create signer instance
const dSigner = new Signer(cluster, privkey)
await dSigner.getAllSigners()
await dSigner.getSigner('signerId')
// Create proposal instance
const dProposal = new Proposal(cluster, privkey, keypair)
await dProposal.approveProposal('proposalId')
await dProposal.initializeProposal({ raw: ..., msg: ..., chainId: ... })
// Create transaction instance
const dTransaction = new Transaction(cluster, privkey, keypair)
await dTransaction.initializeTransaction({ type: ..., params: { ... }})
await dTransaction.getTransaction('transactionId')
await dTransaction.signTransaction('transactionId')
Örnek 2:
Aşağıdaki örnek kod, bir SUI transferini onaylamak için çoklu imza kullanan eksiksiz bir süreci açıklamaktadır.
Adım 1: Bir çoklu imza oluşturun
import { encode } from 'bs58'
import { utils } from '@noble/ed25519'
import { Multisig } from '@desig/web3'
import { EdCurve } from '@desig/core'
import { Curve } from '@desig/supported-chains'
const privkey = encode(utils.randomPrivateKey()3
const pubkey = encode(EdCurve.getPublicKey(decode(privkey)))
const dMultisig = new Multisig('', privkey)
const t = 2 // thresholdconst n = 2 // total weights
const pubkeys = [pubkey, pubkey] // You can change it to other members' pubkey
const curve = Curve.ed25519 // Refer to find the corresponding chain
const multisig = await dMultisig.initializeMultisig(curve, {
t,
n,
pubkeys,
})
Adım 2: SUI transferi için bir teklif oluşturun
import { decode } from 'bs58'
import { DesigKeypair, Proposal } from '@desig/web3'
import { toSuiAddress, SuiDevnet } from '@desig/supported-chains'
import { blake2b } from '@noble/hashes/blake2b'import {
Connection,
JsonRpcProvider,
messageWithIntent,
IntentScope,
Ed25519PublicKey,
toSerializedSignature,
} from '@mysten/sui.js'
import { transfer, sendAndConfirm } from '
const connection = new Connection({ fullnode: '' })
const provider = new JsonRpcProvider(connection)
// Create alice keypair and bob keypair from secrets sent to the emails
const aliceKeypair = new DesigKeypair('')
const bobKeypair = new DesigKeypair('')
// aliceKeypair.masterkey === bobKeypair.masterkey is true
const masterkey = toSuiAddress(aliceKeypair.masterkey)
/**
* Alice initializes a transaction
*/
const aliceProposal = new Proposal(
'<https://mainnet.desig.io>',
alicePrivkey,
alicePrivkey,
)
const bobProposal = new Proposal(
'<https://mainnet.desig.io
>
bobKeypair,
)
const tx = await transfer(masterkey, 5000)
const txSerialize = await tx.build({ provider })
const msg = messageWithIntent(IntentScope.TransactionData, txSerialize)
const digest = blake2b(msg, { dkLen: 32 })
const { id: proposalId } = await
aliceProposal.initializeProposal({
raw: txSerialize,
msg: digest,
chainId: new SuiDevnet().chainId,
})
/**
* Alice approves the transaction
*/
await aliceProposal.approveProposal(proposalId)
/**
* Bob approves the transaction
*/
await bobProposal.approveProposal(proposalId)
/**
* Bob finalizes the transaction
*/
const { sig } = await bobProposal.finalizeSignature(proposalId)
const { raw } = await bobProposal.getProposal(proposalId)
const rawTx = decode(raw)
const serializedSig = toSerializedSignature({
pubKey: new Ed25519PublicKey(masterkey),
signature: sig,
signatureScheme: 'ED25519',
})
/**
* Bob submits the transaction
*/
const txHash = await sendAndConfirm(serializedSig, rawTx)
Adım 3: SUI tutarını aktarın
import { TransactionBlock, Connection, JsonRpcProvider } from '@mysten/sui.js'
const connection = new Connection({ fullnode: '' })
const provider = new JsonRpcProvider(connection)
// Init transaction transfer
export const transfer = async (payer: string, amount: number) =>
{
const tx = new TransactionBlock()
const [coin] = tx.splitCoins(tx.gas, [tx.pure(amount.toString())])
tx.transferObjects([coin], tx.pure(payer))
tx.setSender(payer)
return tx
}
export const sendAndConfirm = async (
signature: string,
txBlock: Uint8Array,
) => {
const { digest } = await provider.executeTransactionBlock({
signature,
transactionBlock: txBlock,
})
return digest
Paylaşılmış Güvenlik
Desig Labs'de yarattığımız çoklu imza teknolojisi, emanet gibi geçici veya bir grubun hazinesindeki gibi kalıcı ve paylaşılan varlıklar için güvenlik ve önemli bir çözüm sunuyor. Sui'nin merkeziyetsizliği, onu çoklu imza cüzdanlarının sunduğu paylaşılan kontrol türü için tamamlayıcı bir ortam haline getirir.
Lütfen çoklu imza dokümantasyonumuzu inceleyin ve kendi projelerinize entegre etmek için yukarıdaki kod örneklerini kullanın. Sorularınız varsa lütfen bizimle iletişime geçin.
Projelerin çoklu imza güvenliğimiz için bulacağı birçok kullanımı görmeyi heyecanla bekliyoruz.