Cara menerapkan secara mandiri (Bukti Keberadaan) dalam 2 langkah

Halo semuanya! Nama saya Ararat dan saya bekerja untuk QuantNet, yang mengadakan kontes strategi algoritmik. Baru-baru ini, tugas penting telah muncul di hadapan saya - untuk memberikan jaminan untuk diganggu gugat tanggal pengguna (ini sangat penting, karena untuk memeriksa dengan benar efektivitas strategi, perlu menggunakan data dari pasar keuangan global secara real time).

Di situlah saya menemukan konsep PoE (Proof of Existence). Sudah cukup banyak yang ditulis tentang hal ini di Internet, tetapi spesifikasinya membuat saya sedikit patah hati. Oleh karena itu, saya memutuskan untuk menulis artikel ini dan membagikan pengalaman saya dalam arsitektur dan implementasi PoE. Saya pikir ini akan sangat relevan untuk fintech guys.

Saya membagi artikel saya menjadi 3 blok utama:

  • Apa itu PoE dan kapan mungkin dibutuhkan
  • Algoritma implementasi
  • Solusi untuk kasus spesifik saya

Jadi apa Bukti Keberadaan?


Bukti Keberadaan (secara harfiah, bukti keberadaan) membantu membuktikan bahwa dokumen, file, atau data dibuat pada tanggal dan waktu tertentu. Aplikasi terbesar adalah pendaftaran paten. Tapi dari apa yang saya lihat, paling sering diterapkan di daerah di persimpangan keuangan dan TI.

Contoh dari bidang perdagangan algoritmik saya: Anda memiliki algoritme yang memberikan sekitar 70% perkiraan yang tepat untuk saham selama 2 minggu ke depan. Anda memutuskan untuk menjual ramalan Anda kepada pemain pasar lainnya. Intinya kecil - untuk meyakinkan pembeli bahwa perkiraan Anda benar dan dibuat sebelum hasil penawaran, mis. menjamin implementasi mereka pada waktu tertentu.

Bagaimana ini bisa dijamin? Benar, terapkan PoE.

Algoritma Implementasi PoE


Pertama yang Anda butuhkan:

  1. Siapkan file yang ingin Anda patenkan. (Saya melakukan PDF, tetapi Anda dapat menggunakan wadah lain).
  2. Dapatkan hash dari file yang diberikan (saya menggunakan format sha256).

Untuk jaga-jaga, hash adalah "sidik jari" individu dari suatu file, yang menjamin (hampir lengkap) tidak adanya kebetulan dengan hash file lain. Ketika Anda menerima hash dari file, Anda hanya perlu menghasilkan transaksi di jaringan blockchain, yang menunjukkan hash dokumen di badan transaksi.

Itu saja. Dengan prolog selesai. Sekarang kita lolos ke yang paling menarik.

(Untuk kejelasan yang lebih besar, saya membuat kode khusus (hanya untuk demonstrasi). Anda dapat melihat contoh demo dari layanan di sini .)

Mari kita lihat lebih dekat bagaimana cara kerja demo.

Saya mengusulkan untuk membagi implementasi menjadi 2 bagian:

  1. Persiapan kontrak pintar dan dompet eter.
  2. Pembuatan transaksi dalam kode Node.js dan kunci pribadi.

Mari kita mulai:

Bagian 1: Mempersiapkan Kontrak dan Dompet Ethereum Smart

PoE sendiri pertama kali dikaitkan dengan blockchain Bitcoin. Tapi saya memilih eter blockchain dan kontrak pintar untuk implementasi. Kontrak pintar memberi kita fleksibilitas, modularitas, dan skalabilitas di masa depan, bertindak sebagai penyimpanan hash di blockchain.

Saya memilih kontrak pintar sederhana yang dapat menerima hash dengan tanggal yang sesuai, format hash => date, itu juga akan menjadi super untuk memiliki metode yang mengembalikan tanggal hash ketika dipanggil. Selain itu, akan menyenangkan untuk berhati-hati karena hanya pemilik kontrak yang dapat menambahkan hash baru.

Kode Kontrak Cerdas:

``` pragma solidity 0.5.9; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title HashStore * @dev The contract store the hashes and returns date by hash * Only the owner can add new hashes */ contract HashStore is Ownable { mapping(bytes32 => uint256) private _hashes; event HashAdded(bytes32 hash); function addHash(bytes32 rootHash) external onlyOwner { require(_hashes[rootHash] == 0, "addHash: this hash was already deployed"); _hashes[rootHash] = block.timestamp; emit HashAdded(rootHash); } function getHashTimestamp(bytes32 rootHash) external view returns (uint256) { return _hashes[rootHash]; } } ``` 

Seperti yang sudah Anda perhatikan, kami menggunakan 2 kontrak terpisah: Dimiliki dan HashStore.
Kontrak HashStore bertanggung jawab untuk menyimpan hash dan mengeluarkan tanggal hash berdasarkan permintaan. Kontrak Milik bertanggung jawab untuk memverifikasi bahwa hash baru telah ditambahkan secara eksklusif oleh pemilik kontrak.

Untuk menambahkan hash, Anda perlu memanggil metode addHash, dengan meneruskan nilai sha256 sebagai argumen ke file kami. Jika hash di dalam kontrak cocok, transaksi akan ditolak. Ini memfilter duplikasi nilai yang tidak diinginkan dengan tanggal yang berbeda. Ini diperiksa di sini:

 require(_hashes[rootHash] == 0, "addHash: this hash was already deployed"); 

Kita bisa mendapatkan tanggal transaksi hash menggunakan metode getHashTimestamp, melewati hash dengan tanggal transaksi yang diinginkan sebagai argumen. Metode getHashTimestamp mengembalikan waktu dalam format UNIX. Anda dapat menerjemahkan ke dalam format yang lebih mudah dibaca.

Jadi, kami sudah tahu kontraknya, sekarang Anda perlu menyebarkannya ke jaringan. Untuk melakukan ini, kita perlu dua hal:

  1. alamat eter untuk berinteraksi dengan blockchain
  2. beberapa eter untuk memanggil metode dan menggunakan kontrak.

Agar tidak membuang eter pada tes, kita dapat menggunakan jaringan uji ropsten. Pelajari lebih lanjut di sini. Alamat ini adalah pemilik kontrak, karena itu adalah penggagas penyebaran dan dapat menambahkan hash baru di masa depan. Setelah itu, Anda perlu menyimpan alamat ini di tempat yang aman, serta kunci pribadi dompet Anda dan alamat kontrak. Kita semua akan membutuhkan ini di masa depan.

Bagian 2: Pembuatan Transaksi di Node.js dan Kunci Pribadi

Jadi, pada titik ini kita sudah memiliki dompet eter, kunci rahasianya, kontrak dalam jaringan pengujian dan hash data. Tetap mengkonfigurasi interaksi dengan blockchain.

Untuk melakukan ini, kita akan menggunakan pustaka web3.js dan membuat token untuk simpul kita. Saya membuat milik saya menggunakan layanan infura.io dan terlihat seperti ini:

 ropsten.infura.io/v3/YOUR_TOKEN_HERE 

Untuk hashing, gunakan paket sha256. Format data dapat berupa apa saja, tetapi dalam contoh ini kita menggunakan data dalam JSON.

Bagaimana saya menyelesaikan kasus saya menggunakan PoE?


Selain kehadiran PoE, penting bagi saya untuk tidak membebani pengguna dengan blockchain dan biaya transaksi, misalnya, memanggil metode addHash (bytes32 rootHash) biaya 0,2 finney (0,0002 ETH atau $ 0,06 pada tingkat Juni 2019).



Sekitar 30 kesimpulan dari posisi strategi keluar per hari, yaitu biayanya $ 2.1. Jika jumlah pengguna meningkat 100 kali, dan tingkat Ether naik, biaya tentu saja akan naik.

Saya memutuskan untuk menyimpan satu hash di blockchain selama sehari. Hash ini akan dihasilkan dari hash output strategi harian dan pengidentifikasi internal mereka.



Kami mendapatkan solusi yang tidak kalah fungsionalnya, namun jauh lebih murah. Kami tidak melihat masalah dengan skalabilitas, namun, Anda selalu dapat membagi output posisi strategi menjadi beberapa blok dan menyimpan beberapa hash ke jaringan blockchain. Dan seorang peserta dapat dengan mudah memverifikasi hash terpisah menggunakan hash tetangga lainnya.

Pada akhirnya


Untuk verifikasi, kami membuat templat khusus, yang tersedia sebagai notebook Jupyter. Kapan saja, pengguna dapat mengunduh templat, meregenerasi semuanya dan memverifikasi bahwa semua posisi benar-benar yang dibuat dan disimpan di masa lalu.

 ```   : 1.    API       1.     2.    API  ,         3.          ,              .          . ``` 

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


All Articles