Proyek ini mengimplementasikan mekanisme transaksi blockchain dalam jaringan Delay-Tolerant Network (DTN) dengan simulasi node miner, operator proxy, home, collector, dan internet. Sistem ini dirancang untuk menangani transaksi, penambangan blok, verifikasi konsensus, dan integrasi ke blockchain utama dalam lingkungan dengan koneksi yang terputus-putus.
Mekanisme ini menggunakan konsep Localchain, di mana ada blockchain-blockchain lokal yang dimiliki oleh Operator Proxy di setiap area. Localchain ini yang akan digunakan dalam proses mining di setiap area sehingga nanti user yang berada di tiap area yang mengalami gangguan bisa bertransaksi bahkan bisa ikut serta dalam proses penambangan sebuah blok, dan nantinya bisa mendapatkan fee reward dari hasil penambangan mereka.
- Pembangkitan Transaksi: Transaksi diamankan dengan tanda tangan digital ECDSA dan hash SHA-256.
- Penambangan Blok: Algoritma Proof-of-Work (PoW) dengan penyesuaian kesulitan (difficulty).
- Konsensus dan Verifikasi: Validasi blok oleh miner dengan threshold tertentu.
- Localchain dan Mainchain: Penyimpanan rantai blok sementara (localchain) dan penambahan ke blockchain utama.
- Reward System: Distribusi reward ke miner berdasarkan kontribusi penambangan.
Simulasi dilakukan pada daerah post-disaster di mana koneksi internet di daerah tersebut down. Namun, user di daerah tersebut ingin melakukan transaksi dan ingin transaksinya tersimpan di Blockchain. Lebih lagi, beberapa client juga ingin ikut melakukan mining untuk mendapatkan fee. Oleh karena itu ada pihak yang hadir sebagai pengelola transaksi, dan daerah tersebut dibagi menjadi 8 area yang masing-masing akan di-handle oleh pihak tersebut untuk diteruskan nanti ke daerah yang jaringannya normal sehingga akan ditambahkan ke Blockchain.
Berikut adalah entitas utama dalam simulasi blockchain DTN ini:
- Peran:
- Menambang blok baru dengan menyelesaikan Proof-of-Work (PoW).
- Menerima dan memverifikasi transaksi dari pengguna.
- Berpartisipasi dalam konsensus verifikasi blok.
- Karakteristik:
- Pergerakannya random, namun dibatasi satu area saja.
- Memiliki dompet kripto (
Wallet) dengan pasangan kunci ECDSA. - Bergerak acak dalam area tertentu (model
RandomArea). - Contoh ID:
minerSatu,minerDua, dll.
- Peran:
- Mengumpulkan dan mengelompokkan transaksi dari Miner.
- Mengkoordinasikan proses penambangan blok ke Miner.
- Memilih blok tercepat untuk ditambahkan ke localchain.
- Bertugas memberikan fee kepada miner terpilih
- Karakteristik:
- Pergerakannya hanya satu jalur, dari Home ke satu area yang dihandle saja
- Memiliki buffer transaksi (
transactionBuffer). - Mengelola
localchain(rantai blok sementara). - Contoh ID:
ope1,ope2, dll.
- Peran:
- Menyimpan localchain yang dikirim Operator Proxy.
- Bertindak sebagai node penyimpanan sementara sebelum data dikirim ke Collector.
- Karakteristik:
- Posisi tetap (
StationaryMovement). - Memiliki daftar
storedLocalchains. - Contoh ID:
home1.
- Posisi tetap (
- Peran:
- Memilih localchain terbaik (terpanjang) dari Home.
- Mengintegrasikan localchain ke blockchain utama di Internet.
- Karakteristik:
- Pergerakannya satu jalur, dari Home ke Internet saja.
- Contoh ID:
col1.
- Peran:
- Menyimpan blockchain utama (
mainChain). - Validasi akhir dan penyimpanan blok dari Collector.
- Menyimpan blockchain utama (
- Karakteristik:
- Posisi tetap di lokasi terpisah.
- Contoh ID:
inter1.
- JDK 8+
- Library Bouncy Castle (untuk kriptografi ECDSA)
- IDE (Netbeans, VSCode, dll)
Kami mengembangkan project ini menggunakan Netbeans sebagai IDE kami. Untuk instalasi project menggunakan Netbeans sebagai berikut:
-
Buat project baru, setelah itu pergi ke direktori tempat project berada (masuk folder src):
-
Clone Repository di direktori lewat Git Bash:
git clone https://github.com/denatajp/localchain.git
-
Pindahkan semua file dari folder
localchainke luar folder. Pastikan semua file dan folder ada di direktori.../src/sehingga file ada di direktori seperti di gambar -
Tambahkan library dan .jar yang dibutuhkan:
- Add Library = JUnit 4.12
- Add JAR/Folder = "DTNConsoleConnection.jar" dan "ECLA.jar"
-
Download .jar tambahan (Bouncy Castle) Library ini penting untuk proses kriptografi. Download dari link ini
-
Tambahkan bcprov-jdk18on-xxx.jar ke library menggunakan Add JAR/Folder
-
Edit custom configuration running project:
- Main Class = Class dimana program berjalan, pada project ini menggunakan class main DTNSim dari package core
- Arguments = Parameter tambahan untuk berjalannya program. Karakter "-b" menandakan running program tidak menggunakan GUI, hapus jika ingin menggunakan GUI. Angka "1" menunjukkan indeks run (run berapa kali), lalu blockchainDTN.txt menunjukkan file settings mana yang digunakan untuk menjalankan simulasi
- Working Directory = Direktori dimana file simulasi berjalan. Arahkan ke direktori src tadi.
- Miner membuat transaksi dan mengirim ke Operator Proxy.
- Transaksi dikelompokkan menjadi paket oleh Operator Proxy.
- Penambangan Blok: Operator Proxy membagikan transaksi ke Miner dengan cara mendatangi satu-satu miner. Miner yang didatangi melakukan proses mining sambil dicatat waktunya oleh OperatorProxy
- Blok divalidasi oleh Miner yang ada di area.
- Blok valid ditambahkan ke localchain.
- Localchain disimpan ke Home, lalu dipilih oleh Collector.
- Collector menambahkan localchain ke blockchain utama.
- Miner menerima reward berdasarkan kontribusi penambangan.
Alur Program Mendalam
- Pada 10.000 s pertama, program memanggil class
TransactionEventGeneratorsehingga men-trigger classTransactionCreateEventuntuk membuat pesan baru dengan tujuan pesan ke Operator Proxy. Lalu juga membuat transaksiTransactiondan transaksi tersebut dibungkus ke dalam property pesan sebagai transaction. Proses ini hanya terjadi di node Miner saja. - Selama pembangkitan pesan, node Miner yang baru saja membuat sebuah pesan juga akan bergerak di areanya sambil mencari relay (miner lain) untuk mengirim pesan agar sampai ke tujuan (Operator Proxy).
- Begitu Operator Proxy bertemu miner yang membawa pesan yang berisi transaksi itu, maka akan menyimpan pesan tersebut, lalu mengambil transaction di dalamnya dan dimasukkan ke list
transactionBuffermilik Operator Proxy. Proses ini berlangsung terus-menerus sampai fase pembangkitan pesan selesai (default settings.txt adalah 10.000 s untuk pembangkitan pesan).
- Pada 5000 s berikutnya, saat fase pembangkitan pesan telah berhenti, pasti masih ada transaksi yang belum sampai ke Operator Proxy (asumsi transaksi baru dibuat sesaat sebelum fase pembangkitan pesan berhenti).
- Pada 5000 s ini, simulasi akan berfokus pada proses store-carry-forward agar pesan sampai ke Operator Proxy.
- Proses ini akan berhenti di waktu 15.000 s simulasi.
- Setelah melewati 15.000 s, maka sudah tidak ada pembangkitan pesan lagi, dan asumsi Operator Proxy sudah tidak menerima transaksi lagi. Lalu, 5000 s selanjutnya ini merupakan waktu untuk Operator Proxy mengelompokkan transaksi-transaksi di dalam
transactionBuffermenjadi beberapa kelompok secara acak. - Transaksi-transaksi yang ada di
transactionBufferini akan dipisah-pisah, lalu dikelompokkan menjadi beberapa list transaksi. Kumpulan list transaksi ini akan disimpan ke dalam satu list yaitutrxmilik Operator Proxy. - Proses Grouping ini berjalan selama 5000 s sampai waktu simulasi mencapai 20.000. Saat sudah selesai melakukan grouping, Operator Proxy menandakan dirinya sudah selesai dengan mengeset
hasGrouped = truepada dirinya sendiri untuk mengantisipasi terjadi pengulangan grouping selanjutnya.
- Setelah 20.000 s simulasi, maka dimulai proses mining. Proses ini terjadi jika dan hanya jika node Miner bertemu dengan Operator Proxy saja.
- Saat Operator Proxy menemui sebuah miner, pertama-tama Operator Proxy harus mencatat kedatangan miner tersebut (seperti absensi) menggunakan HashSet bernama
getVisitedMineruntuk menandai bahwa miner tersebut sudah pernah bertemu. - Selanjutnya miner akan melihat-lihat dahulu pada list
trxmilik Operator Proxy. Karena di dalam listtrxterdapat list-list yang berisi kumpulan transaksi, maka miner bisa memilih kira-kira mana list yang memiliki fee terbesar (1% dari total amount pada tiap transaksi). Jika sudah memilih, maka miner tersebut akan siap untuk melakukan pembuatan blok. - Sebelum itu, miner akan mengecek keaslian data transaksi dengan cara mengecek tanda tangan digital pada transaksi yang dipilih menggunakan fungsi kriptografi pada class
SecureTransaction. Jika sudah valid, miner membungkus list transaksi yang dipilih ke dalam sebuahBlockbaru. - Saat
Blockbaru dibuat, miner akan siap untuk mencari nilai nonce pada blok tersebut sesuai dengan target kesulitan pada Blockchain dan Localchain. Operator Proxy akan bertugas untuk mencatat waktu mulai miner melakukan mining dan waktu selesai. - Proses mining berlangsung.
- Setelah selesai, waktu mining dicatat ke dalam blok, dan blok yang telah di-mining akan disimpan di penyimpanan sementara milik Operator Proxy yaitu
minedBlock. Saat miner ini nanti bertemu Operator Proxy kembali, maka tidak akan melakukan mining lagi karena sudah melakukan absen digetVisitedMiner. - Operator Proxy lanjut mendatangi miner lain di areanya. Saat bertemu miner lain, prosesnya sama, namun karena list
trxtidak ada yang berubah, nantinya miner lain pasti juga akan memilih list transaksi yang sama dengan miner pertama. Apakah salah? tidak, karena memang ini konsepnya, yakni Operator Proxy nanti akan membandingkan versi mining antar miner untuk list transaksi yang sama, sehingga versi mining dengan interval waktu mining tercepat akan dipilih. - Saat satu list dari
trxini sudah di-mining oleh semua miner di area tersebut (getVisitedMiner == minersInGroup: asumsi ada 7 miner/area), maka di sini Operator Proxy akan memilih blok dengan interval mining terbaik, lalu memasukkannya keselectedBlock. Tidak lupa Operator Proxy juga akan remove list terpilih ditrxagar tidak di-mining lagi, dan juga meresetminedBlockdangetVisitedMineruntuk lanjut list ditrxselanjutnya. Namun sebelum lanjut ke list selanjutnya, akan menjalankan proses verifikasi dahulu, karena jika Operator Proxy sedang memegang blok terpilih (selectedBlock is not null), maka tidak bisa melakukan proses mining dulu dan harus diverifikasi dulu.
- Proses verifikasi dilakukan saat Operator Proxy sedang memegang blok terpilih (
selectedBlock is not null), dan kembali akan mendatangi miner-miner lain dengan skema absensigetVisitedMinerseperti pada proses mining. - Saat bertemu miner, maka Operator Proxy memberikan blok terpilih untuk dilakukan verifikasi hash pada blok. Apakah hash dari blok tersebut sudah memenuhi kriteria/target kesulitan pada Blockchain atau tidak.
- Jika memenuhi target, maka Operator Proxy melakukan increment nilai
v, yaitu jumlah miner yang menyetujui blok terpilih. - Proses verifikasi berlanjut ke miner-miner lain, sampai jumlah
vsudah mencapaithreshold, maka blok dianggap valid dimasukkan ke Localchain milik Operator Proxy. - Setelah itu, Operator Proxy kembali mereset nilai
v, absensigetVisitedMiner, dan mengubah statusselectedBlockmenjadinulluntuk melakukan proses mining kembali pada listtrxselanjutnya. - Operator Proxy akan melakukan proses mining-verification terus-menerus secara berurutan sampai list
trxdi Operator Proxy kosong (.getTrx().isEmpty()) dan mengeset status Operator Proxy menjadi siap untuk melakukan storing Localchain (readyToStore = true).
- Proses ini dilakukan saat Operator Proxy bertemu dengan Home, dengan syarat bahwa Operator Proxy harus sudah menjalankan tugas di areanya (mining-verification;
readyToStore = true). - Home akan menggunakan skema absensi
getVisitedOperatorProxyuntuk mencatat kedatangan Operator Proxy. Jadi tiap Operator Proxy hanya bisa menyetor Localchain sekali saja. - Setiap Operator Proxy yang datang ke Home akan menyetorkan Localchainnya ke
storedLocalchainsmilik Home. - Proses storing terus berjalan sampai semua Operator Proxy mengirim ke Home.
- Setelah disetor, kemudian proses dilanjutkan dengan memilih Localchain terbaik. Proses selection ini dilakukan antara node Home dengan node Collector.
- Saat Collector mengunjungi Home, akan memeriksa
storedLocalchainsdi Home untuk memilih Localchain terbaik dengan rantai (blok) terpanjang. - Collector juga akan mengkalkulasi hash dari tiap Localchain. Hash yang dimaksud adalah nilai dari penggabungan hash pada blok-blok di dalam localchain tersebut. Jadi sekarang tiap localchain punya hashnya sendiri-sendiri.
- Selanjutnya Collector memeriksa dalam list
storedLocalchainsmenghitung nilai hash dari hexadecimal menjadi desimal. Localchain dengan hash terkecil akan dimasukkan ke variabel sementaraselected. - Collector kemudian mengambil
selectedtadi dan memasukkan ke penyimpanan miliknya yaituselectedLocalchain. Lalu menghapus localchain terpilih dari liststoredLocalchainsmilik Home tadi. - Proses selection selesai, Collector sudah memegang satu localchain (
selectedLocalchain is not null) dan siap pergi ke node Internet untuk menambahkan localchain terpilih ke Blockchain, dan jika Collector datang ke Home lagi sebelum berkunjung ke Internet, maka tidak akan melakukan apa-apa karena dia sedang memegang Localchain.
- Proses appending dilakukan oleh node Collector dan node Internet, dengan syarat Collector harus dan hanya memegang satu localchain terpilih dari Home.
- Internet akan memeriksa
selectedLocalchainyang dibawa Collector dengan menghitung hash nya terlebih dahulu lalu akan dibandingkan dengan hash yang sudah ada. Jika valid, maka lanjut proses menambahkan localchain ke Blockchain. - Proses penambahan ke Blockchain ini sedikit kompleks, karena harus kembali memecah blok-blok di dalam localchain lalu harus mengubah
previousHashdari blok pertama pada Localchain (yang tadinya bernilainull) menjadi hash dari blok terakhir/terbaru pada Blockchain. PerubahanpreviousHashini akan mempengaruhi hash dari semua blok di Localchain tersebut karena perubahan kecil saja akan mengubah keseluruhan hash dan hash yang baru belum tentu memenuhi target kesulitan pada Blockchain. - Namun pada program ini, tiap blok sudah memiliki atribut
Kdi mana menunjukkan asal blok tersebut dibuat dari mana. Jika bernilai 1 (K = 1), maka tandanya Block tersebut berasal dari Localchain dan sudah dipastikan valid. Sehingga walaupun hash baru dari blok yang sudah diubahpreviousHashnya tadi tidak memenuhidifficulty, maka tetap akan dianggap valid karena blok berasal dari Localchain. - Selanjutnya semua blok pada
selectedLocalchainakan ditambahkan ke Blockchain menggunakan mekanisme di atas. - Saat semua hash dari blok sudah valid, maka proses penambahan ke Blockchain sudah berhasil. Collector akan mengeset
selectedLocalchainmenjadinulldan siap untuk mengambil localchain lainnya yang tersisa di Home. - Proses selection-appending ini akan berlangsung terus-menerus secara berurutan sampai jumlah localchain yang ada habis
localChainCount is empty, dan Collector akan menandai dirinya sendiri sudah selesai (setappendingDone = true). - Semua transaksi sudah ditambahkan ke Blockchain, selanjutnya adalah memberikan reward ke masing-masing miner yang sudah berkontribusi.
- Fase ini dilakukan oleh beberapa node. Pertama dari Collector yang
appendingDone = trueakan mengunjungi Home, lalu mengesetappendingDone = truejuga di Home. Lalu saat OperatorProxy mengunjungi Home yang sudah menandai bahwa appending sudah selesai, maka Operator Proxy juga akan menandaiappendingDone = truepada dirinya sendiri. - Selanjutnya Operator Proxy akan kembali mengunjungi miner-miner di area nya dan memeriksa berdasarkan list
localchainyang masih disimpannya untuk memberikan reward. - Saat
localchainsudah kosong, maka tandanya Operator Proxy ini sudah selesai melakukan rewarding ke miner di areanya, lalu menandai dirinya sendiri sudah selesai (setdoneReward = true). Lalu saat Operator Proxy yang sudah selesai melakukan tugasnya mengunjungi Home, maka Home akan mencatat kedatangan Operator Proxy tersebut di HashSetconfirmedDoneOperatorProxy. - Saat
confirmedDoneOperatorProxysudah memilikisize == 8maka tandanya semua Operator Proxy sudah selesai menajalankan tugasnya, dan mekanisme transaksi Blockchain sudah selesai.
Kami menggunakan framework ONE Simulator untuk melakukan proses simulasi. Untuk itu, kami memodifikasi beberapa class dan juga membuat class baru untuk melengkapi algoritma. Untuk mempermudah pengembangan, kami akan menjabarkan mana saja class yang kami modifikasi saja (sisanya default dari framework ONE Simulator). Secara struktur, perubahan yang kami buat adalah sebagai berikut:
src/
├── Blockchain/
| ├── SecureTransaction.java
| ├── Transaction.java
| ├── Wallet.java
| ├── Block.java
| ├── Blockchain.java
| ├── CLIMessageStatus.java
| └── Localchain.java
|
├── core/
| ├── DTNHost.java
| └── SimScenario.java
|
├── data/
| ├── overlay.png
| └── Node/
| ├── collector.png
| ├── internet.png
| ├── miner.png
| └── opeproxy.png
|
├── gui/
| └── playfield/
| └── NodeGraphic.java
|
├── input/
| ├── TransactionCreateEvent.java
| └── TransactionEventGenerator.java
|
├── movement/
| ├── RandomArea.java
| └── MovementModel.java
|
├── routing/
| └── EpidemicDecisionRouterBlockchain.java
|
├── report/
| └── StorageCapacityReport.java
|
└── blockchainDTN.txtDetail
Berperan dalam proses kriptografi. Implementasi hashing SHA256 serta pembuatan tanda tangan digital menggunankan ECDSA dan library Bouncy Castle.
Class Transaction dimana objek transaksi dibuat oleh para miner untuk bertransaksi.
Dompet digital yang dimiliki tiap miner. Tiap wallet memiliki Public Key dan Private Key.
Class Block yang merupakan class penting yang digunakan dalam mekanisme transaksi di Blockchain dimana membungkus transaksi-transaksi yang dibuat oleh miner.
Blockchain digunakan sebagai rantai utama yang tersimpan di Internet.
Class untuk membuat tampilan UI pada terminal
Blockchain lokal yang dimiliki oleh setiap Operator Proxy.
Penambahan atribut tergantung pada apa rolenya (miner, Operator Proxy, Home, Collector atau Internet).
Penambahan atribut "difficulty" untuk transaksi blockchain. Lalu inisialisasi Localchain tiap Operator Proxy dan inisialisasi Blockchain pada Internet saat menjalankan method createHosts().
Penambahan overlay image untuk tampilan GUI Playlist yang lebih informatif.
Modifikasi fontColor tiap role agar berbeda di GUI. Lalu modifikasi drawHost yang tadinya memanfaatkan drawRectangle menjadi drawImage untuk menampilkan node dalam bentuk gambar.
Modifikasi dari MessageCreateEvent, dimana penambahan property "transaction" di dalam message. Lalu memastikan hanya node miner saja yang dapat membangkitkan pesan.
Modifikasi dari MessageEventGenerator dimana menambahkan field eventCount yang akan selalu berubah-ubah untuk membuat ID unik transaksi. Mengatur tiap message final destinationnya hanya ke Operator Proxy pada area mereka. Lalu pembuatan transaksi, penandatanganan transaksi, serta pembungkusan transaksi dilakukan di sini.
Modifikasi dari RandomWaypoint, perbedaannya adalah membatasi pergerakan randomnya menggunakan area sehingga tidak dapat bergerak diluar area yang ditentukan. Area diambil dari inputan user "moveArea" pada settings.
Penambahan atribut "moveArea".
Report untuk mencatat usage storage pada Operator Proxy per selang waktu tertentu.
Algoritma Routing mekanisme transaksi blockchain DTN.