Lập trình Blockchain cơ bản bằng ngôn ngữ Python

16 tháng 10, 2020 By SYSTEM

Sự ra đời của tiền điện tử đã tạo ra một cuộc cách mạng về phương thức thanh toán, nhưng tiềm năng của blockchain không chỉ dừng lại ở lĩnh vực tài chính.


Được thành lập vào năm 2009 bởi những cá nhân không rõ danh tính, thường được biết đến là Satoshi Nakamoto, công nghệ Blockchain là một bước đột phá và đã cho thấy tiềm năng to lớn trong việc tạo ra một phương thức chuyển hoặc nhận tiền nhanh chóng, an toàn và dễ sử dụng. Đã bao giờ bạn thắc mắc họ đã làm điều đó như thế nào?


Đối với những người mới bắt đầu, không có “pháp nhân trung tâm” nào giám sát các giao dịch như chức năng của các Ngân hàng hiện nay. Tất cả các chi tiết được giữ kín giữa người nhận, người gửi và không cần “người trung gian”. Một lợi ích quan trọng mà Blockchain đem lại là tính năng dễ dàng truy cập, đặc biệt là tại các quốc gia đang cấm giao dịch trên các trang thanh toán thông dụng (ví dụ như Paypal), đã tạo ra rất nhiều trở ngại cho những người có nhu cầu nhận hoặc chuyển tiền ra nước ngoài. Trong khi đó, tiền điện tử thì không có ranh giới. Nó cho phép giao dịch từ bất kỳ nơi nào, đến bất cứ đâu trên thế giới.


Tuy nhiên, lợi ích lớn nhất của tiền điện tử là khả năng chống lại lạm phát. Nguyên nhân là do tiền điện tử không được in ra tiền giấy thông thường, đồng nghĩa với việc chúng ta không thể sản xuất hàng loạt một số lượng lớn tiền điện tử.


Sẽ cần rất nhiều tài nguyên để “khai thác” một đồng tiền điện tử và đó là điều làm nên giá trị của nó. Tóm lại, tiền điện tử có thể được xem là một biện pháp chống lại lạm phát hữu ích như Vàng, nhưng điều khác biệt là nó có thể được lưu trữ, chuyển nhượng một cách dễ dàng và hầu như không thể bị đánh cắp.


Blockchain hoạt động như thế nào?



Hình: Clifford Photography (Nguồn: Unsplash)


Blockchain hoạt động như thế nào? Điều gì làm cho nó an toàn như vậy? Thông tin dưới đây sẽ giải thích cách thức hoạt động của một Blockchain, được thể hiện song song cùng những đoạn code để tạo ra một đoạn Blockchain. 


Blockchain, dịch theo đúng nguyên văn, là một “chuỗi các khối”. Mỗi block chứa một “hash” một “index” và thông tin về giao dịch cụ thể đã diễn ra. Tất cả các block trong Blockchain được liên kết với nhau bằng biến “hash”. Một "hash" chứa thông tin của block trước đó trong chuỗi và đó là thứ giữ cho toàn bộ chuỗi được liên kết và kết nối.


Blockchain diagram cơ bản


Nếu bất kỳ giá trị nào trong một block là “tampered with” thì sẽ làm cho “hash” thay đổi và nó sẽ không khớp với “hash” trong block phía sau nó. Toàn bộ network sẽ được cảnh báo là "tampering" và tất cả chuỗi sẽ bị đóng băng. Vì vậy, nếu hacker muốn hack vào một chuỗi, họ sẽ phải thay đổi giá trị của tất cả các block trước và sau nó, và việc này hầu như không thể xảy ra.

Chuyển sang phần Python, lấy ví dụ người gửi là một cá nhân ngẫu nhiên, Blockchain của chúng ta là một danh sách các “dummy genesis block”, thông tin giao dịch dưới dạng danh sách trống và import một thư viện có tên là “hashlib”.
from hashlib import sha256
sender = 'Moeed'
blockchain = [genesis_block]
genesis_block = {'previous_hash': 'XYZ',
                 'index': 0,
                 'transactions': [], 'proof': 0}
open_transactions = []

Sau đó, chúng ta sẽ xác định một chức năng sẽ yêu cầu người gửi nhập các thông tin chi tiết như: số tiền giao dịch cần gửi và địa chỉ của người nhận.

def get_transaction():
    recipient = input('Enter your recipient')
    amount = input('Enter your amount')
    return (recipient,amount)

Sau đó, thêm thông tin giao dịch vào danh sách “open_transaction” đã được xác định trước đó.

while True:
    I = input('Enter your choice')
    if I == '1':
        data = get_transaction()
        recipient, amount = data
        transaction = {'sender': sender,
                      'recipient': recipient,
                      'amount': amount}
        open_transactions.append(transaction)
        print(open_transactions)

Lưu ý: Thông tin giao dịch được lưu trữ trong từ điển để chúng ta có thể truy cập các giá trị bằng cách sử dụng “keys”.

Bây giờ hãy tạo một chức năng tạo “block” và gắn nó vào Blockchain. Nhưng trước khi làm điều đó, chúng ta hãy xem xét Blockchain có được sự bảo mật từ đâu.


SHA-256

SHA-256 là một thuật toán hash được tạo bởi NSA vào năm 2001, lấy input có kích thước bất kỳ và chuyển đổi nó thành output có kích thước cố định. Vẻ đẹp của SHA-256 là output gần như không thể giải mã, do đó đảm bảo tính bảo mật cao.

Phần “hash” của block trong Blockchain không gì khác hơn là output của thuật toán SHA-256 trong khi input là sự kết hợp của “hash của block trước”, “index” và “transaction information” thành định dạng của string.


Hãy xem đoạn code sau:

Thư viện "hashlib" đã được nhập.

Chúng ta sẽ tạo một hàm sẽ lấy “hash”, “index” và “transaction information” của block trước đó và chuyển nó thành hàm hash cho khối sau nó.

def hash_block(last_block):
    previous_hash = ''
    for keys in last_block:
        previous_hash = previous_hash + str(last_block[keys])
    hash = sha256(json.dumps(previous_hash).encode('utf-8')).hexdigest()
    return hash

Vì Blockchain của chúng ta bắt đầu từ “genesis block” đã được xác định ở phần trước, chúng tôi cung cấp cho nó một giá trị giả “before_hash” là XYZ.


“Proof of Work”



Hình: Bermix Studio (Nguồn: Unplash)

Như đã biết, hàm hash được tạo bằng thuật toán SHA-256 bởi một tập hợp các “inputs”. Nhưng điều đó làm cho việc thêm một block vào Blockchain trở nên quá “dễ dàng”.

Có lý do để làm cho việc “đào” blockchain trở nên khó khăn. Đó là bởi vì nó sẽ hạn chế sản xuất tiền một cách vô tội vạ, nhằm thúc đẩy nguồn cung được kiểm soát theo nhu cầu. Điều này được thực hiện bằng cách sử dụng thuật toán “proof of work”.

“Proof of work” sử dụng cùng một thuật toán như SHA-256, nhưng thay vì chỉ có một input và output duy nhất, sẽ có một điều kiện được đặt ra ví dụ như hash output cần có hai ký tự đầu tiên là số 0.

Hàm hash được tính toán bằng thuật toán SHA-256 với các input giống nhau (previous_hash, index, transaction information) nhưng có bổ sung thêm số lặp được gọi là "proof". Vì vậy, về cơ bản, "proof" sẽ được tăng thêm một cho đến khi điều kiện đặt ra (hai số 0 đầu tiên) được thỏa mãn.

Khi điều kiện được thỏa mãn, kết quả của hash từ “hash_block” sẽ được thêm vào block và sau đó block sẽ được thêm vào Blockchain.

Hãy xem đoạn code cho chức năng "proof of work" dưới đây:

def proof_of_work():
    previous_hash = ''
    proof = 0
    last_block = blockchain[-1]
    for keys in last_block:
        previous_hash = previous_hash + str(last_block[keys])

    guess_hash = previous_hash + str(proof)
    hash = sha256(hashed.encode('utf-8')).hexdigest()
    while hash[0:2] != '00':
            guess_hash = previous_hash + str(proof)
            hash = sha256(guess_hash.encode('utf-8')).hexdigest()
            proof = proof + 1
            print(hash)
    return proof

Như đã giải thích ở trên, đoạn code này sẽ thực hiện lặp lại cho đến khi thỏa mãn điều kiện “không”. Tiếp theo, hãy xem một block được “đào” như thế nào.


“Đào” một block



Hình: Aleksi Räisä (Nguồn: Unsplash)


Ở phần trước, chúng ta đã xem xét thuật toán “proof of work”. Bây giờ, hãy xem một block được “đào” như thế nào qua đoạn code dưới đây:

def hash_block(last_block):
    previous_hash = ''
    for keys in last_block:
        previous_hash = previous_hash + str(last_block[keys])
    hash = sha256(json.dumps(previous_hash).encode('utf-8')).hexdigest()
    return hash

def mine_block():
   
    last_block = blockchain[-1]
   
    hashed_block = hash_block(last_block)
    proof = proof_of_work()
    
    block = {
        'previous_hash': hashed_block,
        'index': len(blockchain),
        'transactions': open_transactions,
        'proof': proof
    }
    blockchain.append(block)
    print(blockchain)
    print(hashed_block)
    print(proof)
    return True

Từ đoạn code trên, trước hết chúng ta xác định có một hàm “hash_block” đã lấy ra một string trống có tên là “before_hash” và thêm các giá trị khác của block như index và transaction information dưới dạng string và tạo ra một string lớn. String này sau đó được trả về dưới dạng stringi được mã hóa bằng thuật toán SHA-256.


Sau đó, chúng ta bắt đầu hàm “mine_block” đã sử dụng hàm “hash_block” để trả về một hash và “proof of work” để tính hash có hai số 0 ở đầu. Các kết quả (số proof và hash) sau đó được thêm vào từ điển bằng tên của “block”, và được thêm vào danh sách blockchain.


Đây là cách mà block đầu tiên được tạo ra. Nhưng vẫn còn thiếu một thứ. Điều gì sẽ xảy ra nếu ai đó giả mạo blockchain? Để ngăn một ai đó thay đổi các giá trị trong block, chúng ta có thể kiểm tra chuỗi so sánh “before_hash” của một chuỗi với hash đã được tính toán cho Block trước nó. Hãy xem đoạn code sau:

def verify_chain():
    
    for (index, block) in enumerate(blockchain):
        if index == 0:
            continue
        if block['previous_hash'] != hash_block(blockchain[index - 1]):
            print(block['previous_hash'])
            print(hash_block(blockchain[index - 1]))
            print(block)
            print(blockchain[index-1])
            return False
    return True

Sau đó, chúng ta sẽ add một điều kiện ở cuối để thực hiện function phía trên

if not verify_chain():
    print('Invalid block')
    break

Nếu bất kỳ giá trị nào bên trong Blockchain của chúng tôi bị giả mạo, thì điều kiện trên sẽ trả về "Invalid chain".à cuối cùng, dưới đây là một số đoạn code để người dùng tương tác với chuỗi

 while True:
    I = input('Enter your choice')
    print('1 to recieve transactions')
    print('2 to mine block')
    print('3 to alter block')
    if I == '1':
        data = get_transaction()
        recipient, amount = data
        transaction = {'sender': owner,
                      'recipient': recipient,
                       'amount': amount}
        
        open_transactions.append(transaction)
        print(open_transactions)
        save_data()
    if I == '2':
        mine_block()
        open_transactions = []
        
    if I == '3':
        alter_block()

    if not verify_chain():
        print('Invalid block')
        break

Đoạn code trên khá dễ hiểu. Input 1 được sử dụng để nhận các giao dịch từ input. Input 2 được sử dụng để khai thác block và input 3 được sử dụng để "alter the block".

Chúng ta sẽ sử dụng “alter_block” để kiểm tra xem “verify_chain” có hoạt động hay không. Đoạn code cho “alter_block” là:

def alter_block():
    blockchain[0] =    {'previous_hash':'ABC',
                 'index':0,
                 'Transactions':[],'proof':0}

Lưu ý: Trong hàm trên, chúng ta thay đổi block đầu tiên bằng cách thay đổi “previous_hash” từ “XYZ” thành “ABC”, điều này sẽ tạo ra một hàm hash sai và do đó điều kiện “verify_hash” sẽ có hiệu lực.


Kết luận

Bài viết này đã giới thiệu cho các bạn những cách cơ bản để lập trình Blockchain bằng Python. Chúng ta cũng có thể làm việc này bằng Node Networks, API và OOP. Tóm lại, công nghệ Blockchain có tiềm năng to lớn và đang mở ra một tương lai đầy hứa hẹn. Hãy cùng chờ xem thế giới sẽ thay đổi như thế nào với Blockchain trong tương lai.


Theo tác giả: Moeedlodhi

Dịch bởi: Devera Academy