Sebelum mencoba tutorial cara membuat cryptocurrency ini, perlu diketahui bahwa sebagian besar cryptocurrency tidaklah dibuat dari awal. Melainkan mengambil source code yang yang sama berasal dari bitcoin, lalu diturunkan menjadi jenis lainnya lagi. Varian yang baru dibuat ini, kemudian disebut dengan Altcoin (alternatif coin selain Bitcoin).
Sedangkan sebagaian besar lainnya adalah berupa token, yang dibangun diatas blockchain tertentu. Meski memang telah ada ribuan jenis altcoin, nampaknya akan tetap ada bermunculan nama-nama kripto baru, dan terus bertambah. Orang di dunia nampak begitu menikmati betapa mudahnya membuat uang sendiri versi mereka, setelah ruang-ruang itu dimonopoli dan dimanipulasi oleh bank-bank sentral dunia. Mereka mentasbihkan dirinya sebagai dewa penguasa penciptaan mata uang.
Apa yang terjadi jika setiap orang di dunia membuat mata uangnya sendiri? Di mana posisi dan peran bank sentral nantinya? Kira-kira seperti itulah gambaran yang perlu menjadi prolog pada kesempatan kali ini. Daripada makin ngelantur :D, mari kita coba memulai bahasan tentang bagaimana cara membuat cryptocurrency sendiri.
Seperti yang telah dijelaskan di awal, bahwa dari ribuan jenis kripto yang ada, sebagian besar banyak mengambil dari source code yang sudah ada. Pada bahasan ini pula, kita akan memanfaatkan source code yang telah ada tersebut. Bagaimana pun, cara-cara seperti itu tetap menjadi titik awal yang baik untuk mencoba mengenali lebih mendalam tentang cryptocurrency, bitcoin secara khusus, karena telah menjadi pengawal dunia cryptocurrency.
Souce code yang kita ambil nantinya adalah Litecoin versi 0.8, pertimbangannya, karena masih simple, dan belum kompleks seperti yang saat ini. Bagi yang sudah pengalaman coding, mungkin referensi pemprograman blockchain dengan C# bisa berguna untuk lebih jauh bisa bereksplorasi.
Jangan diambil serius, karena ini hanya bersifat pembahasan saja, bukan bertujuan membuat kripto baru seperti pada umumnya. Siapkan cemilan, kopi, karena prosesnya akan membutuhkan waktu yang lumayan panjang. Yuk, mari kita mulai.
Bagian Satu – Install Semua Dependency yang Diperlukan
Dependencies ini adalah file-file yang diperlukan saat kita hendak menginstall sesuatu. Agar cara membuat cryptocurrency sendiri ini berjalan mulus, tentu membutuhkan sekian banyak dependency yang diperlukan. Langsung saja, buka terminal di ubuntu anda, lalu satu persatu paste perintah berikut ini:
sudo apt-get install git
sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev
sudo apt-get install libboost-all-dev
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev
sudo apt-get install libminiupnpc-dev
sudo apt-get install libzmq3-dev
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
sudo apt-get install libqt4-dev libprotobuf-dev protobuf-compiler
Jika anda bertanya mengapa kita memerlukan repository bitcoin? Betul, karena Litecoin memang berasal dari sumber yang sama, Bitcoin. Lebih jauh kita akan mengetahui sendiri bagaimana Litecoin ini tidak akan jauh berbeda dengan Bitcoin, selain beberapa konsensus mendasar saja yang membedakan, seperti total supply dan beberapa hal lain.
Teruskan lagi prosesnya dengan memulai clone source code Litecoin versi 0.8 di github. Untuk memudahkan, sebaiknya anda menyimpan file clone Litecoin tersebut di folder Desktop pada ubuntu yang anda gunakan. Paste perintah di bawah ini:
cd Desktop
git clone -b 0.8 https://github.com/litecoin-project/litecoin.git
Pertama kali setelah clone, ada baiknya anda merubah nama folder hasil clone tersebut, sehingga mudah untuk di ingat. Di sini, EB merubah nama foldernya dengan “ebina”. Jadi untuk selanjutnya, anda hanya tinggal menyesuaikan saja dengan folder anda sendiri.
Kalau sudah, lanjutkan dengan merubah semua nama Litecoin, menjadi apapun sesuka anda. Paste saja perintah dibawah ini:
cd ebina
find . -type f -print0 | xargs -0 sed -i 's/litecoin/ebina/g'
find . -type f -print0 | xargs -0 sed -i 's/Litecoin/Ebina/g'
find . -type f -print0 | xargs -0 sed -i 's/LiteCoin/EbinaCoin/g'
find . -type f -print0 | xargs -0 sed -i 's/LITECOIN/EBINA/g'
find . -type f -print0 | xargs -0 sed -i 's/LTC/INA/g'
Jadi dengan perintah diatas tadi, kita telah merubah semua kata di dalam file-file hasil clone tersebut, dengan versi kita sendiri.
Khusus untuk source code Litecoin di versi ini, ada sedikit masalah di file rpcrawtransaction.cpp. Jadi kita perlu untuk merubahnya terlebih dulu. Buka folder hasil clone anda, lalu buka folder /src. Tepat di baris nomor 242, paste saja seperti ini:
const CScriptID& hash = boost::get<CScriptID>(address);
Setelah itu, sekarang kita coba untuk compile hasil clone. Proses compile pertama ini cukup menentukan kita bisa melanjutkan lebih jauh atau tidak. Jadi pastikan semua langkah diatas telah dilakukan secara benar.
Kalau berhasil, lebih jauh kita juga akan mengulang proses compile beberapa kali. Jangan khawatir, anda juga dapat mengcompile berapa kali yang anda mau, selama itu tidak merugikan tetangga anda… hehehe. Namun sebelumnya, pastikan anda berada di folder /src, lalu gunakan perintah ini untuk mulai mengcompile:
make -f makefile.unix
Bagaimana? Berhasil? Kalau berhasil berarti anda siap melangkah di tahap cara membuat cryptocurrency sendiri selanjutnya. Untuk mengetahui berhasil atau tidaknya, di dalam folder /src itu akan terdapat file “ebinad” (jika di dalam folder /src anda “xxxd”). Fungsi file itu adalah sebagai daemon, kalau di bitcoin disebut dengan bitcoind (daemon bitcoin).
Bagian Dua, Cara Membuat Cryptocurrency – Mengatur Parameter Network
Mari kita lanjutkan tutorial cara membuat cryptocurrency ini. Bagian kedua sudah masuk pada hal yang cukup penting. Yakni dalam hal mengatur parameter network atau jaringan.
Kalau kita memperhatikan di bitcoin, ada dua port yang digunakan, yakni pada port 8332 dan port 8333. Pada dasarnya, jenis komunikasi di dalam bitcoin dapat dilakukan dengan mudah melalui TCP saja, namun masih banyak ruang yang bisa dikembangkan untuk diluar itu.
Jika pada port 8333 lebih dominan dan ekslusif dipergunakan sebagai jalur komunikasi antar node di dalam jaringannya, sedangkan port 8332 lebih bersifat inklusif karena klien itu haruslah mengaktifkan terlebih dahulu secara default untuk bisa menggunakannya.
Meski pada dasarnya perbedaan fungsional kedua port itu sama-sama bertindak sebagai peer-to-peer port karena memang tipikal jaringannya adalah peer-to-peer, namun banyak orang memang lebih banyak membedakan dari sisi fungsionalitasnya.Oleh karena itu, port 8333 bitcoin lebih bersifat sebagai peer-to-peer port untuk node, dan port 8332 lebih bersifat TCP port.
Sama juga dengan di Altcoin Litecoin, karena memang berasal dari akar yang sama, tidak banyak perbedaan. Port yang digunakan juga ada dua, yakni port 9333 dan 9332. Dalam hal ini, anda juga harus mengganti kedua port tersebut dengan port anda sendiri.
Pertanyaannya, bagaimana kedua port tersebut bisa berfungsi secara maksimal tanpa bisa terganggu dan tercampur dengan jaringan yang lain?
Nah, dari bitcoin, yang kemudian digunakan juga oleh Litecoin, sama-sama menggunakan langkah ajaib untuk melindungi dan memastikan kedua port mereka tersebut dapat berlaku hanya untuk jaringan bitcoin dan litecoin saja. Bagaimana langkah ajaib tersebut bisa dilakukan? Anda akan mengetahuinya sendiri nantinya.
Kita tunda dulu penjelasan langkah ajaib proteksi network tadi, untuk selanjutnya langsung dengan mengubah port dengan port anda sendiri. Seperti yang dijelaskan tadi, bahwa port Litecoin adalah 9333 dan 9332, jadi kita akan mengganti kedua port itu dengan port anda sendiri. Pastikan anda berada di folder /ebina/ (sesuaikan dengan folder anda), lalu paste sesuai port anda seperti berikut:
find . -type f -print0 | xargs -0 sed -i 's/9333/2333/g'
find . -type f -print0 | xargs -0 sed -i 's/9332/2332/g'
Menentukan Karakter Address
Berikutnya adalah mengganti karakter Address kripto yang bisa anda sesuaikan sendiri. Kalau di Bitcoin kita sudah banyak mengetahui karakter addressnya dimulai dengan angka “1”, sedangkan di Litecoin dengan karakter huruf “L” di depan. Karakter huruf “L” yang digunakan oleh Litecoin ini, diperoleh dari versi desimal angka “48”. Jadi nantinya, anda dapat leluasa menentukan karakter address anda sendiri.
Address kripto, adalah turunan dari hash public key yang selanjutnya dirubah ke dalam format base58. Untuk merubahnya, buka file base58.h yang ada di dalam folder /ebina/src melalui exploler ubuntu anda, lalu edit dengan text editor yang biasa anda gunakan.
Arahkan ke baris nomor 275 pada file tadi, dan ganti sesuai yang anda inginkan. Kurang lebihnya akan nampak seperti ini:
class CBitcoinAddress : public CBase58Data
{
public:
enum
{
PUBKEY_ADDRESS = 33, // Ebina addresses start with E
SCRIPT_ADDRESS = 5,
PUBKEY_ADDRESS_TEST = 92,
SCRIPT_ADDRESS_TEST = 196,
};
Anda dapat melihat lebih jauh di list prefix address untuk lebih memudahkan anda dalam menentukan angka desimal mana agar dapat merepresentasikan karakter huruf yang anda inginkan. Diatas, EB menggunakan angka desimal “33” untuk bisa menghasilkan karakter huruf kapital “E” sebagai awal addressnya nanti. Dan juga angka “92” untuk huruf kecil “e” dalam address testnet. Kalau sudah selesai, tutup file itu, dan siap melangkah di tahapan cara membuat cryptocurrency sendiri selanjutnya.
Mengatur Sistem Alert
Sistem Alert ini adalah berkaitan dengan broadcast informasi keseluruhan transaksi secara masal di dalam jaringan kripto. Ibaratnya, alert sistem di dalam broadcast transaksi ini bagaikan iklan masal yang dikirimkan serentak dan di replay berulang kali kepada seluruh node di dalam jaringan.
Catatan Penting: Bahwa Alert System ini pada akhirnya bisa berpotensi menjadi celah keamanan. Terutama bagi varian altcoin yang mengambil dari source code turunan dari Bitcoin. Lebih baiknya disable fitur Alert System ini.
Disini nantinya kita akan membutuhkan tiga key alert yang akan digunakan. Langsung saja, buka terminal baru, lalu paste perintah berikut:
openssl ecparam -genkey -name secp256k1 -out alertkey.pem
openssl ec -in alertkey.pem -text > alertkey.hex
openssl ecparam -genkey -name secp256k1 -out testnetalert.pem
openssl ec -in testnetalert.pem -text > testnetalert.hex
openssl ecparam -genkey -name secp256k1 -out genesiscoinbase.pem
openssl ec -in testnetalert.pem -text > genesiscoinbase.hex
Penjelasan:
alertkey.hex untuk bisa mendapat key alert di mainnet
testnetalert.hex untuk bisa mendapat key alert di testnet
genesiscoinbase.hex untuk bisa mendapat key alert di block genesis maupun transaksi coinbase sebagai reward block baru
Caranya, pertama kita ketikkan perintah ini di terminal yang baru tadi:
cat alertkey.hex
Selanjutnya copy saja di bagian public key, paste di text editor anda, lalu hilangkan tanda “:”, dan jadikan dalam satu baris saja. Sebagai contoh, dari public key yang semula seperti ini:
04:9b:94:c8:19:40:a0:58:6a:5e:d7:0a:1a:56:63:
cf:02:e8:58:b0:22:8f:57:0f:99:a9:ef:a5:9f:61:
92:c9:98:eb:ab:a7:f7:2c:58:d2:d3:57:c6:6b:01:
d5:d0:0b:97:35:5e:c5:a4:55:07:5f:8b:31:f8:4e:
82:22:22:48:77
Lalu hapus tanda “:” hingga seperti ini:
049b94c81940a0586a5ed70a1a5663
cf02e858b0228f570f99a9efa59f61
92c998ebaba7f72c58d2d357c66b01
d5d00b97355ec5a455075f8b31f84e
4322224877
Dan dilanjut dengan menjadikan satu baris untuk selanjutnya bisa di copy paste.
049b94c81940a0586a5ed70a1a5663cf02e858b0228f570f99a9efa59f6192c998ebaba7f72c58d2d357c66b01d5d00b97355ec5a455075f8b31f84e4322224877
Copy key yang sudah dalam satu baris itu, lalu buka file alert.cpp yang ada di folder ebina/src. Arahkan ke baris 22 (pszMainKey), lalu paste di sana.
Kedua, ulangi untuk mengambil key alert yang akan digunakan di testnet. Ketikkan seperti di bawah ini:
cat testnetalert.hex
Copy dan paste di notepad dulu, edit dengan menghilangkan tanda “:”, jadikan satu baris seperti tadi. Masih di file alert.cpp, paste di bawah baris pszMainKey. Ingat, jangan sampai keliru. Kalau sudah simpan file alert.cpp, lalu tutup.
Key terakhir digunakan secara khusus untuk genesis block, paste perintah dibawah ini masih di terminal baru yang tadi:
cat genesiscoinbase.hex
Ulangi langkah edit dan jadikan satu baris tadi, lalu buka file main.cpp. Anda harus lebih akrab dengan file ini, karena akan lebih banyak berinteraksi dengan file tersebut. Arahkan menuju ke baris nomor 2788, paste di nilai ParseHex(“xx”), lalu save file.
Langkah Proteksi Network
Pada bagian ini, telah kita singgung di awal, sebagai sebuah langkah ajaib untuk membuat proteksi network agar hanya dapat berfungsi sebagai network kripto kita saja, tidak bisa tercampuri dengan network lain. Dikatakan sebagai langkah ajaib, karena ternyata hanya membubuhkan beberapa parameter saja, untuk membuatnya menjadi lebih spesifik, baik untuk network mainnet maupun testnet.
Langsung saja, caranya masih di file main.cpp, search saja “bool LoadBlockIndex()”, dibawahnya ada 4 parameter yang perlu di rubah untuk di testnet. Merubahnya seperti ini:
pchMessageStart[0] = 0xf7; ---> 0xf5
pchMessageStart[1] = 0xc4; ---> 0xc6
pchMessageStart[2] = 0xb1; ---> 0xb2
pchMessageStart[3] = 0xd9; ---> 0xd1
Sekarang untuk yang di mainnet, caranya sama, masih di main.cpp, search saja “unsigned char pchMessageStart[4]”.
Lanjutkan dengan mengganti 4 parameter di sebelahnya seperti tadi. Sehingga akan nampak seperti ini:
unsigned char pchMessageStart[4] = { 0xfe, 0xc8, 0xb3, 0xda }; //ganti sendiri di bagian { 0xfe, …}
Kalau sudah, simpan kembali file tersebut. Dan siap untuk melanjutkan ke bagian ketiga, dalam pembahasan tutorial cara membuat cryptocurrency.
Bagian Tiga – Menghapus Informasi Data Network Sebelumnya
Bagian ketiga cara membuat cryptocurrency sendiri ini adalah untuk menghapus data network yang telah ada tersimpan sebelumnya. Mengapa? karena kita clone source code, tidak build dari awal, jadi tentu saja telah menyimpan berbagai data yang berkaitan dengan peer node, ip address, dns, seed node aktif, ataupun yang lainnya.
Mengapa kita perlu menghapus, karena tentu saja kita belum mempunyai informasi tersebut karena belum ada klien satupun yang terhubung di network kita. Untuk melakukannya, pertama kita buka file net.cpp, arahkan ke baris 1226 atau search “unsigned int pnSeed[] =“.
Hapus semua data di dalamnya sehingga menjadi seperti di bawah ini:
unsigned int pnSeed[] =
{
0x0
};
Lanjutkan dengan search lagi “static const char *strMainNetDNSSeed[][2] = {“, hapus data dns seed mainnet yang ada dibawahnya. Sehingga jadi seperti ini:
static const char *strMainNetDNSSeed[][2] = {
{NULL, NULL}
};
Lalu hapus juga yang ada di dibawahnya, untuk DNS seed Testnet, hingga menjadi seperti ini:
static const char *strTestNetDNSSeed[][2] = {
{NULL, NULL}
};
Kalau sudah selesai, save file net.cpp, lalu tutup.
Bagian Empat – Menentukan Konsensus Dasar Block
Pada bagian ini, membahas bagaimana menentukan konsensus dasar block di blockchain. Beberapa hal yang menyangkut hal ini seperti besaran nilai reward block untuk penambang, total supply, rata-rata waktu block baru, coinbase maturity, dan juga konsensus tempo waktu halving.
Garis besarnya di proses ini nanti, kita akan mengetahui bagaimana transparansi dunia kripto yang dapat dilihat sendiri secara gamblang melalui source code yang dibuka secara publik. Beberapa hal di atas, secara tidak langsung akan membentuk ekonomi moneternya sendiri.
Misalnya saja pada penentuan reward block, total supply, dan rata-rata waktu block baru tercipta, dan juga halving, merupakan sebuah mekanisme distribusi unit-unit baru kripto. Dengan pola distribusi yang teratur dan terukur, selanjutnya akan mempengaruhi supply mata uang kripto di pasar.
Ditambah dengan karakternya yang terbatas, mata uang berbasis kripto menjadi berlawanan dengan sifat mata uang kertas yang tak terbatas, bisa dicetak berapapun jumlahnya. Akibatnya, fiat lebih rentan pada penurunan nilai mata uangnya sendiri, yang pasti akan berakhir dengan hyperinflasi.
- Total Supply
Total supply adalah jumlah keseluruhan unit kripto yang dapat diciptakan untuk sepanjang masa, tanpa ada penambahan penciptaan unit-unit baru lagi. Bitcoin, total supply unitnya terbatas hanya sebesar 21 juta unit saja. Meski demikian, unit-unit kriptonya terdiri dari 8 digit. Sehingga total nilainya juga cukup besar, dan dianggap cukup.
Anda bisa menentukan berapa total supply mata uang kripto anda sendiri. Selain itu, anda juga akan mengetahui bahwa mata uang kripto cukup berbeda dengan mata uang fiat. Mata uang kripto sejak awal peciptaan sistemnya, sudah mengetahui jumlah total penciptaan mata uangnya, tidak seperti mata uang fiat.
Caranya, buka file main.h yang ada di dalam folder /src anda, arahkan di baris nomor 55. Di situ, anda bisa membuktikan transparansi total supply sebuah mata uang kripto. Jadi, untuk membuktikan secara langsung spesifikasi mata uang kripto termasuk total supplynya, maka anda harus melihat langsung di bagian file ini. Anda bisa merubah total supply yang besarnya 84.000.000 tersebut sesuka anda.
Yang perlu anda perhatikan adalah, bahwa jumlah total supply tersebut bukanlah angka acak, namun total angka yang telah dikalkulasi dengan matang, karena akan mempengaruhi banyak hal. Termasuk penentuan nilai block reward, rata-rata block baru, mekanisme halving. Anda juga harus memastikan bahwa total supply tersebut akan bisa dikalkulasi secara pasti, kapan keseluruhan total supply tersebut akan habis seluruhnya dalam jangka waktu tertentu, berdasarkan banyak hal tadi.
- Coinbase Maturity
Lanjutkan ke bawahnya di baris 58, adalah coinbase maturity. Coinbase maturity ini adalah tenggang waktu reward block yang baru bisa digunakan untuk dibelanjakan setelah melampaui beberapa block selanjutnya yang telah ditentukan disana. Jika anda telah menentukan nilai coinbase maturity sebesar 50 misalnya, maka para penambang yang mendapat reward block baru, hanya akan bisa menggunakan koin tersebut, jika block baru yang tercipta selanjutnya telah mencapai 50 block.
Jadi fungsi coinbase maturity ini adalah, juga menjadi salah satu fungsi dalam mengatur distribusi unit-unit kripto baru. Sehingga bisa mempengaruhi hukum supply and demand pula. Anda bisa menentukan sendiri nilainya. Namun anda juga perlu juga untuk memperhatikan berapa menit rata-rata waktu yang dibutuhkan dalam proses penciptaan block-block baru.
- Transaksi Low-priority
Melangkah selanjutnya di baris nomor 627, adalah tentang bebas fee transaksi untuk transaksi-transaksi yang berukuran kecil dengan ukuran byte yang kecil. Khusus tentang bagian ini sebenarnya juga tidak lagi digunakan, baik di bitcoin maupun dibeberapa altcoin lainnya, karena umumnya telah ada biaya transaksi yang diambil dari besaran per byte.
Bagian tentang free tx disini memang sengaja dibahas sebagai bahan informasi tambahan saja untuk anda. Jadi anda bisa menggunakannya atau tidak. Kalau sudah semua di file main.h ini, anda bisa save file dan menutupnya.
- Konsensus Block Reward
Block Reward adalah sejumlah unit koin kripto baru yang diberikan kepada penambang yang berhasil memproduksi block baru pada tempo waktu tertentu. Nah, sudah disinggung sebelumnya bahwa penentuan jumlah total supply akan berelasi dengan penentuan nilai block reward ini.
Jadi mekanisme penentuan block reward, haruslah bisa dipastikan keseluruhan unitnya itu benar-benar bisa habis melalui distribusi unitnya. Maka kalkulasinya juga harus presisi berdasarkan dengan rata-rata tempo waktu block baru yang anda tentukan nantinya. Kalau kalkulasinya benar-benar presisi, prediksi kapan total supply akan habis diproduksi pun dapat diketahui sejak awal.
Bitcoin sudah bisa diprediksi dengan kalkulasi yang logis, bahwa unit bitcoin baru akan habis ditambang seluruhnya pada tanggal 7 Mei tahun 2140.
Anda bisa merubah nilai block reward ini dengan membuka kembali file main.cpp, lalu arahkan ke baris 1090, atau dengan search “int64 nSubsidy”. Silahkan tentukan sendiri nilai block reward anda.
- Konsensus Halving
Halving ini maksudnya pemotongan separuh nilai block reward yang diberlakukan secara otomatis setelah mencapai ukuran tertentu. Dalam hal ini, seperti bitcoin maupun di source code litecoin yang anda lihat saat ini juga memberlakukan mekanisme halving dengan ukuran pencapaian jumlah block. Disana anda melihat capaian jumlah block untuk halving adalah 840.000 block.
Jadi penerapan halving baru, berjalan secara otomatis, jika telah memperoleh jumlah block tersebut. Kisaran waktunya masih sama dengan bitcoin, dalam jangka waktu 4 tahun. Sekali lagi, anda bebas untuk memodifikasi nilai total block untuk halving ini. Letak code untuk mekanisme ini tepat berada di bawah block reward, di baris 1093 file main.cpp.
- Rata-rata Waktu Block Baru
Masih di file yang sama, pada baris bawahnya nomor 1098 dan 1099, adalah tentang penentuan rata-rata block baru yang bisa diciptakan. Penentuan rata-rata block baru ini, sekaligus berkaitan dengan mekanisme retarget tingkat kesulitan pertambangan. Sehingga, rata-rata waktu block baru yang dapat tercipta itu dapat dicapai lebih konstan. Anda bisa merubah ini:
static const int64 nTargetTimespan = 3.5 * 24 * 60 * 60;
static const int64 nTargetSpacing = 2.5 * 60;
nTargetTimespan ini adalah jangka waktu retarget difficulty ekosistem pertambangan.
nTargetSpacing ini adalah rata-rata waktu block baru yang bisa diciptakan, biasanya dalam ukuran menit.
Kalau sudah selesai, save kembali file main.cpp anda.
Bagian Lima – Menentukan Parameter Blockchain
- Genesis Block
Genesis block ini adalah block baru pertama kali, yang nilainya bisa anda tentukan sendiri. Namun, sebaiknya anda gunakan nilai yang sama seperti nilai block reward, agar anda tidak mengkalkulasi ulang. Jika anda telah merubah nilai block reward sebelumnya adalah 20 koin misalnya, maka nilai Reward di Genesis Block sebaiknya juga tetap 20.
Jadi jika anda telah merubah nilai di block reward, maka anda juga harus merubah nilai genesis block. Lokasinya masih sama di file main.cpp, baris 2787. Lihat seperti dibawah ini:
txNew.vout[0].nValue = 50 * COIN;
- Arbitrary Text Pada Genesis Block
Arbitrary Text pada Genesis Block ini maksudnya adalah bahwa anda bisa melampirkan sembarang teks di dalam Genesis Block anda. Seperti pada bitcoin yang melampirkan judul headline harian New York Times tentang rencana bailout kedua bank sentral AS.
Untuk merubahnya, ada di atas nilai genesis block tadi. Anda bisa merubahnya di bagian ini:
const char* pszTimestamp = "bla...bla...bla...bla...bla...bla";
Meski anda bisa memasukkan sembarang text, namun tetap ada batasan yang telah ditentukan. Kalau ingin mengetahui berapa ukuran karakter arbitrary teks yang bisa anda masukkan, lihat saja di baris 589. Kurang lebih seperti ini:
if (IsCoinBase())
{
if (vin[0].scriptSig.size() < 2 || vin[0].scriptSig.size() > 100)
return state.DoS(100, error("CTransaction::CheckTransaction() : coinbase script size"));
}
Jadi diatas, telah ditentukan jumlah limit karakternya, jadi jika anda memasukkan karakter melebihi jumlah 100 itu, maka proses build core pun tidak bisa berjalan karena eror. Namun anda tentu bisa merubah limit karekter itu sebelumnya, jika anda ingin memasukkan karakter pesan lebih banyak.
- Timestamp Genesis Block
Pembahasan cara membuat cryptocurrency sendiri makin menarik di bagian ini. Menarik, karena kita akan memahami bagaimana genesis block haruslah sesuai dengan waktu saat itu, nounce block, dan juga hash block genesis tersebut. Karena source code kita bukan build dari awal, melainkan hasil clone dari bitcoin yang di clone ulang oleh Litecoin, lalu kita clone ulang lagi, maka menjadi terkesan seolah menyiasati genesis block yang sebelumnya telah terekam di source code itu.
Untuk menyiasati agar bisa mendapat timestamp berdasarkan nounce saat itu dan hash block yang tepat dan valid, maka otomatis juga harus menyiasati ketiganya. Cara pertama adalah memperoleh timestamp yang digunakan sebagai kail untuk mendapatkan nounce dan nilai hash yang tepat, agar bisa digunakan sebagai detail informasi genesis block.
Di sini, kita bisa memperoleh timestamp kita sendiri. Karena ada dua network yakni mainnet dan testnet, maka kita tentu membutuhkan dua timestamp yang berbeda. Misalnya pertama kita buat timestamp untuk testnet dulu, caranya buka terminal baru, lalu ketikkan ini:
date +%s
Catat hasil replay perintah tadi, lalu tandai untuk testnet, karena penting agar anda tidak sampai keliru saat memasukkannya.
Ulangi lagi perintah tadi diterminal untuk timestamp mainnet. Copy dan paste di terminal, tandai untuk mainnet.
Masukkan timestamp untuk testnet di file main.cpp pada baris 2800. Contohnya seperti dibawah ini:
if (fTestNet)
{
block.nTime = 1518545988;
Selanjutnya untuk timestamp mainnet masukkan di baris 2794 (diatas testnet).
Berikutnya adalah menghapus nilai hash markle root di baris 2809 sehingga menjadi seperti ini:
assert(block.hashMerkleRoot == uint256("0x"));
Save file main.cpp anda.
- Mencari Hash Merkle Root Genesis Block yang Valid
Kalau sudah, maka selanjutnya adalah mencoba mengcompile kembali untuk menghasilkan hash merkle root genesis block yang valid. Caranya masih ingat bukan? Paste seperti saja perintahnya dibawah ini:
make -f makefile.unix
Prosesnya mungkin membutuhkan waktu hingga 10-20 menit. Kalau proses compile selesai dan berhasil, lanjutkan dengan menjalankan daemon core kripto anda. Proses nantinya tidak akan berhasil, karena memang tujuannya untuk bisa mendapat hash merkle root valid untuk genesis block kita. Pastikan anda berada di folder /ebina/src (sesuaikan dengan folder anda), lalu ketikkan perintah berikut:
./ebinad (sesuaikan nama+d)
Kalau sudah mendapat report eror “Aborted (core dumped) maka di file debug.log akan otomatis menghasilkan hash merkle root yang valid. Jadi anda tinggal melihatnya di file debug.log yang berada di folder .ebina
Anda bisa menekan tombol CTRL+h untuk menampilkan file-file sistem atau tersembunyi. Buka file dan lihat di baris paling bawah.
Bagian baris paling bawah, itulah hash merkle root anda yang valid. Anda bisa gunakan hash itu untuk hash merkle root block genesis anda. Lihat gambar di bawah ini:
Copy baris hash itu, lalu paste di baris 2809 file main.cpp anda. Lalu save file.
- Menyiapkan Block Genesis Testnet dan Mainnet
Copy dan paste code dibawah ini, tepat di baris 2803 file main.cpp anda (di bawah timestamp testnet).
if (false && block.GetHash() != hashGenesisBlock)
{
printf("Searching for genesis block...\n");
// This will figure out a valid hash and Nonce if you're
// creating a different genesis block:
uint256 hashTarget = CBigNum().SetCompact(block.nBits).getuint256();
uint256 thash;
char scratchpad[SCRYPT_SCRATCHPAD_SIZE];
loop
{
#if defined(USE_SSE2)
// Detection would work, but in cases where we KNOW it always has SSE2,
// it is faster to use directly than to use a function pointer or conditional.
#if defined(_M_X64) || defined(__x86_64__) || defined(_M_AMD64) || (defined(MAC_OSX) && defined(__i386__))
// Always SSE2: x86_64 or Intel MacOS X
scrypt_1024_1_1_256_sp_sse2(BEGIN(block.nVersion), BEGIN(thash), scratchpad);
#else
// Detect SSE2: 32bit x86 Linux or Windows
scrypt_1024_1_1_256_sp(BEGIN(block.nVersion), BEGIN(thash), scratchpad);
#endif
#else
// Generic scrypt
scrypt_1024_1_1_256_sp_generic(BEGIN(block.nVersion), BEGIN(thash), scratchpad);
#endif
if (thash <= hashTarget)
break;
if ((block.nNonce & 0xFFF) == 0)
{
printf("nonce %08X: hash = %s (target = %s)\n", block.nNonce, thash.ToString().c_str(), hashTarget.ToString().c_str());
}
++block.nNonce;
if (block.nNonce == 0)
{
printf("NONCE WRAPPED, incrementing time\n");
++block.nTime;
}
}
printf("block.nTime = %u \n", block.nTime);
printf("block.nNonce = %u \n", block.nNonce);
printf("block.GetHash = %s\n", block.GetHash().ToString().c_str());
}
Fungsi code diatas adalah untuk bisa menghasilkan atau generate timestamp, nounce dan hash genesis block yang valid, saat nanti kita jalankan daemon core kripto kita. Karena ada dua genesis baik di testnet maupun mainnet, maka kita hapus terlebih dahulu nilai hash genesis block yang telah ada (di testnet dan mainnet).
Hash genesis block pertama yang kita hapus pertama untuk yang di testnet letaknya di baris 2749 file main.cpp. Hapus nilai hashnya menjadi seperti ini:
hashGenesisBlock = uint256("0x");
Lalu selanjutnya hapus juga nilai hash block genesis mainnet pada baris nomor 38 (bagian atas). Kalau sudah, save file kembali, lalu ulangi untuk compile kembali.
Genesis Block Testnet
Kalau compile berhasil, coba running daemon core anda di testnet terlebih dahulu. Pastikan anda berada di dalam folder ebina/src, lalu ketikkan perintah seperti ini:
./ebinad -testnet
Nanti anda akan mendapat notifikasi pesan eror, kemudian buka file debug.log yang ada di folder testnet3.
Cari di dalam debug.log testnet tersebut, yang seperti ini:
block.nTime = 1518545988
block.nNonce = 386296394
block.GetHash = 7ae6f691f4809e42faf40be7beb937e1d3aa5735c51d1d586c49f385be95c6c6
Keterangan:
386296394 —> nilai nonce valid block genesis testnet anda
7ae6f69xxxx —> nilai hash valid block genesis testnet anda
Selanjutnya anda tinggal memasukkan nonce dan hash block genesis testnet tersebut pada lokasi yang sebelumnya telah kita hapus dengan tepat. Jangan sampai keliru, kalau keliru proses build nantinya tidak akan berhasil, karena tidak ada block genesis yang valid.
Lokasi detail informasi block genesis testnet ada di di baris 2749 pada file main.cpp anda. Sedangkan lokasi nonce dan timestamp genesis block anda ada di baris 2801. Save file, lalu compile kembali.
Genesis Block Mainnet
Ulangi langkah sebelumnya di mainnet, dengan perintah ./ebinad (sesuaikan dengan nama file daemon core anda, tanpa “-testnet”). Tunggu sampai keluar pesan eror, lalu buka file debug.log mainnet anda. Cari baris serupa yang menampilkan informasi tentang nonce dan hash block, lalu paste di block genesis mainnet anda.
Lokasi hash block genesis mainnet ada di baris nomor 38 file main.cpp
Lokasi nonce block genesis mainnet terletak di baris 2796
Terakhir yang perlu dirubah di file main.cpp adalah mengganti nilai “true” menjadi “false” pada code tambahan yang kita masukkan sebelumnya di file main.cpp. Search saja “if (true && block.GetHash() != hashGenesisBlock)”, ganti nilai true menjadi false di baris tersebut.
- Merubah Informasi Data Checkpoints.cpp
Langkah selanjutnya, adalah merubah informasi data di file checkpoints.cpp. Buka file tersebut di folder /src, lalu arahkan di baris 38, lalu ganti seperti di bawah ini:
( 0, uint256("0x1xxxxHASH BLOCK GENESIS MAINNET ANDA"))
Lanjutkan dibawahnya menjadi seperti ini:
static const CCheckpointData data = {
&mapCheckpoints,
1518546021, // <-- GANTI DGN TIMESTAMP MAINNET ANDA
0, // * ISI NOL
//
1.0// * GANTI SEPERTI ITU
};
Terakhir ganti juga informasi checkpoint sesuai dengan informasi timestamp, nonce, dan hash genesis block untuk testnet anda. Sesuaikan dengan informasi genesis block testnet anda yang sudah anda gantikan di file main.cpp. Kurang lebihnya akan nampak seperti ini setelah semuanya diganti.
- Compile
Simpan semua file kembali. Jika anda ingin merubah banyak hal seperti desain image untuk wallet, icon, dan gambar-gambar lainnya, anda bisa mengedit sendiri di folder /src/qt/res. Kalau sudah, sekarang tinggal jalankan compile terakhir. Pastikan dulu anda berada di folder /ebina (sesuaikan dengan folder anda).
Kali ini, coba jalankan perintah compile seperti ini:
qmake
make
Berhasil bukan? lanjutkan dengan menjalankan core anda pertama kali di testnet. Ketikkan perintah berikut:
./ebina-qt -testnet
Untuk jalankan di mainnet, ketikkan perintah berikut:
./ebina-qt
Tunggu sebentar, dan… yeeee…. kita berhasil!!!
Pada lain kesempatan, kita akan membahas lanjutan untuk proses mining pertama, dan mengkoneksikan dengan klien lain. Semoga pembahasan cara membuat cryptocurrency sendiri ini dapat membuat anda lebih mengerti cara kerja bitcoin dan cryptocurrency secara umum. Lalu bagaimana jika semua orang di Indonesia membuat mata uang kriptonya sendiri?
14 Comments
Terus setelah itu di apakan?
mantap gan lanjutkan,,,, saya mendukung dan bersedia menjadi klien test
wow BE hebat sekali, kenapa nggak bikin aja sekalian ICO star up Indonesia, pake aja nama Rupiah hahaha saya pasti ikut invest.
Kalau pakai nama rupiah pasti langsung jadi buronan BI gan wkwkwk
Setelah itu ya jalankan, koneksikan 1 pc lg. Install core yg td di pc satunya, lalu jalankan. Jd 2 pc jalan untuk bs saling sync. Udah nambang deh.
Ane ada pertanyaan ni gan
dev.nya altcoin kan ngambil rata” kira 3-5% untuk airdrop dan bounty
Nah, klo satu user buat banyak akun dan menggunakan ip berbeda sehingga tidak ketahuan multi akunnya dan dapat lebih banyak tokennya , apakah developernya rugi ?
Kalau ditanya rugi tidaknya tentu saja merugi, karena target dan proyeksi project kripto pada dasarnya adalah mass adoption. Jika satu pengguna dengan banyak akun tentu saja artinya tingkat adopsinya menjadi tidak akurat, dan dipertanyakan. Apakah penggunaan IP berbeda ketahuan atau tidak, bisa saja ketahuan jika pada program bounty ataupun airdrop tersebut baik tim di belakang project itu mampu untuk menelusuri hal itu. hehehe
Gan. Bisa gak bikin tutorial seperti ini tapi untuk platform Windows7 dan script coin nya gunakan php dan javascript? Ane tertarik sekali untuk bisa bikin coin sendiri… mumpung ane ada temen yang siap jadi investor untuk coin baru gan… please…
ada itu e-book yang sudah bisa agan lihat sendiri, pake C#, search sj kalau berniat untuk build from scratch. Sebagai catatan, kalau agan mau coding, sebaiknya memang tidak di windows. beda lagi jika mau build varian versi wallet jadinya ke beberapa platform, seperti windows itu.
mantap gan,,, saya tertarik buat coin sendiri
Ada email yg bisa di hubungi?
info@bitcoinmedia.id
Ya di instal core serupa di perangkat berbeda, agar kedua perangkat itu bisa saling terkoneksi, dan membentuk jaringan p2p. Lalu mulai sync antara keduanya, maka ya sudah berjalan.
Litecoin versi 0.8 di mana bisa mendapatkan file Dependencies ni ya