Hierarki Dompet Multi-Signed (Sistem Kepercayaan)

Teks ini menjelaskan abstraksi sistem kepercayaan, yang memungkinkan Anda untuk mengintegrasikan layanan escrow ke dalam bidang hubungan ekonomi apa pun.
Menyimpan dana adalah bagian mendasar dari setiap transaksi. Jika rekanan tidak mengetahui informasi yang dapat dipercaya tentang satu sama lain, maka risiko penipuan meningkat. Pendekatan ini memungkinkan Anda memprogram dalam model desentralisasi jaringan desentralisasi, model untuk melakukan transaksi otomatis, transaksi aman, dll. Selain itu, model sistem kepercayaan seperti itu terbuka. Semua transaksi yang dilakukan dengan partisipasi dari hierarki dompet multi-langganan memungkinkan kami untuk memverifikasi peringkat rekanan dan juga melindungi diri dari skema penipuan peserta baru dalam hubungan ekonomi.

Isi


1 Pendahuluan
2 Deskripsi dompet multi-tanda tangan
3 Cara untuk membangun hierarki dompet
4 antarmuka hierarki dompet multi-hari
5 Aliran Interaksi
5.1 Alur interaksi standar
5.2 Alur Interaksi yang Aman
5.3 Aliran interaksi yang kontroversial
6 Protokol ESCB9
7 Integrasi sistem kepercayaan dan kontrak pintar yang mengimplementasikan protokol ESCB9
8 Contoh kontrak yang menerapkan ESCB9
8.1 Kontrak pintar untuk pasar sewa pribadi, mengikuti contoh AirBnb
8.2 Kontrak pintar untuk menukar cryptocurrency dengan uang fiat dan kembali dalam mode desentralisasi
9 node arbitrase
10 Kamus

1. Pendahuluan


Masalah utama untuk layanan escrow adalah penciptaan hubungan saling percaya antara semua peserta. Selain itu, para peserta itu sendiri tidak harus diketahui setiap subjek hubungan. Untuk meringkas semua kasus, kami akan mempertimbangkan bahwa semuanya adalah anonim. Untuk sistem hubungan saling percaya seperti itu, penting untuk mengatur hubungan peserta baru dengan yang lama. Peserta lama sudah memiliki peringkat tertentu dalam sistem hubungan dan dengan demikian menyebabkan lebih percaya diri. Karena tidak ada yang tahu siapa pun dalam sistem kepercayaan, ini menyebabkan masalah dengan verifikasi peringkat sebelumnya. Dokumen ini menjelaskan sistem kepercayaan berdasarkan kripto-dompet multi-berlangganan. Sistem seperti itu dapat diprogram menjadi kontrak yang cerdas. Mengingat distribusi luas platform Ethereum, kami akan memilih platform ini sebagai platform untuk menggambarkan semua kontrak pintar dalam dokumen ini.

2. Deskripsi dompet multi-tanda tangan


Abstraksi yang memungkinkan Anda untuk mengkonfirmasi atau membatalkan transaksi hanya jika konsensus dicapai antara peserta yang berwenang untuk membuat keputusan seperti itu disebut dompet multi-tanda tangan. Transaksi dalam konteks ini adalah operasi atom yang diprogram untuk mengeksekusi metode dalam kontrak pintar lain atau yang sama.

Antarmuka untuk kontrak Smart dari abstraksi tersebut dapat direpresentasikan sebagai:

  1. konstruktor menerima alamat anggota pendiri dan jumlah konfirmasi minimum yang diperlukan untuk transaksi
    constructor(address[]:members, uint256:requiredConfirmationCount) 

  2. Antarmuka Peserta Resmi
    1. mendapatkan daftar peserta
       static getMembers() -> address[]:address 

    2. lihat alamat anggota
       static getMember(uint256:indexNumber) -> address:address 

    3. verifikasi alamat untuk keanggotaan
       static isMember(address:address) -> bool:value 

    4. mendapatkan jumlah peserta maksimum untuk dompet
       static getMaxMemberCount() -> uint256:value 

    5. Konfirmasi Konsensus Minimum
       static getRequiredConfirmationCount() -> uint256:value 

    6. acara penambahan anggota baru
       event MemberAddition() -> address:member 

    7. acara penghapusan anggota
       event MemberRemoval() -> address:member 

    8. mengubah acara diperlukan jumlah konfirmasi untuk dieksekusi
       event RequiredConfirmationCountChange() -> uint256:count 

    9. tambahkan anggota
       execute addMember(address:member) -> void:value 

    10. penghapusan anggota
       execute removeMember(address:member) -> void:value 

    11. penggantian anggota
       execute replaceMember(address:currentMember, address:newMember) -> void:value 
    12. perubahan dalam jumlah konfirmasi wajib untuk eksekusi
       execute changeRequiredConfirmationCount(uint256:count) -> void:value 


  3. Antarmuka Transaksi
    1. verifikasi konfirmasi transaksi di alamat peserta
       static getConfirmationByAddress(uint256:indexNumber, address:addressMember) -> bool:value 

    2. mendapatkan informasi dari suatu transaksi
       static getTransactionInfo(uint256:indexNumber) -> [address:destination, uint256:value, bytes:data, bool:executed] 
    3. mendapatkan jumlah total transaksi dalam dompet ini
       static getTransactionCount() -> uint256:value 
    4. menerima status konfirmasi transaksi
       static isConfirmed(uint256:transactionId) -> bool:value 
    5. menerima jumlah konfirmasi
       static getConfirmationCount(uint256:transactionId) -> uint256:count 
    6. mendapatkan jumlah transaksi berdasarkan jenis
       static getTransactionCount(bool:pending, bool:executed) -> uint256:count 
    7. mendapatkan daftar peserta yang mengkonfirmasi transaksi
       static getConfirmations(uint256:transactionId) -> address[]:confirmations 
    8. mendapatkan daftar id transaksi berdasarkan jenis dalam periode waktu tertentu
       static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds 
    9. acara konfirmasi transaksi pihak
       event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 
    10. konfirmasi penarikan peserta sebelum transaksi
       event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 
    11. transaksi antrian menambah acara
       event Submission() -> [uint256:transactionId] 
    12. acara pelaksanaan transaksi
       event Execution() -> [uint256:transactionId] 
    13. peristiwa kesalahan transaksi
       event ExecutionFailure -> [uint256:transactionId] 
    14. acara pengisian dompet
       event Deposit -> [address:sender, uint256:amount] 
    15. anggota menambahkan transaksi
       execute submitTransaction(address:destination, uint256:value, bytes:data) -> uint256:transactionId 
    16. konfirmasi transaksi oleh peserta
       execute confirmTransaction(uint256:transactionId) -> void:value 
    17. penarikan konfirmasi oleh peserta
       execute revokeConfirmation(uint256:transactionId) -> void:value 
    18. transaksi manual
       execute executeTransaction(uint256:transactionId) -> void:value 



3 Cara untuk membangun hierarki dompet


Ada dua cara utama untuk membangun sistem kepercayaan. Vertikal dan horizontal. Cara horizontal bangunan menyiratkan pembuatan daftar dompet anak oleh satu orang tua utama. Cara vertikal bangunan menyiratkan rantai yang terdiri dari dompet anak dengan referensi ke orang tua. Dalam hal ini, dompet orang tua mungkin anak dari dompet orang tua lain.
Seperti yang kita lihat jalur konstruksi horizontal mungkin merupakan subspesies dari jalur konstruksi vertikal. Karena itu, lebih jauh kita membiarkan pendekatan ini tanpa pengawasan.

4 antarmuka hierarki dompet multi-hari


Untuk membangun sistem kepercayaan, perlu untuk memperluas antarmuka sederhana dari dompet multi-berlangganan yang dijelaskan di atas, menambahkan mekanisme untuk mengatur hierarki dan eksekusi otomatis konfirmasi, serta kemungkinan eksekusi yang ditangguhkan.
  1. Konstruktor menerima alamat dompet induk, alamat anggota pendiri, jumlah konfirmasi minimum yang diperlukan untuk transaksi, waktu standar untuk konfirmasi otomatis dalam hitungan detik
     constructor(address:parent, address[]:members, uint256:requiredConfirmationCount, uint256:standardTimeAutoConfirmation) 

  2. Antarmuka Anggota
    1. mendapatkan daftar peserta
       static getMembers() -> address[]:address 

    2. berfungsi untuk melihat alamat peserta
       static getMember(uint256:indexNumber) -> address:address 

    3. verifikasi alamat untuk keanggotaan
       static isMember(address:address) -> bool:value 

    4. mendapatkan jumlah maksimum peserta dompet
       static getMaxMemberCount() -> uint256:value 

    5. Konfirmasi Konsensus Minimum
       static getRequiredConfirmationCount() -> uint256:value 

    6. acara penambahan anggota baru
       event memberAddition() -> address:member 

    7. acara penghapusan anggota
       event memberRemoval() -> address:member 

    8. mengubah acara diperlukan jumlah konfirmasi untuk dieksekusi
       event requiredConfirmationCountChange() -> uint256:count 

    9. tambahkan anggota
       execute addMember(address:member) -> void:value 

    10. penghapusan anggota
       execute removeMember(address:member) -> void:value 

    11. penggantian anggota
       execute replaceMember(address:currentMember, address:newMember) -> void:value 

    12. perubahan dalam jumlah konfirmasi wajib untuk eksekusi
       execute changeRequiredConfirmationCount(uint256:count) -> void:value 


  3. Antarmuka Hierarki
    1. mendapatkan daftar dompet anak
       static getChildren() -> address[]:wallets 

    2. periksa apakah alamat dompet adalah anak dari yang sekarang
       static isChild() -> bool:value 

    3. Memeriksa apakah alamat dompet parental ke yang saat ini dilakukan melalui isChild dengan membandingkannya.
    4. acara pemasangan dompet afiliasi
       event childAttachment() -> [address:address,uint256:timeStamp] 

    5. acara penghapusan dompet anak
       event childRemoval() -> [address:address,uint256:timeStamp] 

    6. membubuhkan dompet anak
       execute attachChild(addres:child) -> void:value 

    7. hapus dompet anak
       execute removeChild(address:address) -> void:value 

    8. ubah satu dompet anak ke yang lain
       execute replaceChild(address:newAddress) -> void:value 


  4. Antarmuka Transaksi
    1. periksa status transaksi
       static getTransactionStatus(uint256:transactionId) -> enum:{submitted,completed,frozen,disputed,reverted} 

    2. memeriksa status transaksi untuk kepatuhan
       static isTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> bool:value 

    3. verifikasi konfirmasi transaksi di alamat peserta
       static getConfirmationByAddress(uint256:transactionId, address:addressMember) -> bool:value 

    4. mendapatkan informasi dari suatu transaksi
       static getTransactionInfo(uint256:transactionId) -> [address:destination, uint256:value, bytes:data, bool:executed] 

    5. mendapatkan jumlah total transaksi di dompet
       static getTransactionCount() -> uint256:value 

    6. menerima status konfirmasi transaksi
       static isConfirmed(uint256:transactionId) -> bool:value 

    7. menerima jumlah konfirmasi
       static getConfirmationCount(uint256:transactionId) -> uint256:count 

    8. mendapatkan jumlah transaksi berdasarkan jenis
       static getTransactionCount(bool:pending, bool:executed) -> uint256:count 

    9. mendapatkan daftar peserta yang mengkonfirmasi transaksi
       static getConfirmations(uint256:transactionId) -> address[]:confirmations 

    10. mendapatkan waktu untuk konfirmasi otomatis
       static getTimeAutoConfirmation(uint256:transactionId) -> uint256:timestamp 

    11. mendapatkan daftar id transaksi berdasarkan jenis dalam periode waktu tertentu
       static getTransactionIds(uint256:from, uint256:to, bool:pending, bool:executed) -> uint256[]:transactionIds 

    12. acara konfirmasi transaksi pihak
       event Confirmation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 

    13. acara konfirmasi transaksi otomatis
       event AutoConfirmation() -> [uint256:transactionId, uint256:timeStamp] 

    14. konfirmasi penarikan peserta sebelum transaksi
       event Revocation() -> [address:sender, uint256:transactionId, uint256:timeStamp] 

    15. transaksi antrian menambah acara
       event Submission() -> [uint256:transactionId] 

    16. acara pelaksanaan transaksi
       event Execution() -> [uint256:transactionId] 

    17. peristiwa kesalahan transaksi
       event ExecutionFailure -> [uint256:transactionId] 

    18. perubahan status transaksi menjadi peristiwa beku
       event TransactionFrozen -> [uint256:transactionId] 

    19. status transaksi berubah menjadi peristiwa kontroversial
       event TransactionDisputed -> [uint256:transactionId] 

    20. perubahan status transaksi ke acara yang dikembalikan
       event TransactionReverted -> [uint256:transactionId] 

    21. acara pengisian dompet
       event Deposit -> [address:sender, uint256:amount] 

    22. tambahkan transaksi untuk dieksekusi
       execute submitTransaction(address:destination, uint256:value, uint256:TimeAutoConfirmation, bytes:data) -> uint256:transactionId 

    23. konfirmasi transaksi
       execute confirmTransaction(uint256:transactionId) -> void:value 

    24. konfirmasi pencabutan
       execute revokeConfirmation(uint256:transactionId) -> void:value 

    25. ubah status transaksi menjadi beku
       execute setTransactionStatus(uint256:transactionId, uint256:enumStatusNumber) -> void:value 

    26. transaksi manual
       execute executeTransaction(uint256:transactionId) -> void:value 


  5. Manajemen Peringkat
    1. memperoleh peringkat di
       static getRatingByAddress(address:agent) -> [uint256:negativeRating, uint256:positiveRating, uint256:countRatingRecords] 

    2. mendapatkan riwayat peringkat berdasarkan alamat dan nomor seri
       static getRatingRecordForAddress(address:agent, uint256:indexNumber) -> void:value 

    3. acara menambahkan catatan ke peringkat di
       event RatingRecordAdded -> [address:author, address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment, uint256:indexNumber] 

    4. tambahkan catatan ke peringkat untuk alamat
       execute addRatingRecord(address:agent, bytes32:smartContractAddress, bool:positiveOrNegative, uin256:ratingNumber, bytes:comment) -> void:value 


  6. Integrasi dengan protokol ESCB9
    1. memeriksa di alamat apakah kontrak pintar yang melekat pada dompet ini adalah kontrak pintar dengan implementasi ESCB9
        static isAttachedESCB9SmartContract(address:smartContract) -> bool:result 

    2. memeriksa status setoran untuk kontrak pintar dengan ESCB9 yang terlampir pada dompet ini
        static getDepositStatusForESCB9SmartContract(address:smartContract) -> enum:{awaiting,founded,returned} 

    3. acara melampirkan kontrak pintar dengan implementasi dompet ESCB9
       event AttachingESCB9SmartContract -> [address:smartContract] 

    4. acara deposit untuk kontrak pintar dengan implementasi terlampir dompet ESCB9
       event ConfirmationForDepositESCB9SmartContract -> [address:smartContract, uint256:sum, bytes:notice] 

    5. melampirkan kontrak pintar dengan implementasi ESCB9 ke dompet
       execute attachESCB9SmartContract(address:smartContract) -> void:value 

    6. konfirmasi deposit untuk kontrak pintar dengan implementasi ESCB9. Jika setoran ada di sistem eksternal, maka pemberitahuan itu akan memiliki label. Jika setoran dalam ETH, maka jumlah setoran dikirim ketika metode dijalankan.
       execute fundDepositForESCB9SmartContract(address:smartContract, uint256:sum, bytes:notice) -> void:value 




5 Aliran Interaksi


Setiap kontrak pintar dapat diintegrasikan ke dalam hierarki dompet multi-tanda tangan. Integrasi semacam itu akan memiliki aliran interaksi. Secara umum, kami membedakan beberapa jenis aliran:
  • Standar Dalam formulir ini, transaksi terjadi secara otomatis. Tanpa partisipasi anggota resmi hierarki dompet
  • Terlindungi . Dalam formulir ini, waktu transaksi dapat ditingkatkan dari standar untuk konfirmasi waktu secara otomatis hingga yang diperlukan. Dalam hal ini, partisipasi anggota resmi hierarki dompet diperlukan.
  • Kontroversial . Dalam formulir ini, peserta transaksi dapat membekukan transaksi. Dalam hal ini, partisipasi anggota resmi hierarki dompet diperlukan untuk membangun konsensus.

Setiap dompet dalam sistem kepercayaan memiliki sejumlah peserta yang berkuasa penuh, yang mengeluarkan putusan. Untuk alasan sederhana, kami akan menggabungkan semua peserta yang berwenang dalam dompet ke dalam satu konsep - wasit .

5.1 Alur interaksi standar


Untuk kesederhanaan presentasi, kami membawa konsep barang dan jasa ke konsep objek transfer (objek), dan konsep uang fiat, cryptocurrency dengan konsep sarana transfer (berarti).
Counterparty, pemilik objek membuat kesepakatan dengan counterparty, pemilik dana, untuk tujuan pertukaran. Dalam hal ini, pemilik objek membuat kontrak escrow pintar dengan mengirimkan transaksi terstandarisasi ke salah satu dompet resmi dalam hierarki dompet multi-tanda tangan. Dalam hal ini, transaksi didaftarkan oleh pihak ketiga sebagai sistem kepercayaan. Untuk setiap transaksi, waktu standar untuk pelaksanaannya ditentukan. Rekanan, pemilik dana melakukan setoran pada transaksi dengan mentransfer dana ke sistem kepercayaan. Setelah itu, pemilik objek mentransfer objek ke pemilik dana. Pemilik dana memeriksa kualitas objek. Jika sebelum akhir waktu transaksi, ia tidak mengkonfirmasi kualitas, maka dana ditransfer ke pemilik objek dalam transaksi. Kedua rekanan saling memberikan peringkat kenyamanan. Dengan demikian, pemilik dana dapat mengubah aliran interaksi sebelum akhir transaksi. Setelah transfer dana kepada pemilik objek, pemilik dana dapat mengajukan permohonan ke dompet yang lebih tinggi di tingkat hierarki untuk menyelesaikan perselisihan dalam waktu yang ditentukan oleh peraturan. Setelah waktu ini, peringkat untuk transaksi diterapkan ke kedua belah pihak dan transaksi menjadi tidak dapat dibatalkan.

5.2 Alur Interaksi yang Aman


Jika, untuk beberapa alasan di luar kendali rekanan, batas waktu transaksi harus diperpanjang, maka, dengan persetujuan para pihak, dompet hierarki multi-tanda tangan (arbiter) dapat mengubah waktu yang diberikan untuk transaksi. Setelah mengubah waktu, aliran interaksi yang dialokasikan untuk transaksi kembali ke tingkat logika aliran standar.

5.3 Aliran interaksi yang kontroversial


Jika kualitas objek selama transaksi tidak sesuai dengan rekanan, pemilik dana yang ia kontribusikan ke sistem kepercayaan hierarki dompet multi-tanda tangan, transaksi dapat dibekukan. Dalam hal ini, deposit tidak ditransfer ke rekanan, pemilik objek sampai putusan transaksi dikeluarkan. Pemegang dana harus memberikan bukti substansial kepada arbiter transaksi. Setelah itu, arbiter mengeluarkan putusan yang mendukung salah satu rekanan. Jika ada pihak yang melakukan transaksi tidak puas dengan putusan, itu berubah menjadi dompet yang lebih tinggi dalam urutan hierarki dompet multi-tanda tangan. Setelah melewati semua instance hierarki, salah satu pihak dapat meminta pemungutan suara publik. Ukuran luar biasa ini hanya dapat diberikan oleh dompet absolut.

6 Protokol ESCB9


Contoh protokol ESCB9 dalam Solidity sebagai kontrak pintar abstrak (protokol sedang dikembangkan dan dapat berubah)
 contract ESCB9 { /** * Modificator for arbitrage */ modifier onlyArbitrage() { require(msg.sender == arbitrage()); _; } /** * Modificator for checking deposit status */ modifier isDeposited { uint i; bytes memory _funcName = bytes4(keccak256("getDepositStatusForESCB9SmartContract(address)")); bytes memory _concat = new bytes(_funcName.length + 32); for(i=0; i < address(this).length; i++) { _concat[i] = address(this)[i]; } require(arbitrage().call.value(0)(_concat) == 1); // β€œfounded” for enum _; } event confirmed(uint256 unixtimestamp, bytes32 notice); event frozen(uint256 unixtimestamp, bytes32 notice); event disputed(uint256 unixtimestamp, bytes32 notice); event canceled(uint256 unixtimestamp, bytes32 notice); /** * @notice Function to approve escrow deal and confirm success * @return Success of operation **/ function confirm(notice) public onlyArbitrage returns(bool); /** * @notice Function to freeze escrow deal * @return Success of operation **/ function freeze(notice) public onlyArbitrage returns(bool); /** * @notice Function to dispute escrow deal * @return Success of operation **/ function dispute(notice) public onlyArbitrage returns(bool); /** * @notice Function to cancel escrow deal and confirm fail * @return Success of operation **/ function cancel(notice) public onlyArbitrage returns(bool); /** * @notice Function to get seller's address * @return Seller's address **/ function seller() public returns(address); /** * @notice Function to get custom type for ESCB9 smart contract * @return Type **/ function type() public returns(bytes); /** * @notice Function to get buyer's address * @return Buyer's address **/ function buyer() public returns(address); /** * @notice Function to get sum for deal * @return Sum of deal in wei **/ function depositedSum() public returns(uint256); /** * @notice Function to get arbitrage's address * @return Arbitrage's address **/ function arbitrage() public returns(address); } 


7 Integrasi sistem kepercayaan dan kontrak pintar yang mengimplementasikan protokol ESCB9


Untuk menggunakan sistem kepercayaan hierarki dompet multi-tanda tangan di proyek Anda sendiri, Anda perlu membuat kontrak pintar yang menerapkan standar ESCB9 dan melampirkan kontrak pintar seperti itu ke salah satu arbiter yang tidak memiliki dompet tambahan. Dompet seperti itu dalam hierarki multi-langganan disebut "input node". Semua dompet multi-signature hulu disebut sebagai "node arbitrase".

8 Contoh kontrak yang menerapkan ESCB9


8.1 Kontrak pintar untuk pasar sewa pribadi, mengikuti contoh AirBnb


 // Don't use this code, it can be not working or contain the vulnerability, for demonstration purpose only pragma solidity ^0.4.21; /// @title rentMyApartmentESCB9 - Allows rent object on market with escrow service. The safe way to do deal for counterparties. /// @author Konstantin Viktorov - <ceo@escrowblock.net> contract rentMyApartmentESCB9 is ESCB9 { // 2018-05-10 18:25 in unix timestamp uint256 constant public checkInTime = 1525965900; // 2018-05-20 18:25 in unix timestamp uint256 constant public checkOutTime = 1526829900; // Coordinates in bytes format. For example 56.865129,35.881540 bytes constant public coordinates = "0x35362e3836353132392c33352e383831353430"; // Google maps link, as example, but better add Url to landing page bytes constant public externalUrl = "0x68747470733a2f2f676f6f2e676c2f6d6170732f6e783563396b6737384170"; /** * Encrypted information, see https://github.com/ethereumjs/ethereumjs-wallet and * https://github.com/pubkey/eth-crypto/blob/master/tutorials/encrypted-message.md * For example you can leave here information about pin-code for smart lock **/ bytes constant private privateInformation = '0x0dfef623523483245687234'; modifier only_before_check_in { require(getNow() < checkInTime); _; } modifier only_after_check_out { require(getNow() > checkOutTime); _; } modifier only_during_renting { require(getNow() > checkInTime && getNow() < checkOutTime); _; } modifier only_not_in_during_renting { require(getNow() < checkInTime && getNow() > checkOutTime); _; } /** * @notice ESCB9 interface * @notice Function to get address of apartment owner * @return Seller's address **/ function seller() public returns(address) { return "0x27a36731337cdee360d99b980b73e24f6e188618"; } /** * @notice ESCB9 interface * @notice Function to get custom type for ESCB9 smart contract * @return Type **/ function type() public returns(bytes) { return "rent"; } /** * @notice ESCB9 interface * @notice Function to get address of renter * @return Buyer's address **/ function buyer() public returns(address) { return "0xb582baaF7e749d6aA98A22355A9d08B4c4d013C8"; } /** * @notice ESCB9 interface * @notice Function to get sum for deal * @return Sum of deal in wei **/ function depositedSum() public returns(uint256) { return 1000000000000000000; //1 ETH in weis } /** * @notice ESCB9 interface * @notice Function to get arbitrage's address * @return Arbitrage's address **/ function arbitrage() public returns(address) { return "0xe91065d8bb2392121a8fbe6a81e79782fbc89dd4"; } /** * @notice ESCB9 interface * @notice Function to approve escrow deal and confirm success * @param Some comment * @return Success of operation **/ function confirm(notice) public onlyArbitrage only_after_check_out returns(bool) { confirmed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to freeze escrow deal * @param Some comment * @return Success of operation **/ function freeze(notice) public onlyArbitrage only_during_renting returns(bool) { frozen(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to dispute escrow deal * @return Success of operation **/ function dispute() public onlyArbitrage only_after_check_out returns(bool) { disputed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to cancel escrow deal and confirm fail * @return Success of operation **/ function cancel() public onlyArbitrage only_not_in_during_renting returns(bool) { canceled(getNow(), notice); } /** * @notice Get current unix time stamp **/ function getNow() constant public returns (uint) { return now; } /** * @notice Get private information when renter will pay deposit **/ function getPrivateInformation() constant isDeposited public returns (bytes) { return privateInformation; } } 


8.2 Kontrak pintar untuk menukar cryptocurrency dengan uang fiat dan kembali dalam mode desentralisasi


Contoh dari kontrak Smart yang dijelaskan di bawah ini memungkinkan Anda untuk menukar BTC dengan uang fiat secara langsung, tanpa partisipasi dari penukar dan layanan pihak ketiga. Penjual BTC mentransfer jumlah dalam kontrak pintar ke deposit dalam blockchain BTC. Pembeli, setelah mengkonfirmasi setoran oleh arbiter, secara otomatis mentransfer jumlah yang ditentukan dalam kontrak ke rekening atau nomor kartu plastik yang termasuk dalam kontrak. Arbiter dapat melakukan intervensi dalam proses transaksi setelah banding dari salah satu peserta. Awalnya, deposit akan dibekukan dan jika para pihak tidak setuju dengan konsensus, maka kontrak tersebut akan menjadi diperdebatkan dengan resolusi lebih lanjut tentang aliran interaksi yang disengketakan.
 // Don't use this code, it can be not working or contain the vulnerability, for demonstration purpose only pragma solidity ^0.4.21; /// @title p2pExchangeESCB9 - Allows exchanging any cryptocurrencies on fiat money and back, directly between users. The safe way to do deal for counterparties. /// @desc This example shows as exchange fiat money on BTC (forward flow) /// @author Konstantin Viktorov - <ceo@escrowblock.net> contract p2pExchangeESCB9 is ESCB9 { // in minimal decimals, for example, 500.000 rubles is equal 50000000 kopeks uint256 constant public inputAmount = 50000000; // RUR in bytes bytes constant public inputCurrency = "0x525552"; // in minimal decimals, for example, 1 BTC is equal 100000000 satoshi uint256 constant public outputAmount = "100000000"; // BTC in bytes bytes constant public outputCurrency = "0x425443"; // Deposit can be place only before this time const bytes public closeTime = "1526829900"; // use "forward" way, when output currency will be deposited or "backward" if input currency will be deposited uint256 constant public depositWay = "forward"; /** * Encrypted information, see https://github.com/ethereumjs/ethereumjs-wallet and * https://github.com/pubkey/eth-crypto/blob/master/tutorials/encrypted-message.md **/ /** * Encrypted information for placing deposit, for example BTC address **/ bytes private externalDepositAddress = "0x3139333978476346484d6f464b465845564754415761706b3537694e6a3579556b52"; /** * Encrypted information for the amount of deposit, for example for BTC 8 decimals can be added 2-3 chars from 0-9 as pin-code for deal. See more in EscrowBlock WhitePaper * If output amount is equal 100000000, then deposited amount can be 100000123 **/ bytes private externalDepositAmount = "0x5f5e17b"; /** * Encrypted information for sending amount to seller, for example credit card number or bank account, for example 4242424242424242 **/ bytes private externalIncomingAddress = "0xf12765df4c9b2"; modifier only_before_close_time { require(getNow() < closeTime); _; } modifier only_after_close_time { require(getNow() > closeTime); _; } /** * @notice ESCB9 interface * @notice Function to get address of apartment owner * @return Seller's address **/ function seller() public returns(address) { return "0x27a36731337cdee360d99b980b73e24f6e188618"; } /** * @notice ESCB9 interface * @notice Function to get custom type for ESCB9 smart contract * @return Type **/ function type() public returns(bytes) { return "exchange"; } /** * @notice ESCB9 interface * @notice Function to get address of renter * @return Buyer's address **/ function buyer() public returns(address) { return "0xb582baaF7e749d6aA98A22355A9d08B4c4d013C8"; } /** * @notice ESCB9 interface * @notice Function to get sum for deal * @return Sum of deal in minimal decimals **/ function depositedSum() public returns(uint256) { rerurn outputAmount; } /** * @notice ESCB9 interface * @notice Function to get arbitrage's address * @return Arbitrage's address **/ function arbitrage() public returns(address) { return "0xe91065d8bb2392121a8fbe6a81e79782fbc89dd4"; } /** * @notice ESCB9 interface * @notice Function to approve escrow deal and confirm success * @param Some comment * @return Success of operation **/ function confirm(notice) public onlyArbitrage only_after_close_time returns(bool) { confirmed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to freeze escrow deal * @param Some comment * @return Success of operation **/ function freeze(notice) public onlyArbitrage only_after_close_time returns(bool) { frozen(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to dispute escrow deal * @return Success of operation **/ function dispute() public onlyArbitrage only_after_close_time returns(bool) { disputed(getNow(), notice); } /** * @notice ESCB9 interface * @notice Function to cancel escrow deal and confirm fail * @return Success of operation **/ function cancel() public onlyArbitrage only_before_close_time returns(bool) { canceled(getNow(), notice); } /** * @notice Get current unix time stamp **/ function getNow() constant public returns (uint) { return now; } /** * @notice Get private information for buyer when seller sent deposit **/ function getExternalIncomingAddress() constant isDeposited public returns (bytes) { return externalIncomingAddress; } /** * @notice Get private information about amount for seller for sending deposit **/ function getExternalDepositAmount() constant public returns (bytes) { return externalDepositAmount; } /** * @notice Get private information about address for seller for sending deposit **/ function getExternalDepositAddress() constant public returns (bytes) { return externalDepositAddress; } } 


9 node arbitrase


Untuk mempertahankan kerja sistem kepercayaan, hierarki dompet multi-tanda tangan diperkenalkan. Node arbitrase, yaitu dompet dalam hierarki yang memiliki dompet tambahan di bawahnya, bertindak sebagai penjamin penyelesaian sengketa. Berkuasa penuh untuk node tersebut hanya dapat ditunjuk oleh hierarki superior. Setiap peserta yang berwenang menerima hadiah dengan membagikan dividen dan bonus untuk bekerja dengan arus interaksi yang disengketakan. Ukuran bonus ditentukan oleh konsensus.
Untuk mendapatkan status peserta yang berwenang dalam simpul arbitrase, perlu memiliki jumlah token yang ditentukan secara konsensus di alamat peserta yang berwenang.Dengan demikian, penerimaan dividen yang stabil oleh semua peserta dari node arbitrase dijamin. Semakin tinggi hierarki dompet multi-tanda tangan, token yang lebih diperlukan harus ada di alamat peserta yang berwenang.

10 Kamus


Ethereum adalah teknologi sumber terbuka yang memungkinkan Anda untuk membuat rantai transaksi yang terdesentralisasi dan tidak berubah. Setiap transaksi dapat dilakukan dengan kondisi tertentu yang dicatat dalam kontrak pintar.
Kontrak pintar - ditulis dalam Solidity, logika yang dieksekusi di mesin virtual Ethereum, yang memungkinkan Anda untuk memperluas logika transaksi.
Dompet multi-tanda tangan (arbiter) adalah kontrak pintar khusus yang dikendalikan oleh sekelompok peserta yang berwenang yang dapat mengkonfirmasi atau membatalkan transaksi. Dengan menggunakan mekanisme dompet multi-berlangganan, Anda dapat membuat rantai gateway untuk transaksi dan memantau eksekusi atau pengembalian dana tepat waktu.
Pemilik objek - adalah pemilik, pemasok, pengembang produk perangkat lunak, dll. Yaitu, orang yang menjual objek dan akhirnya menerima deposit sebagai hadiah.
Pemilik dana - adalah penyewa, pembeli, pelanggan produk perangkat lunak, dll. Yaitu, orang yang menaruh deposit pada objek untuk membeli produk atau layanan.

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


All Articles