Sengketa Blockchain P2P


Jaringan Ethereum, yang dikenal luas dalam lingkaran sempit pengembang blockchain, telah memantapkan dirinya sebagai platform yang nyaman dan stabil untuk mengembangkan kontrak pintar. Kami mencoba membuat kontrak pintar tersedia untuk pengguna yang tidak siap dengan menawarkan kontrak sederhana namun praktis bermanfaat. Kami baru-baru ini mengembangkan kontrak pintar sengketa Bet Me. Kontrak didasarkan pada taruhan (sengketa) antara dua lawan. Mereka memperkuat kebenaran diri sendiri dengan nilai uang. Yang kalah kehilangan uang, dan pemenang mengambil segalanya. Saya akan bercerita lebih banyak tentang itu di artikel ini.


Mengapa blockchain ada di sini?


Pertama-tama, pertanyaan yang jarang ditanyakan oleh penulis artikel tentang blockchain adalah: apakah blockchain diperlukan dalam situasi ini? Tugas apa yang sulit diselesaikan dengan perjanjian lisan atau kontrak hukum, tetapi hanya dengan blockchain?


Jika dua orang berdebat secara verbal, ini sering diterjemahkan ke dalam persidangan baru. "Aku tidak bermaksud itu", "Keadaan eksternal memengaruhi hasilnya, kalau tidak aku akan benar", "Ya, aku tidak serius berdebat denganmu, tetapi kau memikirkannya sendiri" dan alasan lain yang mungkin membuat argumen lisan banyak orang terkenal harga cukup rendah. Dengan taruhan serius dan kenalan yang relatif jauh, lebih menjanjikan untuk menyimpulkan perjanjian tertulis dan menuliskan secara rinci esensi dari perselisihan, taruhan, kriteria keputusan, dan kondisi lainnya yang dianggap penting oleh para pihak.


Pendekatan ini memiliki beberapa kelemahan.


  • Paling sering, perlu untuk menarik pengacara, atau bahkan dua, satu di setiap sisi, jika tidak Anda bisa melupakan poin penting, dan ini akan menyebabkan kerugian finansial.
  • Seringkali, hanya kewajiban para pihak yang ditentukan dalam kontrak, tetapi tanggung jawab atas pelanggaran kewajiban ini tidak. Akibatnya, ternyata terlalu mudah bagi satu pihak untuk tidak membayar, dan bagi pihak lain sangat sulit dan mahal untuk mendapatkan uang Anda melalui pengadilan.
  • Atau mungkin bahwa kedua belah pihak bersikeras tidak bersalah, dan bahkan pergi ke pengadilan tidak menjamin bahwa pemenang akan mendapatkan uang.
  • Mungkin ternyata pihak yang kalah tidak punya uang, dan bahkan keputusan pengadilan tidak akan memaksanya membayar utangnya, terlepas dari semua kewajiban.

Blockchain (dan jaringan Ethereum khususnya) memungkinkan Anda untuk bekerja dengan uang (kami akan memanggil uang eter; ini tidak sepenuhnya benar, tetapi lebih mudah dan cukup mencerminkan keadaan sebenarnya, karena eter cukup mudah untuk ditukar dengan uang kertas, dan sebaliknya). Pada saat yang sama, di Ethereum, Anda dapat mengurangi perjanjian menjadi seperangkat aturan khusus, tidak mungkin untuk tidak memenuhinya. Jadi, kontrak pintar kami menerima uang dari masing-masing pihak dan memblokirnya sampai peristiwa tertentu terjadi. Satu set aturan program yang telah ditentukan akan memungkinkan pemenang untuk menarik uang. Inilah yang Anda butuhkan.


Implementasi


Seperangkat aturan yang mengatur perselisihan dapat diimplementasikan dengan berbagai cara. Di bawah ini kita akan berbicara tentang apa yang kami lakukan untuk pengguna platform Smartz.


Sengketa melibatkan dua pihak. Orang yang membuat salinan kontrak di jaringan Ethereum disebut pemilik kontrak (Pemilik), dan lawannya disebut lawan (Lawan). Pemilik kontrak membuat pernyataan teks yang dia anggap benar. Lawan bertaruh bahwa pernyataan itu salah. Keputusan tentang hasil perselisihan dibuat oleh arbiter independen (Arbiter), yang pencalonannya disetujui oleh pemilik dan lawan. Arbiter menerima komisi dalam bentuk persentase dari jumlah perselisihan.


Pekerjaan kontrak dibagi menjadi beberapa tahap berturut-turut.


  1. Negosiasi . Pemilik dan lawan, bahkan sebelum penciptaan kontrak, dapat bernegosiasi dengan cara apa pun yang nyaman. Setelah bersama-sama memutuskan siapa yang akan menjadi wasit, mereka mengirim calon undangan untuk menilai perselisihan mereka. Setelah menerima undangan, arbiter akan melihat semua kondisi dan Negara terkait. Lebih lanjut tentang ini di bawah ini, tetapi untuk saat ini penting untuk memahami bahwa calon wasit harus mentransfer nomor ini ke kontrak untuk menunjukkan pada kondisi apa dia siap untuk menilai para debat. Jika pemilik telah menetapkan jumlah setoran jaminan yang tidak nol (ArbiterPenaltyAmount), maka, sesuai dengan persyaratan, arbiter harus mentransfer jumlah airtime yang ditunjukkan ke kontrak, setelah itu diblokir sampai arbiter memutuskan debat atau hingga batas waktu penyelesaian perselisihan. Dalam kasus terakhir, arbiter kehilangan kesempatan untuk menarik uang jaminan, dan jumlah ini didistribusikan secara merata di antara para pihak yang bersengketa.
  2. Inisialisasi . Pemilik kontrak menciptakan instance kontrak dan menetapkan parameternya: subjek sengketa; tanggal dimana arbitrator harus memutuskan (Tenggat Waktu); persentase komisi arbitrase (angka pecahan β‰₯ 0 dan <100); jumlah jaminan (mungkin nol), yang harus dibuat oleh arbiter sebagai jaminan bahwa ia berkewajiban untuk memutuskan perselisihan dalam kata-kata yang ada pada waktu yang tepat. Pemilik juga menetapkan alamat Ethereum dari wasit yang dia percayai. Hanya pemilik alamat ini yang akan dapat menjadi arbitrator nanti.
  3. Tingkat pemilik Setelah pengaturan, pemegang kontrak membuat taruhan. Untuk melakukan ini, ia mengirimkan sejumlah eter ke kontrak. Jumlah ini adalah kurs, itu diblokir di alamat kontrak.
  4. Persetujuan dari arbiter . Tawaran pemilik memperbaiki ketentuan sengketa. Sekarang wasit melihat syarat-syarat penuh transaksi: kata-kata perselisihan, waktu sebelum keputusan perlu dibuat, dan yang paling penting, dia bisa memahami berapa banyak eter yang akan dia terima sebagai hadiah. Jika arbiter senang dengan semuanya, ia mengkonfirmasi keikutsertaannya dan pada saat yang sama mentransfer setoran asuransi.
  5. Cari lawan . Setelah persetujuan arbiter, pencarian lawan dimulai. Pemilik menetapkan alamat lawan terlebih dahulu, jika ia siap untuk berdebat hanya dengan seseorang yang spesifik, atau membiarkan alamat itu kosong, dan kemudian pemilik alamat apa pun di jaringan (kecuali arbiter dan pemilik) dapat menjadi lawan. Lawan mengkonfirmasikan keikutsertaan dalam perselisihan dengan memanggil metode terpisah dari kontrak, di mana ia mentransmisikan nomor versi saat ini dari data dan menyiarkan - sebanyak yang telah ditetapkan pemilik. Mulai saat ini, taruhan dianggap telah selesai. Sekarang kontrak sedang menunggu keputusan arbiter atau tanggal batas waktu.
  6. Hasil pertikaian . Arbiter dapat menilai perselisihan dengan tiga cara.
    - Mengenali pernyataan itu sebagai benar. Dalam hal ini, pemilik kontrak dapat menarik seluruh jumlah eter, kecuali untuk komisi arbiter dan uang jaminan (jika ada): uang ditarik oleh arbiter, dan lawan tidak mendapatkan apa-apa.
    - Mengakui pernyataan itu sebagai salah. Dalam hal ini, arbiter dapat menarik eter dalam jumlah komisi yang harus dibayarkan kepadanya dan jumlah janji. Lawan mengambil sisanya, tetapi pemiliknya tidak mendapatkan apa-apa.
    - Menyatakan sengketa tidak terpecahkan. Misalnya, pemilik membuat perselisihan dengan pernyataan "Pertandingan sepak bola antara tim A dan B, yang dijadwalkan untuk Minggu depan, akan berakhir dengan skor 2: 1 untuk A". Jika pertandingan dibatalkan, wasit tidak akan menyelesaikan perselisihan, tetapi dia harus dapat mengambil janjinya, karena masalahnya muncul bukan karena kesalahannya. Dalam hal ini, masing-masing pihak dapat meminta transfer udara dalam jumlah tawarannya sendiri dari alamat kontrak ke dompetnya.
  7. Tarik dana . Ketika arbiter telah membuat keputusan atau tanggal Tenggat telah tiba, masing-masing pihak dapat meminta kesimpulan di udara. Berapa banyak eter untuk output, kontrak itu sendiri akan menghitung, dengan fokus pada hasil perselisihan.
  8. Penghancuran kontrak . Pemilik dapat mengirim perintah penghancuran diri ke kontrak. Ini dapat dilakukan baik sebelum kesimpulan transaksi (jika arbiter tidak ditemukan), atau setelah penyelesaiannya (jika semua pihak menarik dana yang terhutang kepada mereka). Kesempatan seperti itu akan berguna jika, secara ajaib, lebih banyak udara daripada yang diterima diterima di alamat kontrak. Kemungkinan kejadian seperti itu sangat rendah, tetapi masih di Ethereum tidak mungkin untuk sepenuhnya memblokir transfer siaran ke alamat kontrak yang sewenang-wenang, dan melemparkan uang beku itu konyol.

Sekarang sedikit tentang mengapa Nomor Versi Negara diperlukan. Ini adalah angka yang meningkat dengan setiap perubahan dalam kondisi sengketa yang signifikan, seperti kata-kata perselisihan, ukuran komisi atau denda arbiter. Ketika seseorang menyetujui ketentuan sengketa, dia 1) melihat kondisi data saat ini; 2) mengirim panggilan ke metode kontrak, yang mendaftarkan penerimaan persyaratan. Jika antara dua peristiwa ini salah satu pihak (kemungkinan besar, pemilik) mengubah parameter kontrak, Anda akan setuju dengan versi data yang lain. Misalnya, seorang calon arbiter memasuki antarmuka kontrak di smartz.io dan melihat bahwa ia ditawari untuk menilai perselisihan pada 10 Ether (hari ini sekitar $ 3.000) dengan komisi 1% (sekitar $ 30). Kandidat dengan senang hati menyetujui dan mengirimkan transaksi konfirmasi ke jaringan. Pemilik yang tidak jujur ​​melihat di kolam penambangan transaksi mentah arbiter dan mengirimkan miliknya: mengubah remunerasi arbiter sebesar 0%. Penipu menempatkan harga gas di atas rata-rata, dan dengan beberapa kemungkinan penambang dapat memproses transaksinya lebih awal. Serangan semacam itu disebut Front running attack. Nomor Versi Negara melindungi dari itu. Jika transaksi pemilik-hama diproses lebih awal, nomor versi data dalam kontrak akan berubah. Arbiter dalam transaksinya mengirim nomor versi data lebih sedikit. Oleh karena itu, kontrak akan menolak untuk menyelesaikan transaksi, kemunduran akan terjadi. Arbiter akan meninjau kondisi baru dan menolak untuk berpartisipasi atau menyetujui dengan mengirimkan nomor versi data saat ini.


Saat mengembangkan kontrak eter, Anda harus banyak berpikir tentang skenario buruk. Apa yang akan terjadi jika pemilik kontrak memutuskan untuk mencabut arbiter? Dan bagaimana jika wasit ternyata tidak jujur? Bagaimana jika lawan sebenarnya adalah seorang hacker? Atau apakah ketiganya ingin saling membodohi, karena taruhannya cukup tinggi? Selain itu, perlu untuk mempertimbangkan setiap kemungkinan pelanggaran dari jalannya perselisihan normal, ketika siaran akan diblokir dalam kontrak dan bahkan pemiliknya tidak akan mendapatkan akses ke sana. Sebagai contoh, opsi untuk menyatakan bahwa sengketa tidak dapat diselesaikan muncul selama implementasi. Untuk alasan yang sama, urutan tahapan sengketa adalah sebagai berikut: tingkat pemilik -> pilihan arbiter -> tingkat lawan. Mungkin saja lawan tidak mengkonfirmasi keikutsertaannya, dan batas waktu sudah ditentukan jauh di masa depan. Agar tidak menjadi investor jangka panjang, penengah dapat menolak untuk berpartisipasi, tetapi hanya sampai lawan membuat taruhan. Dan ada banyak nuansa seperti itu dalam kontrak. Berita baiknya adalah ini harus diprogram sekali dan digunakan. Jika perselisihan itu diformalkan sebagai kontrak kertas, jika terjadi situasi perbatasan seperti itu, banyak orang harus masuk ke setiap item berulang-ulang dan sepakat di antara mereka sendiri bagaimana menafsirkannya. Blockchain memungkinkan Anda untuk memperbaiki kondisi, seperti dalam kontrak, tetapi menetapkan interpretasi kondisi ke mesin virtual dan selalu memiliki satu dan hanya satu hasil eksekusi.


Seseorang tidak dapat mengabaikan masalah arbiter yang tertarik. Dalam kontrak kami, wasit membuat keputusan sendiri. Untuk situasi sederhana, ini sudah cukup, tetapi kadang-kadang risiko kepentingan pribadi arbiter tidak dapat diterima. Salah satu jalan keluar adalah memperkenalkan ke dalam logika kontrak kemampuan untuk menambahkan beberapa arbiter dan membuat keputusan dengan memilih. Ini adalah logika yang agak rumit, terutama jika Anda ingin menjadikannya universal untuk semua kemungkinan perselisihan dan partisipan mereka. Namun, kabar baiknya adalah bahwa seluruh logika arbitrase kolektif yang kompleks dapat dipindahkan ke kontrak pintar yang terpisah. Alamat kontrak yang akan didaftarkan oleh pemilik perselisihan sebagai arbiter. Dari sudut pandang antarmuka, kontrak semacam itu harus dapat memanggil beberapa metode dari kontrak perselisihan: persetujuan untuk menilai perselisihan, penolakan atas persetujuan semacam itu, tiga versi keputusan dan satu metode penyiaran. Dalam kontrak arbitrase, logika keputusan sebagian besar arbiter dapat digunakan, mirip dengan bagaimana hal itu dilakukan dalam kontrak Multisignature Wallet, juga tersedia di Smartz.io sebagai konstruktor.


Untuk bagian dari perselisihan, dimungkinkan untuk mengganti kelompok arbiter dengan kontrak menggunakan satu oracle atau lebih. Atau muncul dengan cara lain, misalnya, ubah argumen menjadi roulette dengan solusi acak. Dan semua ini - tanpa mengubah kode kontrak perselisihan dan tanpa mempersulit logika kerjanya.


Pengujian


Saya ingin mengatakan beberapa kata tentang pengujian. Semua orang tahu bahwa otomatisasi pengujian itu baik. Banyak yang benar-benar menulis tes untuk kode mereka. Beberapa orang menggunakan pendekatan TDD dalam pengembangan - Pengembangan Didorong Test yang panjang dan terkenal. Perbedaan utama antara TDD dan pengujian sederhana adalah bahwa tes ditulis lebih awal dari kode. Ini memungkinkan Anda untuk melihat kode kontrak dari luar, merasakan kemungkinan masalah dan menyelesaikannya terlebih dahulu. Selain itu, TDD, bila digunakan dengan benar, memungkinkan Anda untuk secara signifikan mengubah logika kerja jika diperlukan secara tiba-tiba. Penggunaan yang tepat disertai dengan pengalaman. TDD bukan peluru perak, seperti yang mungkin Anda pikirkan, membaca banyak bahan tentang topik ini. Pada saat yang sama, mengkhawatirkan bahwa panduan pengembangan di Truffle dan Node.js sama sekali tidak menunjukkan penggunaan TDD untuk pengembangan Soliditas. Pengembang pemula mendapatkan kebiasaan buruk dan akhirnya banyak menderita.


TDD menyiratkan bahwa ada banyak tes dalam proyek ini. Misalnya, kode kontrak sengketa adalah 325 baris, dan kode uji untuk kontrak ini adalah 2144 baris. Pada titik tertentu, tes menjadi cukup besar untuk menjalankan uji truffle untuk membutuhkan waktu lebih dari satu menit. Siklus pengembangan dalam TDD melibatkan pengujian sering berjalan setelah perubahan kode kecil. Agar perkembangannya tidak berubah menjadi siksaan, saya harus mengajar Truffle untuk menjalankan hanya sebagian dari tes yang cocok dengan ekspresi reguler yang dikirim.


Di bawah tenda, Truffle menggunakan kerangka kerja Mocha untuk pengujian. Mocha dapat menyaring peluncuran tes dengan interval reguler, tetapi Truffle tidak dapat melewati parameter --grep yang sesuai dari baris perintah di luar kotak. Mengambil keuntungan dari fakta bahwa konfigurasi Truffle adalah kode JavaScript normal, saya memasukkan parsing argumen baris perintah dan pembentukan parameter untuk Mocha. Konfigurasi, yang saya dapatkan sebagai hasilnya, tersedia di proyek GitHub. Implementasinya tidak terlalu cantik, tetapi bekerja dan menghemat banyak waktu.


Ringkasan


Kontrak sengketa dipahami sebagai fungsi yang sangat sederhana, tetapi berkat TDD dan analisis vektor serangan yang mungkin, ini berkembang menjadi implementasi pembatasan yang sedikit lebih kaya. Kekurangan yang jelas dari kontrak terkait dengan keputusan tunggal arbiter, namun, mereka dapat dihilangkan tanpa mengubah kode kontrak sengketa jika sistem pemungutan suara beberapa arbiter diterapkan dalam kontrak pintar yang terpisah. Penggunaan nubuat untuk perselisihan di mana ini mungkin diwujudkan dengan cara yang sama.


Kontrak sengketa BetMe dapat diuji dan dijalankan menggunakan templat yang telah ditentukan pada platform Smartz . Ini akan membutuhkan ekstensi Metamask untuk browser desktop atau Trust Wallet untuk perangkat seluler. Juga, kode sumber kontrak itu sendiri diposting di GitHub.


Perlu diakui bahwa saat ini penggunaan teknologi blockchain turun terutama untuk cryptocurrency dan masalah token untuk ICO. Organisasi Otonomi Terdesentralisasi (DAO) belum menjadi kenyataan. Tetapi jika Anda membayangkan bagaimana sistem kontrak sengketa akan berkembang lebih lanjut, Anda dapat membayangkan daftar arbiter dengan peringkat, misalnya, berdasarkan Token Curated Registry. Setelah perselisihan selesai, peserta mereka dapat memilih atau menentang arbiter yang mereka tangani, mengubah posisi mereka di peringkat.


Di satu sisi, kontrak sengketa BetMe adalah elemen swasembada yang berlaku secara praktis. Tetapi di sisi lain, itu mungkin menjadi salah satu batu bata yang dari waktu ke waktu ekosistem organisasi yang terdesentralisasi akan terbentuk.


Tautan


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


All Articles