-
Kode Blockchain Sederhana dalam Python
import hashlib
import json
import time
from uuid import uuid4
from urllib.parse import urlparse
class Blockchain:
def __init__(self):
self.chain = []
self.current_transactions = []
self.nodes = set()
# Membuat blok genesis (blok pertama di blockchain)
self.new_block(previous_hash='1', proof=100)
def register_node(self, address):
"""
Mendaftarkan node baru ke dalam jaringan blockchain
"""
parsed_url = urlparse(address)
self.nodes.add(parsed_url.netloc)
def valid_chain(self, chain):
"""
Memeriksa apakah blockchain valid dengan memeriksa hash dan proof of work
"""
last_block = chain[0]
current_index = 1
while current_index < len(chain):
block = chain[current_index]
# Verifikasi hash blok sebelumnya
if block['previous_hash'] != self.hash(last_block):
return False
# Verifikasi proof of work
if not self.valid_proof(last_block['proof'], block['proof']):
return False
last_block = block
current_index += 1
return True
def resolve_conflicts(self):
"""
Konsensus untuk mengganti rantai saat terdapat konflik
"""
neighbours = self.nodes
new_chain = None
max_length = len(self.chain)
for node in neighbours:
response = requests.get(f'http://{node}/chain')
if response.status_code == 200:
length = response.json()['length']
chain = response.json()['chain']
if length > max_length and self.valid_chain(chain):
max_length = length
new_chain = chain
if new_chain:
self.chain = new_chain
return True
return False
def new_block(self, proof, previous_hash=None):
"""
Membuat blok baru dalam blockchain
"""
block = {
'index': len(self.chain) + 1,
'timestamp': time.time(),
'transactions': self.current_transactions,
'proof': proof,
'previous_hash': previous_hash or self.hash(self.chain[-1]),
}
self.current_transactions = []
self.chain.append(block)
return block
def new_transaction(self, sender, recipient, amount):
"""
Membuat transaksi baru yang akan dimasukkan ke dalam blok berikutnya
"""
self.current_transactions.append({
'sender': sender,
'recipient': recipient,
'amount': amount,
})
return self.last_block['index'] + 1
@staticmethod
def hash(block):
"""
Membuat hash SHA-256 dari blok
"""
block_string = json.dumps(block, sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest()
@property
def last_block(self):
"""
Mengembalikan blok terakhir dalam blockchain
"""
return self.chain[-1]
def proof_of_work(self, last_proof):
"""
Algoritma Proof of Work yang sederhana:
- Temukan angka p' sehingga hash(pp') memiliki empat angka nol di depan
- p adalah proof sebelumnya, dan p' adalah proof baru
"""
proof = 0
while self.valid_proof(last_proof, proof) is False:
proof += 1
return proof
@staticmethod
def valid_proof(last_proof, proof):
"""
Memverifikasi Proof of Work:
- Menggabungkan dua angka dan membuat hash
- Memeriksa apakah hash dimulai dengan empat angka nol
"""
guess = f'{last_proof}{proof}'.encode()
guess_hash = hashlib.sha256(guess).hexdigest()
return guess_hash[:4] == "0000"
Penjelasan Fitur dan Fungsinya
1. Blok Genesis:
self.new_block(previous_hash=’1′, proof=100)
Blok pertama yang disebut “blok genesis” dibuat secara manual untuk memulai blockchain.
2. Register Node:
register_node(self, address)
Memungkinkan penambahan node baru ke dalam jaringan blockchain.
3. Validasi Rantai (Chain Validation):
valid_chain(self, chain)
Memeriksa integritas blockchain dengan membandingkan hash blok sebelumnya dan memverifikasi Proof of Work.
4. Resolusi Konflik (Consensus Mechanism):
resolve_conflicts(self)
Mengganti rantai blockchain saat terdapat konflik dengan memilih rantai terpanjang yang valid.
5. Pembuatan Blok Baru:
new_block(self, proof, previous_hash=None)
Menambahkan blok baru ke dalam blockchain setelah memvalidasi Proof of Work.
6. Pembuatan Transaksi Baru:
new_transaction(self, sender, recipient, amount)
Menambahkan transaksi baru yang akan dimasukkan ke dalam blok berikutnya.
7. Hashing Blok:
hash(block)
Menggunakan algoritma SHA-256 untuk menghasilkan hash unik dari setiap blok.
8. Proof of Work (PoW):
proof_of_work(self, last_proof) dan valid_proof(last_proof, proof)
Memastikan penambahan blok baru memerlukan perhitungan matematis yang sulit untuk memvalidasi keamanan blockchain.
Kegunaan Kode Ini
1. Keamanan Data:
Setiap blok terhubung dengan hash blok sebelumnya, sehingga memodifikasi satu blok akan merusak seluruh rantai.
2. Transparansi dan Akuntabilitas:
Semua transaksi dicatat dalam blockchain, memungkinkan transparansi penuh tanpa memerlukan pihak ketiga.
3. Desentralisasi:
Blockchain tidak memerlukan otoritas pusat, karena setiap node dalam jaringan memiliki salinan dari rantai.
4. Integritas Transaksi:
Algoritma Proof of Work memastikan bahwa hanya transaksi yang valid yang dapat ditambahkan ke blockchain.
5. Penerapan Praktis:
Kode ini dapat diimplementasikan untuk berbagai kasus penggunaan seperti cryptocurrency, pelacakan rantai pasokan, kontrak pintar (smart contracts), dan banyak lagi.
Sorry, there were no replies found.
Log in to reply.