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

● Membuat sebuah Block (Simulasi)



Mendapatkan Block Template

Dengan perintah getblocktemplate yang dijalankan di Bitcoin Core, maka akan didapatkan hasil sebagai berikut :
Code:

  "version": 2,
  "previousblockhash": "000000000000026188bd555cc63526a178b203bb25089c92cfec223d80cae879",
  "transactions":   
[{ "hash":"294dda278712c92a93a66a808d2dd165fcd1e594122d1276421a4236f882fd81",
   "depends":[],
   "fee":200000,
   "sigops":8 },
{ "hash":"3a48e391e3ef9725947ca1c5973b602e3ca51e127621a65f43b2cb0455d4e061",
   "depends":[],
   "fee":0,
   "sigops":8 },
{ "hash":"e6c846ba5f855e8d8e6c96051b13cf38cec074cf55c6bd913c4a9322302168c4",
   "depends":[],
   "fee":10000,
   "sigops":8 }],
  "coinbaseaux":{"flags":""},
  "coinbasevalue":2500210000,
  "target":"00000000000002816e0000000000000000000000000000000000000000000000",
  "mintime":1364232079,
  "noncerange":"00000000ffffffff",
  "sigoplimit":20000,
  "sizelimit":1000000,
  "curtime":1364235874,
  "bits":"1a02816e",
  "height":227988



Membuat Coinbase Transaction

  • Input pada Coinbase transaction tidak boleh lebih dari 1
  • Hash dari transaksi yang direferensikan adalah bentuk 32 bytes dari 0x00
  • Index dari transaksi yang direferensikan adalah ffffffff
  • Scriptsig merupakan susunan byte dan tidak harus merupakan valid script seperti pada Transaksi non-Coinbase
  • Scriptsig harus diawali dengan OP_PUSHBYTES dari HEX yang merupakan representasi "Block Height" dalam format Little-Endian

Struktur dari Coinbase Transaction
Version >> Input Count >> Inputs (TXID > Index UTXO > Scriptsig Size > Scriptsig > Sequence) >> Output Count >> Outputs (Value > ScriptPubKey Size > ScriptPubKey) >> Locktime

Version = 1 = 00000001 = 01000000 (4 bytes little-endian)
Input Count = 1 = 01 (1 byte big-endian)
Input TXID = 0000000000000000000000000000000000000000000000000000000000000000 (32 bytes little-endian)
Index UTXO = ffffffff (4 bytes little-endian)
Scriptsig Size = 0e (14 bytes ukuran Scriptsig)
Scriptsig = OP_PUSHBYTES_3 diikuti dengan 947a03 (Hex dari Block height 227988 dalam format little-endian), lalu ditambahkan Hex (data) OP_PUSHBYTES_2 fc0a dan OP_PUSHBYTES_6 2f503253482f
Code:
Scriptsig = OP_PUSHBYTES_3 947a03 OP_PUSHBYTES_2 fc0a OP_PUSHBYTES_6 2f503253482f
Scriptsig = 03947a0302fc0a062f503253482f
Sequence = ffffffff
Output Count = 1 = 01 (1 byte big-endian)
Output Value = 502d069500000000 (8 bytes Hex little-endian yang merepresentasikan coinbasevalue : 2500210000 satoshis)
ScriptPubKey Size = 23 (35 bytes ukuran ScriptPubKey)
ScriptPubKey = OP_PUSHBYTES PubKey OP_CHECKSIG
Code:
ScriptPubKey = OP_PUSHBYTES_33 03e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67 OP_CHECKSIG
ScriptPubKey = 2103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac
Locktime = 00000000

Hex Array
Code:
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000

Hash Sha256D (Double-Sha256)
Code:
d93de13f941bce3ad4edc68386db523ca6da029f67f865fa615ccd47c7524c5f

Coinbase TXID (Big-Endian)
Code:
5f4c52c747cd5c61fa65f8679f02daa63c52db8683c6edd43ace1b943fe13dd9



Membuat Merkle Root

Untuk mencari Hash Merkle Tree ketentuannya adalah sebagai berikut :

  • Merubah masing-masing Hash transaksi dalam format Little-Endian
  • Memasangkan setiap 2 transaksi lalu dilakukan hash function Double-Sha256, dan dilakukan secara continue sampai didapatkan hash tunggal
  • Transaksi Coinbase harus selalu di urutan pertama
  • Jika pada prosesnya ditemukan transaksi yang tidak mendapatkan pasangan, maka akan dipasangkan dengan hash dari transaksi itu sendiri

Diketahui :
ListHashLittle-Endian
TXID_0 (Coinbase)5f4c52c747cd5c61fa65f8679f02daa63c52db8683c6edd43ace1b943fe13dd9d93de13f941bce3ad4edc68386db523ca6da029f67f865fa615ccd47c7524c5f
TXID_1294dda278712c92a93a66a808d2dd165fcd1e594122d1276421a4236f882fd8181fd82f836421a4276122d1294e5d1fc65d12d8d806aa6932ac9128727da4d29
TXID_2294dda278712c92a93a66a808d2dd165fcd1e594122d1276421a4236f882fd8161e0d45504cbb2435fa62176121ea53c2e603b97c5a17c942597efe391e3483a
TXID_3e6c846ba5f855e8d8e6c96051b13cf38cec074cf55c6bd913c4a9322302168c4c468213022934a3c91bdc655cf74c0ce38cf131b05966c8e8d5e855fba46c8e6


Konsep dari Merkle Root



Untuk mencari Hash Merkle Root bisa dengan menggunakan program Python

Code:
import hashlib
from hashlib import sha256
import binascii
from binascii import unhexlify, hexlify

Code:
TXID_0 = bytes.fromhex('d93de13f941bce3ad4edc68386db523ca6da029f67f865fa615ccd47c7524c5f')
TXID_1 = bytes.fromhex('81fd82f836421a4276122d1294e5d1fc65d12d8d806aa6932ac9128727da4d29')
TXID_2 = bytes.fromhex('61e0d45504cbb2435fa62176121ea53c2e603b97c5a17c942597efe391e3483a')
TXID_3 = bytes.fromhex('c468213022934a3c91bdc655cf74c0ce38cf131b05966c8e8d5e855fba46c8e6')
Double_Sha256_0_1 = hashlib.sha256(hashlib.sha256(TXID_0 + TXID_1).digest()).digest()
Hash_0_1 = hexlify(Double_Sha256_0_1).decode("utf-8")
Double_Sha256_2_3 = hashlib.sha256(hashlib.sha256(TXID_2 + TXID_3).digest()).digest()
Hash_2_3 = hexlify(Double_Sha256_2_3).decode("utf-8")
Hash_4 = bytes.fromhex(Hash_0_1)
Hash_5 = bytes.fromhex(Hash_2_3)
Double_Sha256_4_5 = hashlib.sha256(hashlib.sha256(Hash_4 + Hash_5).digest()).digest()
Merkle_Root = hexlify(Double_Sha256_4_5).decode("utf-8")
print(Merkle_Root)

Hash Merkle Root
Code:
414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8



Membuat Block Header

Menyusun Blockheader dengan urutan : version >> previousblockhash >> merkleroot >> time >> bits >> nonce
* Hex String dalam format Little Endian

version0000000202000000
previousblockhash000000000000026188bd555cc63526a178b203bb25089c92cfec223d80cae87979e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000
merklerootc8adb3649e00341e1a4c5246f3ae2e56beed4b9c8dee06df7e718844aab14e41414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8
time136423587462965051
bits1a02816e6e81021a
nonce00000000 - ffffffff00000000 - ffffffff


◉ Untuk implementasi menggunakan program python dan untuk simulasi pertama digunakan nonce awal 00000000

Code:
version = '02000000'
prevhash = '79e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000'
merkleroot = '414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8'
time = '62965051'
bits = '6e81021a'
nonce = '00000000'
target = '00000000000002816e0000000000000000000000000000000000000000000000'
header_hex = (version + prevhash + merkleroot + time + bits + nonce)
header_bin = unhexlify(header_hex)
header = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
hash = hexlify(header[::-1]).decode("utf-8")
print(hash)
if not target >= hash:
    print('invalid')
else:
    print('valid')

Hash
Code:
3cefb1c47dec281f17f0e058f708fe63ac33f4bbde0f24c82da35a07031b95d8

Status
Code:
invalid

◉ Simulasi kedua menggunakan nonce terakhir ffffffff

Code:
version = '02000000'
prevhash = '79e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000'
merkleroot = '414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8'
time = '62965051'
bits = '6e81021a'
nonce = 'ffffffff'
target = '00000000000002816e0000000000000000000000000000000000000000000000'
header_hex = (version + prevhash + merkleroot + time + bits + nonce)
header_bin = unhexlify(header_hex)
header = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
hash = hexlify(header[::-1]).decode("utf-8")
print(hash)
if not target >= hash:
    print('invalid')
else:
    print('valid')

Hash
Code:
0ddb50880c8f9ae61ba9847ed6afb386f9be9f200d7a156276414378ec92f6cb

Status
Code:
invalid

◉ Untuk seterusnya dilakukan hashing dengan cara meningkatkan nilai nonce berdasarkan range-nonce yang diijinkan sampai didapatkan Hash yang memenuhi kriteria Target (Hash <= Target)

◉ Simulasi terakhir menggunakan valid nonce 00c760f8

Code:
version = '02000000'
prevhash = '79e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000'
merkleroot = '414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8'
time = '62965051'
bits = '6e81021a'
nonce = '00c760f8'
target = '00000000000002816e0000000000000000000000000000000000000000000000'
header_hex = (version + prevhash + merkleroot + time + bits + nonce)
header_bin = unhexlify(header_hex)
header = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
hash = hexlify(header[::-1]).decode("utf-8")
print(hash)
if not target >= hash:
    print('invalid')
else:
    print('valid')

Hash
Code:
0000000000000151e2b1184704de6a16d326d9d3bdb9118d2c8f7756c7aa124c

Status
Code:
Valid



Submit Kandidat Block ke Jaringan Bitcoin

Dengan menggunakan argumen submitblock "hexdata"

hexdata merupakan hex-encoded dari Serialized Blocks

Serialized Blocks
Jumlah BytesDataTipe DataKeterangan
80Block Headerblock_headerBlock Header dalam format RAW
Bervariasitxn_countcompactSize uintTotal jumlah transaksi yang berada didalam Block
BervariasitxnsRAW TransactionSetiap transaksi yang berada didalam Block (disusun berurutan) dalam format RAW Transaction

RAW Block Header
Code:
0200000079e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8629650516e81021a00c760f8

txn_count
Code:
04

◉ Untuk mendapatkan txns, sebelumnya harus diketahui dulu RAW Transaction dari masing-masing transaksi

RAW Coinbase Transaction
Code:
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000

RAW TX_1
Code:
010000000248ef559b0cd287ac51435d457c4f3ad638f9561fa4387bbef0cb90d70259f498000000008a473044022052cf64f2b8f217c815548411fba0ceff10ba1a06854b066b238ef63f6508694902205032f80b1ae7188a7dfc5dc6b5d9400c41df1cc66c331e9de40bd5646786ab80014104960bbf2c298c6f8d341f7ccbad48756bcc1bf717620d885050ecf2fd12ab81ab71ea46cd5bbb86503719c809012cb979bb9601c432d46b8d7dfa0354b9277726ffffffffba314921146eb40aff671dd1e622c400e7d5e38246461b1696c93478cd77b9ed010000008b4830450221008713acb8a82ce43e4acfc932b6400c29a2e0fb56c4b866fc4296325c81cfe65202207569cbfb1897f1dca0599c644139e5f4887d475806519c8e66421f9ea3a115dc014104ba47a0c0579d5dd441552922c3c806953f5da17046a3494373b6bd38dc4bc021f1e0915debd75f6aede9ebb34059ea7b40b72ea8fdbee0b6dfa35e6c288f218cffffffff0200879465010000001976a914242ee683871a2298dbc890a4f6bbb190b0e4f29488ac00d6117e030000001976a9145d0ceb04425118b6bbdde2a0d8df11057a89b7cb88ac00000000

RAW TX_2
Code:
01000000026a5143a8df57ae25c74c8242627025866a116562ea7d800ff5d39f8fea9f1ba4010000008b483045022069a38e18ad17c3eb2d07fc7c3eb81d307aa5c58a72ca085951c8a8b97599e251022100e3f91205232236706118b535a7578c1181174f83e2bca6494c4ccc45f9e0a5320141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff5258d8ffef4b3f172c7f5ce4fc39cd0f17de1fa68b62e8d1901436615101f754000000008b483045022100b449e9b702f9b02211bfec7a958deead6c2a8e085be2022079aa9a480887799c02201118e691e8eb851d226186cae0c54b0ea351245e1868ed620ac2bd9dc3ed550c0141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff0200603826000000001976a914faa68ff33baa0bd76c468f42dd917f8e0757dcbf88acf0eb1c4b020000001976a914ccddcc49ec4ae6a3964f0b49a9626d27f847b57e88ac00000000

RAW TX_3
Code:
01000000019db0016d576919ae4af4ccefb9417cc5fd932ed0c26f4ea2087f3df2bf1550c6010000008c493046022100948abedc526a24299f6358176f9e0f2e62f544001c8225e330308a8ff091540c022100abfa4d03195941872686995f719be7aed7bb6ee40ca438587e9295c66491deb701410442fa242fc9b4de271bbce69fcc52c3e31d8376bc6d38922c968fbbadf76c20a44fb1dc93faf8c06d57fdc5b33eef7ba7b74be3f6d92a96b9f372c214c9b63ee4ffffffff02ce987a65020000001976a914f4ec962c83ab077b9652d0f2a6ae5900e463fac488ac2415f802000000001976a914e83bb134dc0ec4781f28e7f0b6b8dd99bfd0520688ac00000000

txns
Code:
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000010000000248ef559b0cd287ac51435d457c4f3ad638f9561fa4387bbef0cb90d70259f498000000008a473044022052cf64f2b8f217c815548411fba0ceff10ba1a06854b066b238ef63f6508694902205032f80b1ae7188a7dfc5dc6b5d9400c41df1cc66c331e9de40bd5646786ab80014104960bbf2c298c6f8d341f7ccbad48756bcc1bf717620d885050ecf2fd12ab81ab71ea46cd5bbb86503719c809012cb979bb9601c432d46b8d7dfa0354b9277726ffffffffba314921146eb40aff671dd1e622c400e7d5e38246461b1696c93478cd77b9ed010000008b4830450221008713acb8a82ce43e4acfc932b6400c29a2e0fb56c4b866fc4296325c81cfe65202207569cbfb1897f1dca0599c644139e5f4887d475806519c8e66421f9ea3a115dc014104ba47a0c0579d5dd441552922c3c806953f5da17046a3494373b6bd38dc4bc021f1e0915debd75f6aede9ebb34059ea7b40b72ea8fdbee0b6dfa35e6c288f218cffffffff0200879465010000001976a914242ee683871a2298dbc890a4f6bbb190b0e4f29488ac00d6117e030000001976a9145d0ceb04425118b6bbdde2a0d8df11057a89b7cb88ac0000000001000000026a5143a8df57ae25c74c8242627025866a116562ea7d800ff5d39f8fea9f1ba4010000008b483045022069a38e18ad17c3eb2d07fc7c3eb81d307aa5c58a72ca085951c8a8b97599e251022100e3f91205232236706118b535a7578c1181174f83e2bca6494c4ccc45f9e0a5320141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff5258d8ffef4b3f172c7f5ce4fc39cd0f17de1fa68b62e8d1901436615101f754000000008b483045022100b449e9b702f9b02211bfec7a958deead6c2a8e085be2022079aa9a480887799c02201118e691e8eb851d226186cae0c54b0ea351245e1868ed620ac2bd9dc3ed550c0141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff0200603826000000001976a914faa68ff33baa0bd76c468f42dd917f8e0757dcbf88acf0eb1c4b020000001976a914ccddcc49ec4ae6a3964f0b49a9626d27f847b57e88ac0000000001000000019db0016d576919ae4af4ccefb9417cc5fd932ed0c26f4ea2087f3df2bf1550c6010000008c493046022100948abedc526a24299f6358176f9e0f2e62f544001c8225e330308a8ff091540c022100abfa4d03195941872686995f719be7aed7bb6ee40ca438587e9295c66491deb701410442fa242fc9b4de271bbce69fcc52c3e31d8376bc6d38922c968fbbadf76c20a44fb1dc93faf8c06d57fdc5b33eef7ba7b74be3f6d92a96b9f372c214c9b63ee4ffffffff02ce987a65020000001976a914f4ec962c83ab077b9652d0f2a6ae5900e463fac488ac2415f802000000001976a914e83bb134dc0ec4781f28e7f0b6b8dd99bfd0520688ac00000000

hexdata (Serialized Blocks)
[RAW Block Header] [txn_count] [txns]
Code:
0200000079e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8629650516e81021a00c760f80401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000010000000248ef559b0cd287ac51435d457c4f3ad638f9561fa4387bbef0cb90d70259f498000000008a473044022052cf64f2b8f217c815548411fba0ceff10ba1a06854b066b238ef63f6508694902205032f80b1ae7188a7dfc5dc6b5d9400c41df1cc66c331e9de40bd5646786ab80014104960bbf2c298c6f8d341f7ccbad48756bcc1bf717620d885050ecf2fd12ab81ab71ea46cd5bbb86503719c809012cb979bb9601c432d46b8d7dfa0354b9277726ffffffffba314921146eb40aff671dd1e622c400e7d5e38246461b1696c93478cd77b9ed010000008b4830450221008713acb8a82ce43e4acfc932b6400c29a2e0fb56c4b866fc4296325c81cfe65202207569cbfb1897f1dca0599c644139e5f4887d475806519c8e66421f9ea3a115dc014104ba47a0c0579d5dd441552922c3c806953f5da17046a3494373b6bd38dc4bc021f1e0915debd75f6aede9ebb34059ea7b40b72ea8fdbee0b6dfa35e6c288f218cffffffff0200879465010000001976a914242ee683871a2298dbc890a4f6bbb190b0e4f29488ac00d6117e030000001976a9145d0ceb04425118b6bbdde2a0d8df11057a89b7cb88ac0000000001000000026a5143a8df57ae25c74c8242627025866a116562ea7d800ff5d39f8fea9f1ba4010000008b483045022069a38e18ad17c3eb2d07fc7c3eb81d307aa5c58a72ca085951c8a8b97599e251022100e3f91205232236706118b535a7578c1181174f83e2bca6494c4ccc45f9e0a5320141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff5258d8ffef4b3f172c7f5ce4fc39cd0f17de1fa68b62e8d1901436615101f754000000008b483045022100b449e9b702f9b02211bfec7a958deead6c2a8e085be2022079aa9a480887799c02201118e691e8eb851d226186cae0c54b0ea351245e1868ed620ac2bd9dc3ed550c0141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff0200603826000000001976a914faa68ff33baa0bd76c468f42dd917f8e0757dcbf88acf0eb1c4b020000001976a914ccddcc49ec4ae6a3964f0b49a9626d27f847b57e88ac0000000001000000019db0016d576919ae4af4ccefb9417cc5fd932ed0c26f4ea2087f3df2bf1550c6010000008c493046022100948abedc526a24299f6358176f9e0f2e62f544001c8225e330308a8ff091540c022100abfa4d03195941872686995f719be7aed7bb6ee40ca438587e9295c66491deb701410442fa242fc9b4de271bbce69fcc52c3e31d8376bc6d38922c968fbbadf76c20a44fb1dc93faf8c06d57fdc5b33eef7ba7b74be3f6d92a96b9f372c214c9b63ee4ffffffff02ce987a65020000001976a914f4ec962c83ab077b9652d0f2a6ae5900e463fac488ac2415f802000000001976a914e83bb134dc0ec4781f28e7f0b6b8dd99bfd0520688ac00000000

submitblock "hexdata"

Jika hasilnya
Code:
null
Berarti Kandidat Block telah divalidasi oleh node-node lainnya (dianggap valid) dan ditambahkan ke jaringan Blockchain Bitcoin