πŸ” Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅: пошаговая инструкция для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅?

НаписаниС Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ интСрСсным процСссом. Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅:


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, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² Π±ΠΎΠ»Π΅Π΅ слоТных прилоТСниях Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½.

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

[Python] Как создаю свою ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρƒ | РазбираСмся с Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½

0. Blockchain Π½Π° Python - "Π”Π΅ΠΌΠΊΠ°" ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Как ΡΡ‚Π°Ρ‚ΡŒ Π‘Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½-программистом? Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π‘Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½? Π§Ρ‚ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΈ ΡƒΡ‡ΠΈΡ‚ΡŒ? #ityoutubersru

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ”‘ Как ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку Π² Python: простой способ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

🐍 Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ» ΠΏΠΈΡ‚ΠΎΠ½Π°: ΠΌΠ°Π»ΡŒΡ‡ΠΈΠΊ ΠΈΠ»ΠΈ Π΄Π΅Π²ΠΎΡ‡ΠΊΠ°? 🧐 Π›Π΅Π³ΠΊΠΈΠΉ способ!

Как вывСсти строки ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅: ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ совСты ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ πŸ“‘

πŸ” Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅: пошаговая инструкция для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

πŸ” Как ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ руководство 🐍

πŸ“š ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ массив строками Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅: ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это быстро ΠΈ Π»Π΅Π³ΠΊΠΎ

πŸ”’ Как пСрСвСсти числа ΠΈΠ· 16 Π² 2 систСму счислСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python? 🐍