Kontrak dan alamat multisig dalam Bitcoin dan Ethereum


Kontrak multisig dalam jaringan desentralisasi modern adalah alat yang ampuh yang memungkinkan Anda untuk secara sederhana dan andal melindungi dana dalam rekening kolektif, serta melakukan transaksi dengan beberapa peserta. Jika Anda tertarik tentang cara menggunakan alamat tersebut, maka Anda hanya perlu memahami mekanisme kepemilikannya dan memiliki ide bagus tentang urutan transaksi. Untuk bekerja dengan alamat tersebut diperlukan partisipasi beberapa akun.


Terlepas dari nama yang sama dan logika kerja yang serupa, algoritma internal dan metode untuk berinteraksi dengan alamat yang dilindungi oleh multi-signature sangat berbeda dalam Bitcoin dan Ethereum. Ini tentang perangkat internal ini yang akan dibahas dalam artikel ini.


Kami akan berbicara tentang dua jaringan: Bitcoin dan Ethereum. Di blockchains lain, akses multisig ke aset crypto dapat diimplementasikan dengan cara yang sangat berbeda.


Pendahuluan


Misalkan kita memiliki tugas untuk melindungi dana dari akses tidak sah di alamat (akun, jika terminologi perbankan lebih dekat dengan Anda), di mana uang organisasi disimpan. Akses ke alamat (kemampuan untuk membuat transaksi dari itu ke yang eksternal) tersedia untuk beberapa orang, misalnya, umum, keuangan dan kepala akuntan. Untuk melindungi uang, jika seseorang dari trinitas ini dipaksa untuk menandatangani suatu kesimpulan, ada beberapa multisig. Dalam Bitcoin dan Ethereum, Anda dapat membuat alamat, penarikan dana yang tidak hanya membutuhkan satu, tetapi beberapa konfirmasi.


Sekarang, masing-masing dari tiga peserta, yang ingin membuat transaksi untuk penarikan, harus memberikan tanda tangannya untuk mengkonfirmasi persetujuannya untuk transaksi. Ketika cukup tanda tangan dikumpulkan, dana ditransfer. Logika ini disebut multisig: mengirim tanda tangan M (M> N) untuk mengonfirmasi operasi.


Untuk jaringan terdesentralisasi, multisig adalah pola asli, karena setiap transaksi sah yang dikirim ke alamat tertentu dengan desain berisi tanda tangan elektronik yang dibuat oleh kunci rahasia pengirim, sehingga hampir semua fungsi yang diperlukan untuk alamat multisig sudah ada di sebagian besar blockchains modern.


Yang paling menarik adalah alamat multisig 2/3 yang paling sederhana, kesimpulannya hanya mungkin atas persetujuan dua dari tiga peserta. Multisig yang demikian mampu melakukan banyak transaksi dengan tiga pihak yang nyaman dan aman dan menyelesaikan masalah ketika dua peserta mempercayai pihak ketiga untuk menilai mereka. Hampir semua layanan keuangan di mana ada pihak ketiga yang dipercaya diimplementasikan menggunakan multisig 2/3. Misalnya, ambil surat kredit: pembayar menghasilkan uang dan tidak dapat mengambilnya kecuali ia meyakinkan bank (tempat dokumen pembelian belum tiba) atau penerima (atas kehendaknya sendiri) untuk menyetujui hal ini. Penerima juga tidak akan dapat mengumpulkan uang jika penjual tidak mengembalikannya (atas kehendak sendiri) atau bank tidak menginformasikan bahwa dokumen yang diperlukan telah sampai kepadanya dan dia memeriksanya. Dalam skema itu, layanan bank itu sederhana: ketika melihat kesepakatan tentang pembelian apartemen, alih-alih membawa kunci ke sel ke toko, ia hanya mengirim persetujuan ke alamat multisig.


Tugas-tugas akuntansi dan pembayaran untuk layanan juga condong ke multisig 2/3: sering kali mengharuskan pihak ketiga untuk memutuskan apakah layanan itu diberikan dan sejauh mana. Multisig, di mana salah satu dari tiga tanda tangan milik organisasi, yang akhirnya memutuskan apakah layanan diberikan atau tidak (misalnya, ke pengadilan), berarti pengadilan, setelah memutuskan mendukung salah satu pihak, hanya menandatangani keputusannya dan mengirim transaksi, secara otomatis membuka kunci dana untuk pihak yang menang. Untuk layanan B2C seperti Uber atau AirBnB, multisig, meskipun secara implisit, adalah pola kerja utama: ketika layanan disediakan, itu adalah tanda tangan dari permintaan oleh layanan yang menginisiasi pengiriman dana dari klien ke pengemudi atau pemilik apartemen.


Secara umum, multisig yang diimplementasikan dengan mudah - seperti senapan serbu Kalashnikov: murah dan ceria, cocok untuk digunakan di rumah dan dengan biaya jutaan dolar. Dan di blockchain, semua ini adalah "tanpa registrasi dan SMS" (dari sudut pandang keamanan, ini, kebetulan, adalah tesis yang cukup serius, jika Anda memikirkannya).


Kami akan mempertimbangkan dua blockchains - Bitcoin dan Ethereum. Saya harus mengatakan bahwa perangkat multisig internal di dalamnya sangat berbeda, semuanya bekerja secara berbeda. Tapi jangan maju dulu.


Bitcoin multisig


Bitcoin sebenarnya tidak sesederhana seperti yang terlihat oleh banyak orang. Desainnya memungkinkan Anda menerapkan skema yang ringan dan sekaligus sangat aman untuk mendapatkan akses ke dana. Yah, saya menambahkan bahwa, murni menurut pendapat pribadi saya, struktur dan algoritma dalam Bitcoin dipikirkan dengan baik, optimal dan hanya indah. Terjemahan standar X bitcoin dari alamat ke alamat hanyalah jenis transaksi standar, puncak gunung es dari potensi kemampuan Bitcoin. Transaksi default untuk menerjemahkan BTC dari sudut pandang kode adalah multisig 1/1 yang paling sederhana: untuk menggunakan bitcoin X dari alamat a1, Anda harus melampirkan tanda tangan elektronik untuk transaksi menggunakan kunci rahasia milik alamat a1. Mari kita lihat struktur transaksi Bitcoin dan gali lebih dalam tentang cara kerjanya.


gambar


Ada persyaratan dalam Bitcoin: semua BTC yang disimpan di alamat tertentu selalu dihabiskan secara keseluruhan. Artinya, setelah mengkonfirmasi haknya untuk memiliki alamat, transaksi tersebut menghabiskan seluruh saldo, mendistribusikannya ke beberapa output. Dalam kehidupan nyata, meninggalkan perbedaan antara input dan output kepada penambang sebagai komisi, tetapi untuk artikel ini ini tidak signifikan.


Bayangkan situasinya. Vasya menerima 50 BTC. Vasya ingin mengirim Peta 0,5 BTC. Untuk melakukan ini, ia harus menghabiskan semua 50 BTC. Untuk mendapatkan perubahan, Vasya mengambil satu input (50 BTC) dan membuat dua output:


  • 0,5 BTC ke alamat Petit;
  • 49,5 BTC ke salah satu alamat Anda sendiri.

Ketika mereka mengatakan "Vasya menandatangani transaksi" - ini tidak sepenuhnya akurat untuk Bitcoin. Vasya menandatangani semua input dalam transaksi, dan setiap input adalah alamat bitcoin yang terpisah, dan masing-masing membutuhkan kunci rahasia yang sesuai. Misalkan Vasya memiliki tiga alamat yang masing-masing tiga temannya mengirim 0,1 BTC. Untuk menghabiskan 0,25 BTC, Vasya harus menandatangani tiga input (masing-masing 0,1) dan membentuk dua output (0,25 ke alamat penerima dan 0,05 untuk dirinya sendiri sebagai perubahan). Skema semacam itu memungkinkan, khususnya, untuk tidak pernah menggunakan alamat yang sama dua kali dan mengembalikan perubahan setiap kali ke yang baru. Beberapa dompet, seperti Electrum, memungkinkan pemilik untuk memilih strategi untuk menggunakan kembali alamat, lebih pribadi (setiap kali alamat baru) atau lebih sederhana, tetapi dengan alamat permanen (skema ini lebih nyaman jika Anda melakukan transaksi reguler yang kompleks). Saya mengingatkan Anda bahwa perbedaan antara jumlah input dan output adalah komisi untuk penambang: sederhana dan dapat diandalkan.


Sekarang, alih-alih "Vasya menandatangani transaksi," saya katakan, "Vasya menandatangani input." Tapi saya sengaja melewatkan beberapa poin lagi, agar tidak menyulitkan skema keseluruhan. Faktanya adalah bahwa alamat dalam Bitcoin bukan kunci publik dalam bentuknya yang paling murni, tetapi hashnya (dua kali hash dengan beberapa byte dan versi layanan, detail dalam artikel Bitcoinwiki), yaitu, dalam transaksi normal, pengirim bahkan tidak mengetahui kunci publik penerima. Oleh karena itu, Vasya, menandatangani input, di samping tanda tangan itu sendiri, menyajikan Bitcoin Script dengan kunci publiknya sendiri, sehingga mengungkapkannya. Secara alami, mengetahui kunci publik, Anda dapat dengan mudah menghasilkan alamat Bitcoin.


Selain menandatangani input, Vasya juga menetapkan kondisi untuk setiap output, cara membelanjakan BTC dari output khusus ini. Tetapi "persyaratan" diberikan kepadanya oleh orang yang akan menerima bitcoin: itu adalah kekhawatirannya bagaimana ia akan menghabiskan BTC-nya. Ini adalah poin yang sangat penting. Alamat Bitcoin berisi hash dari kode yang akan memutuskan apakah akan mengizinkan BTC dari alamat ini.


Jika Anda masih mencari analogi, maka Vasya untuk setiap output (yang ia terima oleh mereka yang menerima BTC) akan melampirkan data yang menjawab pertanyaan "Kode apa dan pada data apa yang benar-benar mengembalikan pengirim yang dianggap sebagai pemilik output ini?" . Berikut analogi lain untuk python: Anda dapat membayangkan bahwa setiap output berisi fungsi lambda, yang dieksekusi oleh Petya, yang memberinya argumen, akan mengembalikan benar atau salah. Jika benar dikembalikan, maka Petya dapat menggunakan output sebagai input untuk transaksi selanjutnya. Dalam versi default, program dapat mengambil dua argumen yang disediakan oleh Petya - tanda tangan keluaran dan kunci publik Petin - dan memverifikasi tanda tangan. Jika benar dikembalikan, maka Petya memiliki hak untuk output dan dapat membelanjakannya; oleh karena itu, transaksi tersebut valid. Tidak perlu menyelam lebih dalam dalam kerangka artikel ini di Script, tetapi sangat diinginkan. Omong-omong, tebus skrip - ini adalah kontrak yang sangat cerdas, yaitu aturan formal yang digunakan untuk mengalihkan BTC dari satu alamat ke alamat lainnya. Klien jaringan, selama transaksi, mengeksekusi setiap skrip dalam setiap transaksi, memeriksa apakah itu valid. Jika valid - valid dan tak terbantahkan pemborosan bitcoin dari alamat tertentu.


Berikut adalah artikel bagus pertama tentang topik ini, saya sangat merekomendasikan membacanya, seluruh mekanisme mentah dengan contoh-contoh dalam python dicat dengan baik: Bitcoin dengan cara yang sulit: Menggunakan protokol Bitcoin mentah . Dan ini yang lainnya: Singkatnya, Bitcoin - Transaksi .


Mari kita kembali ke multisig 2/3, mencatat bahwa transaksi biasa dengan transfer bitcoin juga dapat dianggap sebagai multisig 1/1. Misalkan Petya ingin Vasya mentransfer BTC kepadanya. Petya memberikan Vasya alamat yang dijahit dengan hash dari skrip default, dan Bitcoin dapat mengambil bitcoin dari alamat ini dengan memberikan kode verifikasi tanda tangan standar dan tanda tangan itu sendiri. Alamat "tradisional" dalam Bitcoin dimulai dengan nomor 1 (unit). Alamat ke mana kode "tidak konvensional" dijahit (memeriksa skrip multisig) disebut pay-to-script dan mulai dengan 3 (tiga kali lipat).


Bitcoin memungkinkan kita untuk membuat alamat di mana hash skrip penukaran KAMI SENDIRI akan dijahit. Bagaimanapun, ini adalah masalah kita, karena kita kemudian akan menghabiskan BTC kita, dan bukan yang mengirim. Kami tidak peduli siapa yang mentransfer bitcoin ke suatu alamat, tetapi penting bahwa ketika kami ingin membelanjakannya, kami harus memberikan kode yang sesuai dengan alamat tersebut. Yaitu, dengan meminta saya untuk mentransfer BTC ke alamat pay-to-script, saya berjanji untuk menyediakan skrip itu sendiri nanti, dalam transaksi yang menggunakan input ini.


Menurut dokumentasi, untuk kode multisig jenis ini digunakan:


----------------------------------------------------------- Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Signature script: <sig> [sig] [sig...] <redeemScript> ----------------------------------------------------------- 

( Artikel lanjutan tentang skrip dan multisig )


Kami membutuhkan naskah sehingga semua tanda tangan yang diperlukan segera disajikan dalam transaksi pengeluaran. Jika, misalnya, multisig 2/3 kami berisi alamat tiga peserta (CEO, akuntan kepala dan administrator sistem) dan kunci rahasia untuk tanda tangan ada di komputer mereka secara terpisah, maka untuk membentuk transaksi pembelanjaan, administrator sistem harus:


  • menghasilkan transaksi pembelanjaan;
  • buat tanda tangan Anda sendiri;
  • mentransfer isi transaksi ke penandatangan kedua (misalnya, pergi ke departemen akuntansi atau ke jenderal dengan flash drive);
  • meminta penandatangan kedua untuk menambahkan tanda tangan pada transaksi;
  • mengirim transaksi ke jaringan dengan dua dari tiga tanda tangan.

Ini bukan cara yang sangat sederhana, tetapi memungkinkan Anda untuk menggunakan sebagai salah satu penanda tangan komputer yang benar-benar terputus dari jaringan dan tidak dijamin untuk menggabungkan kunci rahasia. Dalam hal ini, penarikan dana sepenuhnya "manual", yang cukup baik untuk jumlah besar. Abad 21, teman-teman, sekarang modis untuk meletakkan laptop nol di brankas tanpa koneksi jaringan dan dengan satu-satunya perangkat lunak yang diinstal - dompet Bitcoin.


Ethereum multisig


Implementasi multisig di Ethereum sangat berbeda dari yang ada di Bitcoin karena desain yang berbeda dari algoritma jaringan klien internal, tetapi ada paralelnya. Dalam Ethereum, transaksi khusus jenis "create_contract" membuat alamat di jaringan yang terikat dengan kontrak tertentu. Alamat ini juga memiliki saldo eter. Jika Anda mengirim eter ke sana, alamat "akan membuatnya seimbang." Dan sebaliknya, jika Anda mengirim eter dari alamat, itu akan "dihapus dari neraca".


Saya segera memunculkan beberapa analogi yang cukup akurat untuk memahami dapur yang sangat sederhana dan logis. Jika kita lupa tentang konsensus dan bagaimana node memperbarui rantai blok, dan menganggap blockchain sebagai penyimpanan abstrak, maka penempatan kontrak dapat dibandingkan, misalnya, dengan instantiasi objek, yaitu, mengubah kelas menjadi objek nyata dalam RAM. Dalam analogi, memori adalah blockchain, dan kode kelas adalah kode kontrak. Setelah instantiasi, objek (kontrak) menerima alamatnya sendiri di "memori", dan jaringan tahu antarmuka untuk itu, disajikan dalam bentuk yang dijelaskan dalam kelas metode.


Transaksi yang tiba di alamat dalam skema semacam itu adalah metode penulis, mereka mengubah keadaan internal objek kontrak. Setiap klien jaringan mengeksekusi metode-pembaca, yang hanya membaca data dari status kontrak, karena yakin bahwa salinan objeknya benar dan dikonfirmasi oleh konsensus produsen blok. Penting juga untuk memahami bahwa kode kontrak dijalankan ketika penambang "menerapkan" transaksi yang sampai pada kontrak yang ada, dan dalam versi kami hanya memanggil salah satu metode kontrak dengan argumen yang tertanam dalam transaksi.


Yah, karena kontrak memiliki keadaan internal (bidang objek dalam analogi kami), ia dapat menerapkan multisig tanpa perlu mengirim tanda tangan dalam satu transaksi. Kami membuat kontrak, di dalamnya kami membuat hardcode alamat penandatangan, ketika transaksi untuk penarikan tiba - kami mentransfer kontrak secara berurutan ke keadaan menunggu jumlah konfirmasi yang diperlukan. Jika kita berbicara tentang multisig 2/3, mungkin terlihat seperti ini:


  • administrator sistem akan menggunakan kontrak multisig ke jaringan dan memasukkan alamat direktur umum dan kepala akuntan di dalamnya;
  • pelanggan senang mengirim banyak eter ke kontrak;
  • akuntan kepala akan melakukan pembayaran besar dan mengirimkan transaksi ke kontrak dengan keinginan untuk mentransfer eter ke alamat eksternal;
  • multisig-kontrak masuk ke negara bagian "Saya berharap N konfirmasi", dalam kasus kami cukup satu;
  • CEO ingin membantu akuntan kepala, tetapi dia lupa di mana laptop kunci rahasia diperlukan;
  • administrator sistem mengirimkan transaksi - konfirmasi penarikan dana ke kontrak;
  • kontrak, setelah menerima transaksi dari administrator sistem, memahami bahwa konfirmasi N yang diperlukan telah dihubungi, dan mengirimkan siaran ke alamat yang dipesan oleh akuntan kepala, sambil kembali ke negara bagian penerimaan dana sederhana.

Banyak hal yang dapat diimplementasikan secara berbeda tergantung pada implementasi kontrak multisig. Ini berlaku untuk penyimpanan pesanan luar biasa untuk penarikan, interval waktu untuk menunggu penarikan, batasan nyaman. Misalnya, Anda dapat mengizinkan penarikan jumlah hingga batas tertentu tanpa multi-tanda tangan dan memerlukan konfirmasi jika batas terlampaui.


Ada beberapa opsi untuk kode kontrak multisig wallet, Anda dapat menemukannya dengan mudah. Yang paling resmi di antara mereka adalah yang ini . Ada banyak lagi modifikasi kontrak multisig, serta kontrak yang multisig, tetapi bahkan tidak mengetahuinya, karena kontrak apa pun dengan beberapa peran dalam pengertian filosofis adalah multisig.


Kesimpulan


Kami memeriksa skema operasi dari salah satu batu bata yang paling penting untuk membangun sistem kontrak yang kompleks dan mengatur transaksi multilateral. Di mana cara termudah untuk merasakan alamat multisig tinggal:


  • untuk Bitcoin: dompet Electrum memiliki instruksi langkah demi langkah terperinci dengan tangkapan layar tentang cara membuat dan mengonfigurasi alamat multisig dan cara menggunakannya. Cukup cari Electrum multisig;
  • untuk Ethereum: ada bagian Kontrak di dompet dompet Ethereum standar, dan di sana Anda dapat dengan mudah membuat multisig. Selain itu, multisig tentu akan disajikan dalam berbagai bentuk di platform untuk meluncurkan kontrak standar, misalnya, kami sudah memilikinya di Smartz.io kami.

Seperti yang Anda lihat, di blockchain, skema ini sangat teknologi dan sederhana, jadi gunakan untuk kesenangan Anda dan lindungi kekayaan crypto Anda dengan benar.

Source: https://habr.com/ru/post/id412675/


All Articles