● Membuat sebuah Block (Simulasi)
◉ Mendapatkan Block TemplateDengan perintah
getblocktemplate yang dijalankan di Bitcoin Core, maka akan didapatkan hasil sebagai berikut :
"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 TransactionVersion >> 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
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
ScriptPubKey = OP_PUSHBYTES_33 03e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67 OP_CHECKSIG
ScriptPubKey = 2103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac
Locktime = 00000000
Hex Array01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000
Hash Sha256D (Double-Sha256)d93de13f941bce3ad4edc68386db523ca6da029f67f865fa615ccd47c7524c5f
Coinbase TXID (Big-Endian)5f4c52c747cd5c61fa65f8679f02daa63c52db8683c6edd43ace1b943fe13dd9
◉ Membuat Merkle RootUntuk 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 :
| List | | Hash | | | Little-Endian |
| TXID_0 (Coinbase) | | 5f4c52c747cd5c61fa65f8679f02daa63c52db8683c6edd43ace1b943fe13dd9 | | | d93de13f941bce3ad4edc68386db523ca6da029f67f865fa615ccd47c7524c5f |
| TXID_1 | | 294dda278712c92a93a66a808d2dd165fcd1e594122d1276421a4236f882fd81 | | | 81fd82f836421a4276122d1294e5d1fc65d12d8d806aa6932ac9128727da4d29 |
| TXID_2 | | 294dda278712c92a93a66a808d2dd165fcd1e594122d1276421a4236f882fd81 | | | 61e0d45504cbb2435fa62176121ea53c2e603b97c5a17c942597efe391e3483a |
| TXID_3 | | e6c846ba5f855e8d8e6c96051b13cf38cec074cf55c6bd913c4a9322302168c4 | | | c468213022934a3c91bdc655cf74c0ce38cf131b05966c8e8d5e855fba46c8e6 |
Konsep dari Merkle Root
Untuk mencari Hash Merkle Root bisa dengan menggunakan program Python
import hashlib
from hashlib import sha256
import binascii
from binascii import unhexlify, hexlify
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 Root414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8
◉ Membuat Block HeaderMenyusun Blockheader dengan urutan : version >> previousblockhash >> merkleroot >> time >> bits >> nonce
* Hex String dalam format Little Endian | version | | 00000002 | | | 02000000 |
| previousblockhash | | 000000000000026188bd555cc63526a178b203bb25089c92cfec223d80cae879 | | | 79e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000 |
| merkleroot | | c8adb3649e00341e1a4c5246f3ae2e56beed4b9c8dee06df7e718844aab14e41 | | | 414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8 |
| time | | 1364235874 | | | 62965051 |
| bits | | 1a02816e | | | 6e81021a |
| nonce | | 00000000 - ffffffff | | | 00000000 - ffffffff |
◉ Untuk implementasi menggunakan program python dan untuk simulasi pertama digunakan nonce awal 00000000
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
3cefb1c47dec281f17f0e058f708fe63ac33f4bbde0f24c82da35a07031b95d8
Status
invalid
◉ Simulasi kedua menggunakan nonce terakhir ffffffff
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
0ddb50880c8f9ae61ba9847ed6afb386f9be9f200d7a156276414378ec92f6cb
Status
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
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
0000000000000151e2b1184704de6a16d326d9d3bdb9118d2c8f7756c7aa124c
Status
Valid
◉ Submit Kandidat Block ke Jaringan BitcoinDengan menggunakan argumen
submitblock "hexdata"hexdata merupakan hex-encoded dari Serialized Blocks
Serialized Blocks | Jumlah Bytes | | Data | | | Tipe Data | | | Keterangan |
| 80 | | Block Header | | | block_header | | | Block Header dalam format RAW |
| Bervariasi | | txn_count | | | compactSize uint | | | Total jumlah transaksi yang berada didalam Block |
| Bervariasi | | txns | | | RAW Transaction | | | Setiap transaksi yang berada didalam Block (disusun berurutan) dalam format RAW Transaction |
◉
RAW Block Header0200000079e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8629650516e81021a00c760f8
◉
txn_count04
◉ Untuk mendapatkan
txns, sebelumnya harus diketahui dulu RAW Transaction dari masing-masing transaksi
RAW Coinbase Transaction
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000
RAW TX_1
010000000248ef559b0cd287ac51435d457c4f3ad638f9561fa4387bbef0cb90d70259f498000000008a473044022052cf64f2b8f217c815548411fba0ceff10ba1a06854b066b238ef63f6508694902205032f80b1ae7188a7dfc5dc6b5d9400c41df1cc66c331e9de40bd5646786ab80014104960bbf2c298c6f8d341f7ccbad48756bcc1bf717620d885050ecf2fd12ab81ab71ea46cd5bbb86503719c809012cb979bb9601c432d46b8d7dfa0354b9277726ffffffffba314921146eb40aff671dd1e622c400e7d5e38246461b1696c93478cd77b9ed010000008b4830450221008713acb8a82ce43e4acfc932b6400c29a2e0fb56c4b866fc4296325c81cfe65202207569cbfb1897f1dca0599c644139e5f4887d475806519c8e66421f9ea3a115dc014104ba47a0c0579d5dd441552922c3c806953f5da17046a3494373b6bd38dc4bc021f1e0915debd75f6aede9ebb34059ea7b40b72ea8fdbee0b6dfa35e6c288f218cffffffff0200879465010000001976a914242ee683871a2298dbc890a4f6bbb190b0e4f29488ac00d6117e030000001976a9145d0ceb04425118b6bbdde2a0d8df11057a89b7cb88ac00000000
RAW TX_2
01000000026a5143a8df57ae25c74c8242627025866a116562ea7d800ff5d39f8fea9f1ba4010000008b483045022069a38e18ad17c3eb2d07fc7c3eb81d307aa5c58a72ca085951c8a8b97599e251022100e3f91205232236706118b535a7578c1181174f83e2bca6494c4ccc45f9e0a5320141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff5258d8ffef4b3f172c7f5ce4fc39cd0f17de1fa68b62e8d1901436615101f754000000008b483045022100b449e9b702f9b02211bfec7a958deead6c2a8e085be2022079aa9a480887799c02201118e691e8eb851d226186cae0c54b0ea351245e1868ed620ac2bd9dc3ed550c0141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff0200603826000000001976a914faa68ff33baa0bd76c468f42dd917f8e0757dcbf88acf0eb1c4b020000001976a914ccddcc49ec4ae6a3964f0b49a9626d27f847b57e88ac00000000
RAW TX_3
01000000019db0016d576919ae4af4ccefb9417cc5fd932ed0c26f4ea2087f3df2bf1550c6010000008c493046022100948abedc526a24299f6358176f9e0f2e62f544001c8225e330308a8ff091540c022100abfa4d03195941872686995f719be7aed7bb6ee40ca438587e9295c66491deb701410442fa242fc9b4de271bbce69fcc52c3e31d8376bc6d38922c968fbbadf76c20a44fb1dc93faf8c06d57fdc5b33eef7ba7b74be3f6d92a96b9f372c214c9b63ee4ffffffff02ce987a65020000001976a914f4ec962c83ab077b9652d0f2a6ae5900e463fac488ac2415f802000000001976a914e83bb134dc0ec4781f28e7f0b6b8dd99bfd0520688ac00000000
txns01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000010000000248ef559b0cd287ac51435d457c4f3ad638f9561fa4387bbef0cb90d70259f498000000008a473044022052cf64f2b8f217c815548411fba0ceff10ba1a06854b066b238ef63f6508694902205032f80b1ae7188a7dfc5dc6b5d9400c41df1cc66c331e9de40bd5646786ab80014104960bbf2c298c6f8d341f7ccbad48756bcc1bf717620d885050ecf2fd12ab81ab71ea46cd5bbb86503719c809012cb979bb9601c432d46b8d7dfa0354b9277726ffffffffba314921146eb40aff671dd1e622c400e7d5e38246461b1696c93478cd77b9ed010000008b4830450221008713acb8a82ce43e4acfc932b6400c29a2e0fb56c4b866fc4296325c81cfe65202207569cbfb1897f1dca0599c644139e5f4887d475806519c8e66421f9ea3a115dc014104ba47a0c0579d5dd441552922c3c806953f5da17046a3494373b6bd38dc4bc021f1e0915debd75f6aede9ebb34059ea7b40b72ea8fdbee0b6dfa35e6c288f218cffffffff0200879465010000001976a914242ee683871a2298dbc890a4f6bbb190b0e4f29488ac00d6117e030000001976a9145d0ceb04425118b6bbdde2a0d8df11057a89b7cb88ac0000000001000000026a5143a8df57ae25c74c8242627025866a116562ea7d800ff5d39f8fea9f1ba4010000008b483045022069a38e18ad17c3eb2d07fc7c3eb81d307aa5c58a72ca085951c8a8b97599e251022100e3f91205232236706118b535a7578c1181174f83e2bca6494c4ccc45f9e0a5320141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff5258d8ffef4b3f172c7f5ce4fc39cd0f17de1fa68b62e8d1901436615101f754000000008b483045022100b449e9b702f9b02211bfec7a958deead6c2a8e085be2022079aa9a480887799c02201118e691e8eb851d226186cae0c54b0ea351245e1868ed620ac2bd9dc3ed550c0141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff0200603826000000001976a914faa68ff33baa0bd76c468f42dd917f8e0757dcbf88acf0eb1c4b020000001976a914ccddcc49ec4ae6a3964f0b49a9626d27f847b57e88ac0000000001000000019db0016d576919ae4af4ccefb9417cc5fd932ed0c26f4ea2087f3df2bf1550c6010000008c493046022100948abedc526a24299f6358176f9e0f2e62f544001c8225e330308a8ff091540c022100abfa4d03195941872686995f719be7aed7bb6ee40ca438587e9295c66491deb701410442fa242fc9b4de271bbce69fcc52c3e31d8376bc6d38922c968fbbadf76c20a44fb1dc93faf8c06d57fdc5b33eef7ba7b74be3f6d92a96b9f372c214c9b63ee4ffffffff02ce987a65020000001976a914f4ec962c83ab077b9652d0f2a6ae5900e463fac488ac2415f802000000001976a914e83bb134dc0ec4781f28e7f0b6b8dd99bfd0520688ac00000000
hexdata (Serialized Blocks)[RAW Block Header] [txn_count] [txns]
0200000079e8ca803d22eccf929c0825bb03b278a12635c65c55bd886102000000000000414eb1aa4488717edf06ee8d9c4bedbe562eaef346524c1a1e34009e64b3adc8629650516e81021a00c760f80401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03947a0302fc0a062f503253482fffffffff01502d069500000000232103e1088f81a94a34eed7103b4d45e21d7425b62ebfaf796196fecc89287a442a67ac00000000010000000248ef559b0cd287ac51435d457c4f3ad638f9561fa4387bbef0cb90d70259f498000000008a473044022052cf64f2b8f217c815548411fba0ceff10ba1a06854b066b238ef63f6508694902205032f80b1ae7188a7dfc5dc6b5d9400c41df1cc66c331e9de40bd5646786ab80014104960bbf2c298c6f8d341f7ccbad48756bcc1bf717620d885050ecf2fd12ab81ab71ea46cd5bbb86503719c809012cb979bb9601c432d46b8d7dfa0354b9277726ffffffffba314921146eb40aff671dd1e622c400e7d5e38246461b1696c93478cd77b9ed010000008b4830450221008713acb8a82ce43e4acfc932b6400c29a2e0fb56c4b866fc4296325c81cfe65202207569cbfb1897f1dca0599c644139e5f4887d475806519c8e66421f9ea3a115dc014104ba47a0c0579d5dd441552922c3c806953f5da17046a3494373b6bd38dc4bc021f1e0915debd75f6aede9ebb34059ea7b40b72ea8fdbee0b6dfa35e6c288f218cffffffff0200879465010000001976a914242ee683871a2298dbc890a4f6bbb190b0e4f29488ac00d6117e030000001976a9145d0ceb04425118b6bbdde2a0d8df11057a89b7cb88ac0000000001000000026a5143a8df57ae25c74c8242627025866a116562ea7d800ff5d39f8fea9f1ba4010000008b483045022069a38e18ad17c3eb2d07fc7c3eb81d307aa5c58a72ca085951c8a8b97599e251022100e3f91205232236706118b535a7578c1181174f83e2bca6494c4ccc45f9e0a5320141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff5258d8ffef4b3f172c7f5ce4fc39cd0f17de1fa68b62e8d1901436615101f754000000008b483045022100b449e9b702f9b02211bfec7a958deead6c2a8e085be2022079aa9a480887799c02201118e691e8eb851d226186cae0c54b0ea351245e1868ed620ac2bd9dc3ed550c0141049881d648d4a8deefbec452f82921bb49a3a86403a749737d41fa7ebb6d6d692eaf0aa2641d62e53d3c500a16492bc059acec51c2fb1f7a06b28576d266f9e04effffffff0200603826000000001976a914faa68ff33baa0bd76c468f42dd917f8e0757dcbf88acf0eb1c4b020000001976a914ccddcc49ec4ae6a3964f0b49a9626d27f847b57e88ac0000000001000000019db0016d576919ae4af4ccefb9417cc5fd932ed0c26f4ea2087f3df2bf1550c6010000008c493046022100948abedc526a24299f6358176f9e0f2e62f544001c8225e330308a8ff091540c022100abfa4d03195941872686995f719be7aed7bb6ee40ca438587e9295c66491deb701410442fa242fc9b4de271bbce69fcc52c3e31d8376bc6d38922c968fbbadf76c20a44fb1dc93faf8c06d57fdc5b33eef7ba7b74be3f6d92a96b9f372c214c9b63ee4ffffffff02ce987a65020000001976a914f4ec962c83ab077b9652d0f2a6ae5900e463fac488ac2415f802000000001976a914e83bb134dc0ec4781f28e7f0b6b8dd99bfd0520688ac00000000
submitblock "hexdata"Jika hasilnya
null
Berarti Kandidat Block telah divalidasi oleh node-node lainnya (dianggap valid) dan ditambahkan ke jaringan Blockchain Bitcoin