π ΠΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ Π½Π° ΠΏΠΈΡΠΎΠ½Π΅: ΠΏΠΎΡΠ°Π³ΠΎΠ²Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΈΡΠΊΠΎΠ²
ΠΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ Π½Π° ΠΏΠΈΡΠΎΠ½Π΅?
ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° Π½Π° ΠΏΠΈΡΠΎΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. ΠΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° Π½Π° ΠΏΠΈΡΠΎΠ½Π΅:
import hashlib
import json
from time import time
class Blockchain:
def __init__(self):
self.chain = []
self.current_transactions = []
def new_block(self, proof, previous_hash=None):
block = {
'index': len(self.chain) + 1,
'timestamp': 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):
self.current_transactions.append({
'sender': sender,
'recipient': recipient,
'amount': amount,
})
@staticmethod
def hash(block):
block_string = json.dumps(block, sort_keys=True).encode()
return hashlib.sha256(block_string).hexdigest()
@property
def last_block(self):
return self.chain[-1]
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°
blockchain = Blockchain()
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ
blockchain.new_transaction('Alice', 'Bob', 0.001)
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ Π±Π»ΠΎΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½
block = blockchain.new_block(12345)
# ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅
print(block)
ΠΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠ΅ΠΉ.
Π£Π΄Π°ΡΠΈ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°!
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ Π½Π° ΠΏΠΈΡΠΎΠ½Π΅
ΠΠ»ΠΎΠΊΡΠ΅ΠΉΠ½ β ΡΡΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ , Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Π²ΠΈΠ΄Π΅ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠΎΠΉ. ΠΠΈΡΠΎΠ½ - ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΡΡΠΎΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° Π½Π° ΠΏΠΈΡΠΎΠ½Π΅.
Π¨Π°Π³ 1: ΠΠΌΠΏΠΎΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ
import hashlib
import json
from time import time
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ: hashlib Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Ρ ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, json Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON ΠΈ time Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π¨Π°Π³ 2: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Π±Π»ΠΎΠΊΠ°
class Block:
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.previous_hash = previous_hash
self.hash = self.calculate_hash()
def calculate_hash(self):
data = str(self.index) + str(self.timestamp) + str(self.data) + str(self.previous_hash)
return hashlib.sha256(data.encode()).hexdigest()
Π ΡΡΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡ Block, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π»ΠΎΠΊ Π² Π½Π°ΡΠ΅ΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ Π±Π»ΠΎΠΊΠΎΠ². ΠΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΈΠ½Π΄Π΅ΠΊΡ, Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΊΡ, Π΄Π°Π½Π½ΡΠ΅ Π±Π»ΠΎΠΊΠ°, ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ Ρ ΡΡ ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Ρ ΡΡ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ calculate_hash(), ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Ρ ΡΡ Π±Π»ΠΎΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΅Π³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ².
Π¨Π°Π³ 3: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½
class Blockchain:
def __init__(self):
self.chain = [self.create_genesis_block()]
def create_genesis_block(self):
return Block(0, time(), "Genesis Block", "0")
def get_latest_block(self):
return self.chain[-1]
def add_block(self, new_block):
new_block.previous_hash = self.get_latest_block().hash
new_block.hash = new_block.calculate_hash()
self.chain.append(new_block)
def is_chain_valid(self):
for i in range(1, len(self.chain)):
current_block = self.chain[i]
previous_block = self.chain[i-1]
if current_block.hash != current_block.calculate_hash():
return False
if previous_block.hash != previous_block.calculate_hash():
return False
return True
Π ΡΡΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡ Blockchain, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΠΏΠΎΡΠΊΡ Π±Π»ΠΎΠΊΠΎΠ². ΠΠ½ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π³Π΅Π½Π΅Π·ΠΈΡ-Π±Π»ΠΎΠΊΠ° (ΠΏΠ΅ΡΠ²ΡΠΉ Π±Π»ΠΎΠΊ Π² ΡΠ΅ΠΏΠΎΡΠΊΠ΅), ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΡΠ΅ΠΏΠΎΡΠΊΠΈ.
Π¨Π°Π³ 4: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ²
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°
blockchain = Blockchain()
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½
block1 = Block(1, time(), "ΠΠ΅ΡΠ²ΡΠΉ Π±Π»ΠΎΠΊ", "")
blockchain.add_block(block1)
block2 = Block(2, time(), "ΠΡΠΎΡΠΎΠΉ Π±Π»ΠΎΠΊ", "")
blockchain.add_block(block2)
Π ΡΡΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Blockchain ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΄Π²Π° Π±Π»ΠΎΠΊΠ° Π² ΡΠ΅ΠΏΠΎΡΠΊΡ: ΠΏΠ΅ΡΠ²ΡΠΉ Π±Π»ΠΎΠΊ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ "ΠΠ΅ΡΠ²ΡΠΉ Π±Π»ΠΎΠΊ" ΠΈ Π²ΡΠΎΡΠΎΠΉ Π±Π»ΠΎΠΊ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ "ΠΡΠΎΡΠΎΠΉ Π±Π»ΠΎΠΊ".
Π¨Π°Π³ 5: ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°
print("Π¦Π΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°:", blockchain.is_chain_valid())
Π ΡΡΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° is_chain_valid(). ΠΠ΅ΡΠΎΠ΄ Π²Π΅ΡΠ½Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ True, Π΅ΡΠ»ΠΈ ΡΠ΅ΠΏΠΎΡΠΊΠ° Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π° ΠΈ False, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ.
ΠΡΠ²ΠΎΠ΄
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΎΡΠ½ΠΎΠ²Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° Π½Π° ΠΏΠΈΡΠΎΠ½Π΅. ΠΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΊΠ»Π°ΡΡΡ Block ΠΈ Blockchain, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈ Π² ΡΠ΅ΠΏΠΎΡΠΊΡ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°. ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½.