លំហសិក្សាកម្ពុជា
V1.0
មេរៀនទី ៥ នេះផ្ដោតលើការរចនា Transaction និង Block ដែលជារចនាសម្ព័ន្ធស្នូលរបស់ Blockchain។ នៅមេរៀនមុនៗ និស្សិតបានរៀនពី Python Console Application, Functions, Lists, Dictionaries, CSV File Handling និង SHA-256 Hashing។ មេរៀននេះនឹងភ្ជាប់ចំណេះដឹងទាំងនោះ ដើម្បីបង្កើត Certificate Transaction និង Blockchain Block ដោយប្រើ Python Dictionary។ ក្នុង Project នេះ Transaction មួយតំណាងឱ្យ Certificate Record មួយ ហើយ Block មួយជាក្រុមនៃ Transactions ដែលមាន fields សំខាន់ៗដូចជា index, timestamp, transactions, previous_hash, nonce និង hash។ NIST ពន្យល់ថា Blockchain អាចឱ្យអ្នកប្រើកត់ត្រា Transactions ក្នុង Shared Ledger ហើយ Blocks ត្រូវបានភ្ជាប់គ្នាតាម Cryptographic Hashes ដើម្បីធ្វើឱ្យប្រព័ន្ធមានលក្ខណៈ Tamper-Evident [1]។ Python time module ត្រូវបានប្រើសម្រាប់បង្កើត Timestamp ហើយ Python json module អាចប្រើសម្រាប់បម្លែង Dictionary ទៅជា JSON String មុនធ្វើ Hash [2], [3]។ មេរៀននេះជាមូលដ្ឋានសំខាន់សម្រាប់មេរៀនទី ៦ ដែលនឹងបង្កើត Simple Blockchain ពេញលេញក្នុង Console។
| ចំណុច | ព័ត៌មាន |
|---|---|
| មុខវិជ្ជា | Blockchain Technology Using Python Console and CSV |
| មេរៀន | មេរៀនទី ៥ |
| ចំណងជើង | Transaction and Block Structure |
| ប្រធានបទសំខាន់ | Certificate Transaction, Block Fields, Previous Hash, Block Hash |
| កម្រិតនិស្សិត | Beginner to Intermediate |
| ភាសាសរសេរកម្មវិធី | Python |
| ប្រភេទកម្មវិធី | Console Application |
| Python Modules | time, hashlib, json |
| លទ្ធផលរំពឹងទុក | និស្សិតអាចរចនា Transaction និង Block Structure ដោយប្រើ Python Dictionary |
| ទិសដៅ Project | Console-Based Blockchain Student Certificate Verification System |
បន្ទាប់ពីបញ្ចប់មេរៀននេះ និស្សិតគួរអាច៖
index, timestamp, transactions, previous_hash, nonce និង hash។
time.time() ឬ datetime ដើម្បីបង្កើត Timestamp។
នៅមេរៀនទី ៤ និស្សិតបានរៀនពី Hashing និង Data Integrity។ ឥឡូវនេះ យើងនឹងយក Hashing ទៅប្រើលើ Block។ ដើម្បីបង្កើត Blockchain យើងត្រូវយល់ពីលំដាប់ដូចខាងក្រោម៖
Certificate Record↓Certificate Transaction↓List of Transactions↓Block↓Block Hash↓Previous Hash Link↓Blockchain
ក្នុង Final Project របស់យើង៖

រូបភាពនេះគួរបង្ហាញថា Certificate Transactions ជាច្រើនត្រូវបានបញ្ចូលទៅក្នុង Block មួយ។ Block មួយមិនត្រឹមតែមាន Transactions ប៉ុណ្ណោះទេ ប៉ុន្តែមាន Timestamp, Previous Hash, Nonce និង Current Hash ផងដែរ។ រូបភាពនេះជួយឱ្យនិស្សិតយល់ថា Blockchain ចាប់ផ្ដើមពីការរៀបចំ Transaction ឱ្យបានត្រឹមត្រូវជាមុន។
Transaction គឺជាកំណត់ត្រាទិន្នន័យមួយដែលត្រូវបានបញ្ចូលទៅក្នុង Blockchain។ ក្នុងប្រព័ន្ធ Cryptocurrency Transaction អាចបង្ហាញការផ្ទេរប្រាក់ពីមនុស្សម្នាក់ទៅមនុស្សម្នាក់។ ប៉ុន្តែក្នុង Project Certificate Verification របស់យើង Transaction មួយតំណាងឱ្យ Certificate Record មួយ។
NIST Blockchain Technology Overview ពន្យល់ថា Blockchain អាចកត់ត្រា Transactions ក្នុង Shared Ledger ហើយក្រោមលក្ខខណ្ឌដំណើរការធម្មតា Transaction មិនអាចត្រូវបានផ្លាស់ប្ដូរបានក្រោយពេលបាន Publish ទៅ Ledger [1]។
Certificate Transaction មួយគួរមាន Fields ដូចខាងក្រោម៖
| Field | ការពន្យល់ |
|---|---|
transaction_id | លេខសម្គាល់ Transaction |
certificate_id | លេខសម្គាល់វិញ្ញាបនបត្រ |
student_name | ឈ្មោះនិស្សិត |
program | កម្មវិធីសិក្សា |
certificate_title | ចំណងជើងវិញ្ញាបនបត្រ |
issue_date | ថ្ងៃចេញវិញ្ញាបនបត្រ |
status | Valid, Invalid ឬ Revoked |
certificate_hash | Hash របស់ Certificate Record |
ការបន្ថែម certificate_hash ជួយឱ្យ Transaction មានភស្តុតាងបច្ចេកទេសសម្រាប់ពិនិត្យ Data Integrity។
certificate_transaction = { "transaction_id": "TX-0001", "certificate_id": "CERT-FDE-001", "student_name": "Sok Dara", "program": "Digital Economy", "certificate_title": "Blockchain Technology Completion", "issue_date": "2026-08-25", "status": "Valid", "certificate_hash": "a3f1c6d7e8b9f01a..." } print(certificate_transaction)
Transaction នេះជាកំណត់ត្រាវិញ្ញាបនបត្រមួយដែលត្រូវបានរៀបចំជាទម្រង់ Dictionary។ នៅមេរៀនបន្ទាប់ វានឹងត្រូវបានដាក់ចូលក្នុង Block។

រូបភាពនេះគួរបង្ហាញ Fields សំខាន់ៗរបស់ Certificate Transaction ដូចជា Transaction ID, Certificate ID, Student Name, Program, Certificate Title, Issue Date, Status និង Certificate Hash។ វាជួយឱ្យនិស្សិតយល់ពីទិន្នន័យមួយ Record មុនពេលដាក់ចូល Block។
Block គឺជាក្រុមនៃ Transactions។ Block មួយរក្សាទុក Transactions ជាច្រើន និងព័ត៌មានបច្ចេកទេសដែលត្រូវការសម្រាប់ភ្ជាប់ទៅ Blockchain។ NIST IR 8202 បង្ហាញថា Block ក្នុង Blockchain អាចមាន Transactions ចាប់ពីសូន្យឡើងទៅ ហើយ Blocks ត្រូវបានភ្ជាប់គ្នាតាម Hashes [1]។
ក្នុង Course នេះ Block មួយនឹងមាន៖
Block = Header Information + List of Transactions + Hash
| Field | ការពន្យល់ |
|---|---|
index | លំដាប់លេខរបស់ Block |
timestamp | ពេលវេលាដែល Block ត្រូវបានបង្កើត |
transactions | List នៃ Certificate Transactions |
previous_hash | Hash របស់ Block មុន |
nonce | លេខប្រើសម្រាប់ការសាកល្បង Proof-of-Work នៅមេរៀនក្រោយ |
hash | Hash របស់ Block បច្ចុប្បន្ន |

រូបភាពនេះគួរបង្ហាញរចនាសម្ព័ន្ធ Block មួយដែលមាន Index, Timestamp, Transactions, Previous Hash, Nonce និង Current Hash។ វាជួយឱ្យនិស្សិតមើលឃើញថា Block មិនមែនគ្រាន់តែជាទិន្នន័យធម្មតាទេ ប៉ុន្តែជារចនាសម្ព័ន្ធដែលត្រូវបានរៀបចំសម្រាប់ភ្ជាប់ក្នុង Blockchain។
Timestamp គឺជាពេលវេលាដែលកំណត់ថា Block ត្រូវបានបង្កើតនៅពេលណា។ ក្នុង Python យើងអាចប្រើ time.time() ដើម្បីទទួល Unix timestamp ឬប្រើ datetime.now() ដើម្បីទទួលពេលវេលាដែលមើលងាយ។
Python time module ផ្ដល់ functions ជាច្រើនសម្រាប់ការចូលដំណើរការ និងបម្លែងពេលវេលា [2]។
time.time()import time timestamp = time.time() print("Timestamp:", timestamp)
លទ្ធផលអាចមានទម្រង់ដូចជា៖
Timestamp: 1798185123.245
datetime.now()from datetime import datetime timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print("Timestamp:", timestamp)
លទ្ធផល៖
Timestamp: 2026-08-25 21:30:00
ក្នុង Project សម្រាប់និស្សិត Beginner ប្រើ datetime.now().strftime() អាចងាយអានជាង time.time()។
Previous Hash គឺជា Hash របស់ Block មុន។ វាត្រូវបានរក្សាទុកក្នុង Block ថ្មី ដើម្បីភ្ជាប់ Block ថ្មីទៅ Block មុន។ នេះជាគំនិតសំខាន់បំផុតក្នុង Blockchain។
ឧទាហរណ៍៖
Block 1 Hash = abc123 Block 2 Previous = abc123 Block 2 Hash = def456 Block 3 Previous = def456
បើ Block 1 ត្រូវបានកែប្រែ Hash របស់ Block 1 នឹងផ្លាស់ប្ដូរ ហើយ Block 2 Previous Hash នឹងមិនត្រូវគ្នាទៀត។ នេះជាមូលដ្ឋានសម្រាប់ Tamper Detection។
NIST CSRC glossary ក៏ពន្យល់ថា Block នីមួយៗត្រូវបានភ្ជាប់ទៅ Block មុនតាម Cryptographic Link ដើម្បីធ្វើឱ្យវាមានលក្ខណៈ Tamper-Evident [4]។

រូបភាពនេះគួរបង្ហាញ Block 1, Block 2 និង Block 3 ដែល Block នីមួយៗមាន Current Hash ហើយ Block បន្ទាប់រក្សាទុក Previous Hash របស់ Block មុន។ វាជួយបង្ហាញថា Previous Hash គឺជាខ្សែភ្ជាប់សំខាន់បំផុតក្នុង Blockchain។
Nonce គឺជាលេខមួយដែលអាចត្រូវបានប្តូរដើម្បីបង្កើត Hash ដែលមានលក្ខខណ្ឌជាក់លាក់។ ក្នុង Blockchain ពិតៗ Nonce ត្រូវបានប្រើក្នុង Proof-of-Work។ ក្នុង Course នេះ យើងប្រើ nonce = 0 ជាមូលដ្ឋានសិន ហើយនៅមេរៀនក្រោយអាចបន្តទៅការសាកល្បង Mining ងាយៗ។
ឧទាហរណ៍៖
nonce = 0 print("Nonce:", nonce)
ក្នុង Block Structure យើងរក្សាទុក Nonce ទោះបីមិនទាន់ប្រើ Proof-of-Work ពេញលេញក៏ដោយ ព្រោះវាជាផ្នែកសំខាន់នៃការយល់ពី Blockchain Design។
Block Hash គឺជា Hash ដែលបង្កើតពីទិន្នន័យសំខាន់ៗក្នុង Block។ Block Hash តំណាងឱ្យស្នាមម្រាមដៃឌីជីថលរបស់ Block មួយ។ ប្រសិនបើ Field ណាមួយក្នុង Block ត្រូវបានកែ Hash នឹងផ្លាស់ប្ដូរ។
Block Hash គួរបង្កើតពី Fields ដូចជា៖
index
timestamp
transactions
previous_hash
nonce
ជាធម្មតា យើងមិនបញ្ចូល hash Field ខ្លួនឯងនៅពេលគណនា Hash ទេ ព្រោះវាអាចបង្កើត Circular Problem។
import hashlib import json def generate_hash(data): data_string = json.dumps(data, sort_keys=True) return hashlib.sha256(data_string.encode("utf-8")).hexdigest()
Python json.dumps() អាចបម្លែង Python object ទៅជា JSON formatted string ហើយ sort_keys=True ជួយធ្វើឱ្យ key order មានលំដាប់ថេរ [3]។
បង្កើត Certificate Transaction មួយដោយប្រើ Python Dictionary។
import hashlib import json def generate_hash(data): data_string = json.dumps(data, sort_keys=True) return hashlib.sha256(data_string.encode("utf-8")).hexdigest() certificate_record = { "certificate_id": "CERT-FDE-001", "student_name": "Sok Dara", "program": "Digital Economy", "certificate_title": "Blockchain Technology Completion", "issue_date": "2026-08-25", "status": "Valid" } certificate_hash = generate_hash(certificate_record) transaction = { "transaction_id": "TX-0001", "certificate_id": certificate_record["certificate_id"], "student_name": certificate_record["student_name"], "program": certificate_record["program"], "certificate_title": certificate_record["certificate_title"], "issue_date": certificate_record["issue_date"], "status": certificate_record["status"], "certificate_hash": certificate_hash } print("=== Certificate Transaction ===") print(transaction)
certificate_record រក្សាទុកព័ត៌មានវិញ្ញាបនបត្រ។
certificate_hash ជា Hash របស់ Certificate Record។
transaction ជា Certificate Transaction ដែលមាន Hash ភ្ជាប់ជាមួយ។
បង្កើត Block មួយដែលមាន Transactions និង Block Hash។
from datetime import datetime import hashlib import json def generate_hash(data): data_string = json.dumps(data, sort_keys=True) return hashlib.sha256(data_string.encode("utf-8")).hexdigest() transactions = [ { "transaction_id": "TX-0001", "certificate_id": "CERT-FDE-001", "student_name": "Sok Dara", "program": "Digital Economy", "certificate_title": "Blockchain Technology Completion", "issue_date": "2026-08-25", "status": "Valid", "certificate_hash": "sample_certificate_hash" } ] block = { "index": 1, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "transactions": transactions, "previous_hash": "0", "nonce": 0 } block["hash"] = generate_hash(block) print("=== Block Information ===") print("Index:", block["index"]) print("Timestamp:", block["timestamp"]) print("Previous Hash:", block["previous_hash"]) print("Nonce:", block["nonce"]) print("Hash:", block["hash"]) print("Transactions:", block["transactions"])
Block នេះមាន Transaction មួយ។ previous_hash ត្រូវបានកំណត់ជា "0" ព្រោះនេះជាឧទាហរណ៍ Block ដំបូង។ នៅមេរៀនក្រោយ យើងនឹងបង្កើត Genesis Block និងបន្ថែម Blocks ជាច្រើន។

រូបភាពនេះគួរបង្ហាញ Block មួយដែលមាន Transactions, Timestamp, Previous Hash, Nonce និង Current Hash។ វាជួយឱ្យនិស្សិតយល់ពីទំនាក់ទំនងរវាង Transaction Data និង Block Hash។
បង្កើត Block មួយដែលមាន Certificate Transactions ច្រើន។
from datetime import datetime import hashlib import json def generate_hash(data): data_string = json.dumps(data, sort_keys=True) return hashlib.sha256(data_string.encode("utf-8")).hexdigest() transactions = [ { "transaction_id": "TX-0001", "certificate_id": "CERT-FDE-001", "student_name": "Sok Dara", "program": "Digital Economy", "certificate_title": "Blockchain Technology Completion", "issue_date": "2026-08-25", "status": "Valid", "certificate_hash": "hash_001" }, { "transaction_id": "TX-0002", "certificate_id": "CERT-FDE-002", "student_name": "Chan Vicheka", "program": "Information Technology", "certificate_title": "Python Programming Completion", "issue_date": "2026-08-26", "status": "Valid", "certificate_hash": "hash_002" } ] block = { "index": 1, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "transactions": transactions, "previous_hash": "0", "nonce": 0 } block["hash"] = generate_hash(block) print("=== Block with Multiple Transactions ===") print(block)
Block មួយអាចមាន Transactions ច្រើន។ ក្នុង Project ពិត Group អាចសម្រេចថា Block មួយមាន Transaction មួយ ឬច្រើន។ សម្រាប់អ្នកចាប់ផ្ដើម ប្រើ Block មួយមាន Transactions ច្រើនអាចជួយឱ្យយល់ថា Block គឺជា Container សម្រាប់ Records។
បង្ហាញថា បើ Transaction Data ក្នុង Block ត្រូវបានកែ Block Hash នឹងផ្លាស់ប្តូរ។
import hashlib import json from datetime import datetime def generate_hash(data): data_string = json.dumps(data, sort_keys=True) return hashlib.sha256(data_string.encode("utf-8")).hexdigest() block = { "index": 1, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "transactions": [ { "transaction_id": "TX-0001", "certificate_id": "CERT-FDE-001", "student_name": "Sok Dara", "program": "Digital Economy", "certificate_title": "Blockchain Technology Completion", "issue_date": "2026-08-25", "status": "Valid" } ], "previous_hash": "0", "nonce": 0 } original_hash = generate_hash(block) block["transactions"][0]["student_name"] = "Sok Daraa" changed_hash = generate_hash(block) print("Original Hash:", original_hash) print("Changed Hash :", changed_hash) if original_hash == changed_hash: print("Block data is unchanged.") else: print("Block data has changed.")
កូដនេះបង្ហាញថា បើកែ Student Name ក្នុង Transaction នោះ Block Hash នឹងផ្លាស់ប្តូរ។ នេះជាមូលដ្ឋានសម្រាប់ Blockchain Validation នៅមេរៀនក្រោយ។

រូបភាពនេះគួរបង្ហាញថា ការកែ Transaction Data តូចមួយក្នុង Block នឹងធ្វើឱ្យ Block Hash ផ្លាស់ប្តូរ។ វាជួយបញ្ជាក់ថា Block Hash អាចប្រើសម្រាប់រកឃើញការកែប្រែទិន្នន័យ។
សម្រាប់ Final Project និស្សិតគួរប្រើ Block Structure ដូចខាងក្រោម៖
block = { "index": 1, "timestamp": "2026-08-25 21:30:00", "transactions": [], "previous_hash": "0", "nonce": 0, "hash": "" }
| Field | Required? | Reason |
|---|---|---|
index | Yes | សម្គាល់លំដាប់ Block |
timestamp | Yes | បង្ហាញពេលវេលាបង្កើត Block |
transactions | Yes | រក្សាទុក Certificate Transactions |
previous_hash | Yes | ភ្ជាប់ទៅ Block មុន |
nonce | Yes | ត្រៀមសម្រាប់ Mining / Proof-of-Work |
hash | Yes | សម្គាល់ Block បច្ចុប្បន្ន |

រូបភាពនេះគួរបង្ហាញ Block Structure ចុងក្រោយដែលនិស្សិតត្រូវប្រើក្នុង Final Project។ វាជួយឱ្យពួកគេមានគំរូច្បាស់សម្រាប់បន្តទៅមេរៀនទី៦ ដែលនឹងបង្កើត Blockchain ជាសង្វាក់ Blocks។
គ្រូអាចប្រើសំណួរខាងក្រោម៖
hash ខ្លួនឯងនៅពេល Generate Hash?
សរសេរចម្លើយខ្លី ៥–៧ បន្ទាត់៖
ហេតុអ្វី Previous Hash ជាគំនិតសំខាន់បំផុតមួយក្នុង Blockchain?
ចម្លើយគួររួមបញ្ចូលគំនិត៖
បង្កើត Certificate Transaction មួយដែលមាន Fields៖
transaction_id certificate_id student_name program certificate_title issue_date status certificate_hash
បង្កើត Block មួយដែលមាន Fields៖
index timestamp transactions previous_hash nonce hash
បង្កើត Transactions ចំនួន ២ ហើយបញ្ចូលទៅក្នុង Block មួយ។
សរសេរ Function generate_hash(data) ហើយប្រើវាសម្រាប់ Generate Block Hash។
កែ student_name ក្នុង Transaction មួយ ហើយ Generate Hash ថ្មី។ ប្រៀបធៀប Hash ដើម និង Hash ថ្មី។
សរសេរពន្យល់ខ្លីៗថា Previous Hash មានតួនាទីអ្វីក្នុង Blockchain។
បង្កើតកម្មវិធី Python Console មួយឈ្មោះ៖
block_structure_demo.py
កម្មវិធីត្រូវមាន៖
generate_hash(data)
create_certificate_transaction()
create_block(index, transactions, previous_hash)
បន្ទាប់ពីបញ្ចប់មេរៀនទី ៥ និស្សិតគួរមាន៖
មេរៀនទី ៥ គឺជាស្ពានពី Hashing ទៅ Blockchain។ និស្សិតគួរយល់ច្បាស់ថា Block គឺជា Data Structure មួយ មិនមែនជាអ្វីស្មុគស្មាញពេកទេ។ ប្រសិនបើពួកគេយល់ Python Dictionary និង List ពួកគេអាចយល់ Block បានយ៉ាងងាយ។
លទ្ធផល Hash មុន និងក្រោយកែ Transaction Data ដោយផ្ទាល់ក្នុង Console ដើម្បីឱ្យនិស្សិតឃើញថា Block Hash មានតួនាទីជាភស្តុតាងបច្ចេកទេស។ កុំអោយនិស្សិតច្រឡំថា Block Hash គឺជាការលាក់ទិន្នន័យ។ វាមិនមែន Encryption ទេ។ វាគឺជាវិធីសាស្ត្រសម្រាប់ពិនិត្យ Integrity។
| Figure | កន្លែងបញ្ចូល | គោលបំណង |
|---|---|---|
| Figure 1 | ផ្នែក ៣ | បង្ហាញ Certificate Transactions ទៅ Block |
| Figure 2 | ផ្នែក ៤.៣ | បង្ហាញ Fields របស់ Certificate Transaction |
| Figure 3 | ផ្នែក ៥.២ | បង្ហាញ Fields របស់ Block |
| Figure 4 | ផ្នែក ៧.១ | បង្ហាញ Previous Hash ភ្ជាប់ Blocks |
| Figure 5 | ផ្នែក ១១ | បង្ហាញ Block មួយដែលមាន Transactions និង Hash |
| Figure 6 | ផ្នែក ១៣ | បង្ហាញថា Transaction Change ប៉ះពាល់ Block Hash |
| Figure 7 | ផ្នែក ១៤ | បង្ហាញ Final Project Block Structure |
[1] D. Yaga, P. Mell, N. Roby, and K. Scarfone, “Blockchain Technology Overview,” National Institute of Standards and Technology, NISTIR 8202, 2018. doi: 10.6028/NIST.IR.8202.
[2] Python Software Foundation, “time — Time access and conversions,” Python 3 Documentation, 2026.
[3] Python Software Foundation, “json — JSON encoder and decoder,” Python 3 Documentation, 2026.
[4] National Institute of Standards and Technology, “blockchain — Glossary,” NIST Computer Security Resource Center, 2026.
មតិយោបល់ 0