Post
Topic
Board Bahasa Indonesia (Indonesian)
Merits 8 from 3 users
Re: [Edukasi] Proses Transaksi & Block di Jaringan Blockchain Bitcoin
by
punk.zink
on 08/02/2024, 06:10:50 UTC
⭐ Merited by ABCbits (4) ,Husna QA (3) ,fillippone (1)

● Membuat sebuah transaksi


  • Membuat transaksi dengan Bitcoin GUI Wallet
  • Membuat transaksi dengan RPC Commands
  • Membuat transaksi secara manual (Create Transaction from the Scratch)




Membuat transaksi dengan Bitcoin GUI Wallet


◉ Membuat Transaksi melalui Bitcoin Core GUI Client

Ini merupakan cara yang paling mudah dan mayoritas pengguna Bitcoin Core client tidak akan menemui kendala pada prosesnya. Sebagai contoh saya akan mengutip sebuah guide yang pernah diuraikan oleh agan Husna QA


B. Send Bitcoin



- Pay to : Isi dengan Bitcoin Address yang akan dituju; Jika ingin mengirim ke address yang pernah dikirimi sebelumnya klik tombol di samping kanan kolomnya (ikon buku alamat).

- Label : Bisa dikosongkan atau diisi diantaranya untuk memudahkan pencarian pada transaksi berikutnya.

- Amount : Diisi dengan jumlah aset yang akan dikirim, satuannya bisa disesuaikan: BTC ; mBTC ; µBTC (bits) ; Satoshi (Sat)
(Mengenai satuan-satuan bitcoin bisa dipelajari antara lain di sini: https://bitcoinmedia.id/satuan-bitcoin/)

- Klik tombol Use available balance jika ingin mengirim semua aset yang ada.

- Subtract fee from amount : Centang jika fee transaksi ingin diambil dari jumlah transaksi, jika tidak maka fee akan diambil diluar dari jumlah transaksi yang ditentukan.

- Transaction fee : Terdapat dua pilihan: Recommended dan Custom
Pada pilihan Recommended terdapat beberapa opsi fee yang bisa dipilih pada Confirmation time target (sesuaikan dengan kebutuhan).
Sementara pada Custom bisa di setting manual, namun perlu diperhatikan agar tidak terpaut jauh dengan fee rates yang berlaku pada saat transaksi;

Gunakan web semisal https://mempool.space/ untuk mengetahui estimasi berapa saja besaran fee dan waktu transaksinya sampai terkonfirmasi.
Referensi lainnya: List of Bitcoin Mempool Viewers for Reference.


- Enable Replace-By-Fee : Fitur RBF ini berfungsi agar bisa menaikkan fee pada transaksi yang sebelumnya sudah terkirim namun kondisinya masih unconfirmed dengan mengganti tx tersebut menggunakan tx yang baru.
Informasi lebih detail mengenai RBF bisa dilihat di sini: https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki.

Note:
Sedikit berbeda dengan di Electrum, saya sarankan agar bisa memanfaatkan fitur RBF di Bitcoin Core usahakan masih ada balance yang cukup di wallet untuk keperluan increase transaction fee, jika tidak cukup balance-nya maka kemungkinan akan muncul notifikasi seperti berikut:



- Add Recipient : berfungsi untuk mengirim ke beberapa address sekaligus.

- Klik Send jika semua parameter yang diinput sudah sesuai atau klik Clear All untuk membatalkan transaksi yang hendak dibuat tersebut.

Berikut ini contoh transaksi yang saya kirim ke beberapa address wallet sekaligus:



Ketika klik Send, maka akan dimunculkan window untuk mereview transaksi (periksa kembali detail transaksinya seperti pada address, amount, fee)



Transaksi ke Address 1 & 2:
https://blockstream.info/testnet/tx/60c7c83c3aa2d103a3702f27bb243dd918178e7a56fe0193eba18107a33c4365

* Credit to Husna QA



◉ Membuat Transaksi melalui Electrum GUI

  • Jalankan Wallet Electrum
  • Pilih Fitur "Send" [1]
  • Masukkan address penerima pada kolom "Pay to" [2]
  • Masukkan jumlah BTC yang akan dikirimkan pada kolom "Amount" [3]
  • Lalu klik Tab "Pay" [4]



  • Setelah itu akan muncul jendela preview "Create Transaction"
  • Untuk mengaktifkan fungsi RBF, berikan checklist pada Tab "Replace by fee" [5]
  • Untuk mengatur fee transaksi, silahkan di-adjust pada Tab "Target fee" [6]
  • Lalu tekan Tab "Finalize" [7]



  • Setelah itu akan muncul jendela preview "Transaction"
  • Untuk menandatangani Transaksi, klik Tab "Sign" [8]



  • Untuk menyebarkan transaksi ke Jaringan Blockchain, tekan Tab "Broadcast" [9]



  • Lalu akan muncul jendela "Information" yang menyatakan transaksi telah dikirimkan (beserta dengan TXID-nya)








Membuat transaksi dengan RPC Commands

Membuat sebuah transaksi menggunakan RPC Commands bisa dilakukan dengan beberapa cara, contoh seperti halnya menggunakan perintah send, sendtoaddress, dan createrawtransaction. Untuk sebuah alasan, saya memilih untuk menggunakan createrawtransaction karena dalam prosesnya kita bisa memilih UTXO yang akan dijadikan input buat transaksi tersebut.

  • Jalankan Bitcoin Core dan buka RPC Console (Pada contoh kali ini saya menggunakan Bitcoin Core Testnet)

  • Untuk mengetahui UTXO yang bisa digunakan, pakai perintah listunspent
Code:
listunspent

  • Didapatkan hasil sebagai berikut

Code: (result)
    "txid": "2675704bb770f99cb0063cf8355da88b5941014e2d883b94d977407626fecd9b",
    "vout": 0,
    "address": "mx2f9C4cL1cABKG6om5eHbvpe6ueXjZCyK",
    "label": "",
    "scriptPubKey": "76a914b5202c46e31f0627702e57a6640545b5048e2c3788ac",
    "amount": 0.00065240,
    "confirmations": 5,
    "spendable": true,
    "solvable": true,

  • Selanjutnya membuat transaksi menggunakan perintah createrawtransaction
Code:
createrawtransaction [{"txid":"hex","vout":n}] [{"address":amount}] ( locktime replaceable )

Code: (Contoh)
createrawtransaction '[{"txid":"2675704bb770f99cb0063cf8355da88b5941014e2d883b94d977407626fecd9b","vout":0}]' '[{"mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB":0.0001},{"n1sQo7UFrRD5KzjXCUyQCrjQs4zaXuFcgt":0.0004524}]'
- Karena parameter locktime dan replaceable tidak diisi, maka secara default nilai dari locktime = 0, dan replaceable = true (menyatakan jika transaksi adalah RBF)
- Address pertama pada Output (mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB) merupakan address dari penerima (address testnet milik https://coinfaucet.eu/en/btc-testnet/)
- Address kedua pada Output (n1sQo7UFrRD5KzjXCUyQCrjQs4zaXuFcgt) merupakan change address dari pengirim

  • Didapatkan hasil sebagai berikut

Code: (Hex Raw Transaction)
02000000019bcdfe26764077d9943b882d4e0141598ba85d35f83c06b09cf970b74b7075260000000000fdffffff0210270000000000001976a9149f9a7abd600c0caa03983a77c8c3df8e062cb2fa88acb8b00000000000001976a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac00000000

  • Menandatangani Transaksi menggunakan perintah signrawtransactionwithwallet

Code:
signrawtransactionwithwallet "hexstring"

Code: (Contoh)
signrawtransactionwithwallet 02000000019bcdfe26764077d9943b882d4e0141598ba85d35f83c06b09cf970b74b7075260000000000fdffffff0210270000000000001976a9149f9a7abd600c0caa03983a77c8c3df8e062cb2fa88acb8b00000000000001976a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac00000000

  • Didapatkan hasil sebagai berikut

Code: (result of signed_hex)
"hex": "02000000019bcdfe26764077d9943b882d4e0141598ba85d35f83c06b09cf970b74b707526000000006a47304402202261d1a8dd3009427036b569948ece8fb8732d8211770f7405cf3e777a1ed8400220773ab906cba6817fa1da7e9d8077ba1206ba80bd735809f7eb1405bb8486643b012103b0044231eac1e3495cc0a3769cf14dc1fefa5163c40a40b0ea0e9c8ec747e2dffdffffff0210270000000000001976a9149f9a7abd600c0caa03983a77c8c3df8e062cb2fa88acb8b00000000000001976a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac00000000",
"complete": true
Status boolean "complete": true, menyatakan jika transaksi telah memiliki Signature

  • Mengirimkan transaksi yang telah ditandatangani ke jaringan blockchain

Code:
sendrawtransaction "signed_hex"

Code: (Contoh)
sendrawtransaction 02000000019bcdfe26764077d9943b882d4e0141598ba85d35f83c06b09cf970b74b707526000000006a47304402202261d1a8dd3009427036b569948ece8fb8732d8211770f7405cf3e777a1ed8400220773ab906cba6817fa1da7e9d8077ba1206ba80bd735809f7eb1405bb8486643b012103b0044231eac1e3495cc0a3769cf14dc1fefa5163c40a40b0ea0e9c8ec747e2dffdffffff0210270000000000001976a9149f9a7abd600c0caa03983a77c8c3df8e062cb2fa88acb8b00000000000001976a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac00000000

  • Didapatkan hasil sebagai berikut

Code: (result of TXID)
e9fa95bdb80bc780ed92bc865d9b6ec07ba0c42a06d34009d6d0bef84a1ad793

TXID e9fa95bdb80bc780ed92bc865d9b6ec07ba0c42a06d34009d6d0bef84a1ad793 bisa dicek disini
https://tbtc.bitaps.com/e9fa95bdb80bc780ed92bc865d9b6ec07ba0c42a06d34009d6d0bef84a1ad793


Image dari keseluruhan proses dari Cara kedua (Membuat transaksi dengan RPC Commands)






Membuat transaksi secara manual (Create Transaction from the Scratch)

Ini merupakan cara yang paling rumit dan bahkan bisa dibilang jarang sekali yang menggunakan cara ini untuk membuat sebuah transaksi. Namun dalam hal ini, saya akan menguraikan caranya, sehingga bisa diketahui bagaimana sebuah RAW Transaction dibuat, disusun, ditandangani dan dikirimkan ke Jaringan blockchain (ini juga merupakan penjelasan secara detail dari membuat transaksi menggunakan cara kedua).

◉ Membuat Transaksi Non-Segwit

  • Pertama-tama harus diketahui Struktur dan susunan dari Transaksi Non-Segwit

Code:
Version >> Input Count >> Inputs (TXID > Index UTXO > Scriptsig Size > Scriptsig > nSequence) >> Output Count >> Outputs (Value > ScriptPubKey Size > ScriptPubKey) >> Locktime

  • Menentukan Version
    Misal dipilih Versi 2, jika direpresentasikan dalam bentuk Hex (4 bytes) Little-endian Format maka akan seperti ini : 02000000

  • Menentukan Jumlah Input
    Untuk 1 Input jika direpresentasikan ke bentuk Hex : 01

  • Menentukan UTXO (TXID) yang akan digunakan pada Input
    Untuk mengetahui UTXO/TXID beserta value amount dan indeknya bisa menggunakan perintah listunspent

Code: (result of listunspent)
    "txid": "e9fa95bdb80bc780ed92bc865d9b6ec07ba0c42a06d34009d6d0bef84a1ad793",
    "vout": 1,
    "address": "n1sQo7UFrRD5KzjXCUyQCrjQs4zaXuFcgt",
    "label": "",
    "scriptPubKey": "76a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac",
    "amount": 0.00045240,

  • In-case kita tidak memiliki Bitcoin Core atau software wallet lainnya, maka untuk mengetahui TXID dari UTXO yang akan digunakan beserta Indeksnya, maka kita bisa melihatnya melalui situs Block Explorer. Yang terpenting kita memiliki Private Key dari address yang related dengan UTXO/TXID tersebut.



  • TXID harus direpresentasikan dalam bentuk format Little-Endian : 93d71a4af8bed0d60940d3062ac4a07bc06e9b5d86bc92ed80c70bb8bd95fae9

  • Menentukan Index UTXO
    Diketahui Index (vout) dari TXID diatas adalah 1, jika direpresentasikan dalam bentuk Hex (4 bytes) Little-endian Format maka akan seperti ini : 01000000

  • Mengisi (sementara) ScriptSig Size dan ScriptSig menggunakan data ScriptPubKey address pengirim
    ScriptPubKey bisa diketahui dari output TXID yang ditampilkan oleh situs Blockchain explorer



  • Diketahui ScriptPubKey adalah 76a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac dengan ukuran 25 bytes, maka
    ScriptSig Size direpresentasikan dengan 19 (bentuk hex dari 25 bytes)
    ScriptSig direpresentasikan dengan 76a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac

  • Menentukan nSequence
    Untuk transaksi RBF gunakan fdffffff, untuk transaksi non-RBF gunakan ffffffff

  • Menentukan jumlah Output
    Jika Output yang dipilih cuma 1 maka direpresentasikan ke bentuk Hex : 01

  • Menentukan jumlah amount pada Output
    Amount yang akan digunakan adalah 0.00033333 BTC = 33333 satoshis, maka harus dirubah ke bentuk 8 bytes Hex dan format Little-Endian : 3582000000000000

  • Mencari ScriptPubKey dan ScriptPubKey size dari address penerima
    Misal Address Penerima adalah mx2f9C4cL1cABKG6om5eHbvpe6ueXjZCyK, maka untuk mengetahui ScriptPubKey dari address tersebut bisa menggunakan perintah getaddressinfo atau mencari informasinya melalui situs Blockchain Explorer



  • Diketahui ScriptPubKey size adalah 25 bytes, maka direpresentasikan ke bentuk Hex : 19
  • Diketahui ScriptPubKey adalah 76a914b5202c46e31f0627702e57a6640545b5048e2c3788ac

  • Menentukan LockTime
    Dipilih Locktime = 0, maka direpresentasikan ke bentuk Hex (4 bytes) : 00000000

  • Menambahkan 4 bytes hash code type 01000000


◉ Menyusun keseluruhan string sesuai dengan urutannya, dan ini masih merupakan Raw Data Temporary

Code: (Raw Data Temporary)
020000000193d71a4af8bed0d60940d3062ac4a07bc06e9b5d86bc92ed80c70bb8bd95fae9010000001976a914df40f4f3462b1e69902f921405e8f2e3bb12005888acfdffffff0135820000000000001976a914b5202c46e31f0627702e57a6640545b5048e2c3788ac0000000001000000
Note : Untuk Hex String "ScriptSig Size" dan "ScriptSig" pada akhirnya akan diganti dengan data sesungguhnya



◉ Melakukan Hash Function Double-Sha256 pada Raw Data Temporary, agar didapatkan TXID Temporary

Untuk melakukan Double-Sha256 bisa menggunakan bantuan Python atau melalui situs ini https://www.btcschools.net/bitcoin/bitcoin_tool_sha256d.php

Didapatkan hasil sebagai berikut:
Code: (TXID_Temporary)
3b421d80de033cceb6063aaa02ee57bedf208d8c359af79ac4188f6b11fb1707


◉ Mendapatkan Private Key dalam format HEX

Pertama-tama harus diketahui terlebih dahulu WIF Private Key dari address pengirim, lalu untuk mengkonversinya ke bentuk HEX Private key bisa dengan menggunakan node.js (JavaScript runtime environment)
Code:
# Pertama-tama install JavaScript component yang dibutuhkan
npm i --save coinkey
npm install --save coininfo

Lalu eksekusi script dibawah ini
Code:
var CoinKey = require('coinkey')
var ci = require('coininfo')
var ck = CoinKey.fromWif('WIF Private Key dari address pengirim')
console.log(ck.privateKey.toString('hex'))
Hasil langsung dalam bentuk HEX Private Key 6d60xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbc541


Bisa juga dengan menggunakan Python untuk mendapatkan Base85 decode dari WIF Private Key
Code:
#import module yang diperlukan
import base58
import codecs
import binascii
import ecdsa

WIF_PK = "WIF Private Key dari address pengirim"
WIF_decode = base58.b58decode(WIF_private_key)
Prefix_PK_Ext_Checksum = binascii.hexlify(privkey_decode)
print(Prefix_PK_Ext_Checksum)
Misal didapatkan hasil : ef6d60xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbc54101907ef624
Menghilangkan Prefix, Byte Extension, dan Checksum pada Hex string yang didapatkan
ef6d60xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbc54101907ef624
Prefix : ef, Byte Extension : 01, Checksum : 907ef624
Private Key Hex : 6d60xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbc541


◉ Mendapatkan Signature dari TXID Temporary menggunakan Hex Private Key dengan bantuan Python

Code:
# Terlebih dahulu import module yang diperlukan
import bitcoinlib
from bitcoinlib.keys import HDKey, Key, deserialize_address, Address, sign, verify, Signature

HEX_PrivKey = HDKey('6d60xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbc541')
TX_Temp = '3b421d80de033cceb6063aaa02ee57bedf208d8c359af79ac4188f6b11fb1707'
signature = sign(TX_Temp, HEX_PrivKey)
signature.as_der_encoded().hex()

Didapatkan Signature sebagai berikut
Code:
3044022054550fc989e605f8503b5187ebd94264248a9553f1286ac58392d534c465399c02205874ad736f1795fa35824f800af16f0ed386f31eea3692a0efb5897da8d3f49d01


◉ Mendapatkan (Compressed) Public Key dari address pengirim menggunakan Private Key terkait

Untuk mengetahui (Compressed) Public Key bisa menggunakan Python atau melalui situs https://allprivatekeys.com/private-key-to-public-key (putuskan sambungan internet terlebih dahulu)
 
Didapatkan (Compressed) Public Key sebagai berikut
Code:
03c7e7464c6445ea798683ad4ac5709994e3032be75b92c34fd1b798653d4c6521


◉ Menentukan ScriptSig dan ScriptSig size yang sesungguhnya berdasarkan data Signature dan Public Key yang didapatkan

P2PKH scriptSig : <sig> <pubKey>
<sig> : [Signature_length] [Signature]
<sig> : 47 3044022054550fc989e605f8503b5187ebd94264248a9553f1286ac58392d534c465399c0220587 4ad736f1795fa35824f800af16f0ed386f31eea3692a0efb5897da8d3f49d01
<pubKey> : [Public_Key_length] [Public_Key]
<pubKey> : 21 03c7e7464c6445ea798683ad4ac5709994e3032be75b92c34fd1b798653d4c6521

ScriptSig :
Code:
473044022054550fc989e605f8503b5187ebd94264248a9553f1286ac58392d534c465399c02205874ad736f1795fa35824f800af16f0ed386f31eea3692a0efb5897da8d3f49d012103c7e7464c6445ea798683ad4ac5709994e3032be75b92c34fd1b798653d4c6521
ScriptSig Size :
Code:
6a (106 bytes)


◉ Mengganti ScriptSig dan ScriptSig size pada Raw Data Temporary dengan ScriptSig dan ScriptSig size yang sesungguhnya

Diketahui Raw Data Temporary :
020000000193d71a4af8bed0d60940d3062ac4a07bc06e9b5d86bc92ed80c70bb8bd95fae901000 0001976a914df40f4f3462b1e69902f921405e8f2e3bb12005888acfdffffff0135820000000000001976a914b5202c46e31f0627702e57a6640545b5048e2c3788ac0 000000001000000

ScriptSig size 19 diganti dengan 6a
ScriptSig 76a914df40f4f3462b1e69902f921405e8f2e3bb12005888ac diganti dengan 473044022054550fc989e605f8503b5187ebd94264248a9553f1286ac58392d534c465399c02205 874ad736f1795fa35824f800af16f0ed386f31eea3692a0efb5897da8d3f49d012103c7e7464c64 45ea798683ad4ac5709994e3032be75b92c34fd1b798653d4c6521

Hasil :
Code: (Final_Transaction_Hex)
020000000193d71a4af8bed0d60940d3062ac4a07bc06e9b5d86bc92ed80c70bb8bd95fae9010000006a473044022054550fc989e605f8503b5187ebd94264248a9553f1286ac58392d534c465399c02205874ad736f1795fa35824f800af16f0ed386f31eea3692a0efb5897da8d3f49d012103c7e7464c6445ea798683ad4ac5709994e3032be75b92c34fd1b798653d4c6521fdffffff0135820000000000001976a914b5202c46e31f0627702e57a6640545b5048e2c3788ac0000000001000000


◉ Broadcast Transaksi


TXID 1cc6c89da80169810eb6270fe308c91a323a296dbf8cceb14652fb66681bd933


* Untuk mendapatkan Private Key dalam format HEX dan ECDSA Signature sebenarnya bisa dilakukan menggunakan Tools Online, namun itu pastinya akan meng-ekspos Private Key pengguna karena harus dilakukan secara online (harus ada sambungan internet)