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:
- Siapkan file yang ingin Anda patenkan. (Saya melakukan PDF, tetapi Anda dapat menggunakan wadah lain).
- 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:
- Persiapan kontrak pintar dan dompet eter.
- 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; contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(isOwner()); _; } function isOwner() public view returns (bool) { return msg.sender == _owner; } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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:
- alamat eter untuk berinteraksi dengan blockchain
- 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 PribadiJadi, 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. , . . ```