Chức năng khối python

Trong bài hướng dẫn ngày hôm nay chúng ta sẽ đi từ những bước đầu tiên để xây dựng lên một mạng blockchain đơn giản bằng ngôn ngữ python. Giúp chúng ta sẽ có cái nhìn tổng thể nhất về cách thức một blockchain hoạt động

Bằng cách sử dụng microframework Flask để tạo ra các điểm cuối, sau đó chạy trên nhiều máy để tạo một mạng phi tập trung. Chúng ta sẽ học cách xây dựng một giao diện người dùng đơn giản để tương tác với blockchain và lưu trữ thông tin cho mọi trường hợp sử dụng, chẳng hạn như thanh toán ngang hàng, trò chuyện hoặc thương mại điện tử

Mục tiêu sẽ xây dựng một ứng dụng cho phép người dùng chia sẻ thông tin bằng cách đăng các bài đăng. Nội dung sẽ được lưu trữ trên blockchain, nên nó sẽ không thể thay đổi và tồn tại mãi mãi. Người dùng sẽ tương tác với ứng dụng thông qua một giao diện web đơn giản

Chúng ta sẽ sử dụng cách tiếp cận từ dưới lên. Bắt đầu bằng cách xác định cấu trúc dữ liệu mà chúng tôi sẽ lưu trữ trong chuỗi khối. Mỗi bài đăng sẽ bao gồm ba yếu tố cần thiết

  • Nội dung
  • Tác giả
  • Dấu thời gian

Sau đây chúng ta sẽ luôn đi vào các bước thực hiện

Lưu trữ các giao dịch trong các khối

Ở đây chúng ta sẽ lưu trữ theo định dạng được sử dụng rộng rãi đó là JSON. Và dưới đây là những gì một bài đăng sẽ được lưu trữ trong blockchain

{ 
  "author": "some_author_name", 
  "content": "Some thoughts that author wants to share", 
  "timestamp": "The time at which the content was created"
}

Thuật ngữ

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
0 trong chuỗi khối thường thay thế bằng
class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
1. Nên ở đây chúng ta sử dụng hệ thống thuật ngữ
class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
1 để chỉ
class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
0 trong ứng dụng này

Các giao dịch sẽ được đóng gói thành khối. Một khối có thể chứa một hoặc nhiều giao dịch. Các khối chứa các giao dịch được tạo thường xuyên và được thêm vào chuỗi khối. Do có nhiều khối nên mỗi khối sẽ có một

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
4 duy nhất

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
Thêm ký tự số vào các khối

Để ngăn chặn các giả mạo dữ liệu được lưu trữ bên trong các khối và để phát hiện ra điều này, chúng tôi sẽ sử dụng hàm băm

Hàm băm là một hàm lấy dữ liệu có kích thước bất kỳ và tạo ra dữ liệu có kích thước cố định, thường được sử dụng để xác định dữ liệu đầu vào. Hàm băm lý tưởng thường có những đặc điểm sau là

  • Nhanh chóng để tính toán
  • Cùng với đó, một dữ liệu sẽ luôn dẫn đến cùng một giá trị băm
  • Hệ thống tức thời phải có tính ngẫu nhiên nhất là ngay cả một bit thay đổi trong dữ liệu cũng sẽ thay đổi giá trị đáng kể

Kết quả của các tính chất trên là

  • Hầu như không thể đoán dữ liệu đầu vào được trùm. (Cách duy nhất là thử tất cả các trường hợp đầu vào có thể)
  • Nếu bạn biết cả đầu vào và giá trị băm, bạn chỉ cần truyền đầu vào qua hàm để xác minh giá trị băm được cung cấp có đúng hay không

Có nhiều biến phổ biến khác nhau. Đây là một ví dụ trong Python ta sử dụng hàm mũ

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
5

________số 8

Chúng ta sẽ lưu trữ giá trị băm của khối vào một trường bên trong đối tượng

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
6 và nó sẽ hoạt động giống như chữ số (hoặc chữ ký) của dữ liệu chứa trong đó

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
0Nối các khối thành chuỗi(chuỗi)

Chúng ta cần một cách để đảm bảo rằng bất kỳ thay đổi nào trong các khối trước đó sẽ làm mất hiệu lực toàn bộ chuỗi. Cách làm của Bitcoin là tạo ra sự phụ thuộc giữa các khối liên tiếp bằng cách xâu chuỗi chúng với giá trị băm của khối ngay trước đó. Có nghĩa là sẽ lưu giá trị băm của khối trước đó trong khối hiện tại khi thêm mới vào một trường có tên là

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
7

Sẽ có câu hỏi. vậy còn block đầu tiên thì sao?

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
2

Bây giờ, nếu nội dung của bất kỳ khối nào trước đó thay đổi

  • Giá trị băm của khối trước đó sẽ thay đổi
  • Điều này sẽ dẫn đến sự không phù hợp với trường previous_hash trong khối tiếp theo
  • Vì dữ liệu đầu vào để tính toán giá trị băm của bất kỳ khối nào cũng bao gồm cả trường previous_hash, nên giá trị băm của khối tiếp theo cũng sẽ thay đổi

Cuối cùng, toàn bộ chuỗi theo khối thay thế bị vô hiệu và cách duy nhất để giải quyết là tính toán lại toàn bộ chuỗi

Triển khai thuật toán Proof-Of-Work(Bằng chứng công việc)

Dù vậy vẫn có một vấn đề đó là giá trị trùm của tất cả các khối và theo đó có thể được tính lại khá dễ dàng để tạo ra một chuỗi khối hợp lệ khác. Để ngăn chặn điều này, chúng ta có thể khai thác tính toán bất khả thi của hàm mũm mà chúng ta đã thảo luận ở trên để thực hiện nhiệm vụ tính toán giá trị mũ trùm khó khăn và ngẫu nhiên hơn. Điều này có nghĩa là. Thay vì chấp nhận bất kỳ giá trị băm nào cho khối, chúng ta bổ sung một số ràng buộc cho nó. Vui lòng thêm một ràng buộc rằng giá trị băm của chúng ta sẽ bắt đầu bằng n số 0 phía trước trong đó n là số nguyên dương

Ở đây ta sẽ bổ sung thêm một số dữ liệu giả mà ta có thể thay đổi. Ta sẽ thêm một trường mới là trường nonce. Number nonce is a number that they ta could continue change for going to when they we have been a SHARP. Nonce tuân thủ các ràng buộc đóng vai trò là bằng chứng cho thấy một số tính toán đã được thực hiện. Kỹ thuật này là phiên bản đơn giản hóa của thuật toán Hashcash được sử dụng trong Bitcoin. Số lượng 0 chỉ được xác định trong ràng buộc xác định mức độ khó của thuật toán PoW (số lượng 0 càng lớn, càng khó để tìm ra nonce)

Ngoài ra do tính bất đối xứng nên Proof-of-work(PoW) khó tính toán nhưng rất dễ xác minh khi bạn tìm ra nonce (bạn chỉ cần chạy lại hàm băm)

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
Thêm khối vào Chuỗi

Để thêm một khối vào chuỗi, trước hết chúng ta phải xác minh rằng

  • Dữ liệu không bị giả mạo (bằng chứng công việc được cung cấp là chính xác)
  • Thứ tự của các giao dịch được giữ nguyên
class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
4Khai thác mỏ

Các lệnh cấm giao dịch bắt đầu sẽ được lưu trữ dưới dạng một nhóm các giao dịch chưa được xác nhận. Quá trình đưa các giao dịch chưa được xác nhận vào một khối và tính toán POW được gọi là khai thác các khối. Khi không tuân theo các ràng buộc được tìm thấy, chúng ta có thể nói rằng một khối đã được khai thác và nó có thể được đưa vào chuỗi khối

Trong hầu hết các loại tiền điện tử (bao gồm Bitcoin), những người khai thác có thể được trao một số tiền điện tử như một phần thưởng cho việc sử dụng sức mạnh tính toán của họ để tính toán POW. This is function mining

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
5

Được rồi, đây là mã của phần xử lý. mã nguồn

Create interface

Phần này chúng ta sẽ tạo giao diện cho nút blockchain để tương tác với ứng dụng chúng ta vừa xây dựng. Ở đây sẽ sử dụng một microframework Python phổ biến được gọi là Flask để tạo API REST tương tác và gọi các hành động khác nhau trong nút blockchain của chúng tôi. Nếu bạn đã từng làm việc với bất kỳ web framework nào trước đây, đoạn mã dưới đây sẽ không khó theo dõi

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
6

Chúng ta cần một lộ trình để ứng dụng có thể tạo một giao dịch mới và ở đây chính là bài đăng

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
7

Sẽ có một lộ trình trả lại bản sao của chuỗi. And this route, ứng dụng sẽ sử dụng để truy vấn tất cả dữ liệu cần hiển thị

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
0

Còn đây là lộ trình để gửi yêu cầu khai thác mỏ - xác thực các giao dịch chưa được xác thực (nếu có). Chúng ta sẽ sử dụng nó để bắt đầu một lệnh khai thác từ ứng dụng chính của chúng ta

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
1Thiết lập cơ chế đồng thuận và phân tán

Có một vấn đề về blockchain mà chúng ta đã phát triển đang chạy trên một máy tính. Mặc dù chúng ta đã liên kết các khối bằng giá trị băm và áp dụng POW, nhưng vẫn không thể tin vào một thực thể duy nhất (trong trường hợp ở đây là một máy duy nhất). Chúng ta cần dữ liệu được phân tán tức thì cần nhiều nút để duy trì chuỗi khối. Vì vậy, để chuyển từ một nút đơn sang mạng ngang hàng, trước hết chúng ta hãy tạo một cơ chế để một nút mới có thể biết về các đồng nghiệp (đồng nghiệp) khác trong mạng.

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
2

Một nút mới tham gia vào mạng có thể gọi hàm

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
8 để đăng ký với các nút hiện có trong mạng. Điều này sẽ giúp ích cho những điều sau

  • Yêu cầu nút từ xa để thêm một nút ngang hàng mới vào danh sách các nút ngang hàng đã có
  • Dễ dàng khởi tạo blockchain của nút mới bằng cách truy xuất nút từ xa
  • Đồng bộ hóa lại chuỗi khối với mạng nếu nút đó không kết nối với mạng nữa

Tuy nhiên, có một vấn đề với nhiều nút thao tác có chủ ý hoặc lý do vô ý (như mức độ mạng), bản sao của chuỗi một vài nút có thể khác nhau. Trong trường hợp đó các nút cần phải đồng ý với một số phiên bản của chuỗi để duy trì tính toàn vẹn của toàn bộ hệ thống. Nói cách khác, chúng ta cần đạt được sự đồng thuận

Một thuật toán đồng thuận đơn giản có thể đồng ý với chuỗi hợp lệ dài nhất khi chuỗi của các nút tham gia trong mạng xuất hiện nhánh rẽ. Lý do đằng sau phương pháp này là chuỗi dài nhất chứng tỏ số lượng công việc được thực hiện nhiều nhất (hãy nhớ PoW rất khó tính)

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
3

Tiếp theo, chúng ta cần phát triển một cách để bất kỳ nút nào thông báo cho mạng rằng nó đã khai thác ra một khối để mọi người có thể cập nhật blockchain của họ và chuyển sang khai thác các khối khác. Các nút khác chỉ có thể cần xác minh PoW và thêm khối mới được khai thác vào chuỗi tương ứng của mình (hãy nhớ rằng việc xác minh là dễ dàng khi biết được nonce)

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
4

Hàm

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
9 nên được gọi sau mỗi khối được khai thác bởi các nút để những người ngang hàng khác có thể thêm nó vào chuỗi của họ

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
5Xây dựng ứng dụng web

Vì vậy, máy chủ blockchain đã được thiết lập. Bạn có thể tìm thấy mã nguồn ở đây

Bây giờ là lúc bắt đầu phát triển giao diện của ứng dụng web. Chúng ta đã sử dụng mẫu Jinja2 để hiển thị các chế độ xem và một số CSS để làm cho mọi thứ trở nên đẹp mắt

Ứng dụng cần kết nối với một nút trong chuỗi khối mạng để tìm tải dữ liệu và cũng để gửi dữ liệu mới

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
6

Hàm

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
40

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
7

Ứng dụng có một biểu mẫu HTML để nhập đầu vào của người dùng và sau đó thực hiện yêu cầu POST đến nút được kết nối để thêm giao dịch vào nhóm giao dịch chưa được xác nhận. Giao dịch sau đó được khai thác bằng mạng và cuối cùng được tìm thấy sau khi tải lại trang

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
8Chạy ứng dụng

Đến đây chúng ta đã hoàn thành. mã nguồn

Cài đặt

class Block:
    def __init__(self, index, transactions, timestamp):
        """
        Constructor cho một `Block` class.
        :param index: Chỉ số ID duy nhất của một block.
        :param transactions: Danh sách các transactions.
        :param timestamp: Thời gian tạo block.
        """
        self.index = index 
        self.transactions = transactions 
        self.timestamp = timestamp
9

Chạy một nút chuỗi khối trên cổng 8000

>>> from hashlib import sha256
>>> data = b"Some variable length data"
>>> sha256(data).hexdigest()
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>> sha256(data).hexdigest() # bất kể bạn chạy nó bao nhiêu lần, kết quả sẽ là cùng một chuỗi 256 ký tự
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>>  data = b"Some variable length data2" # Đã thêm một ký tự ở cuối.
'9fcaab521baf8e83f07512a7de7a0f567f6eef2688e8b9490694ada0a3ddeec8'

# Note: giá trị băm đã thay đổi hoàn toàn !
0

chạy ứng dụng web

>>> from hashlib import sha256
>>> data = b"Some variable length data"
>>> sha256(data).hexdigest()
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>> sha256(data).hexdigest() # bất kể bạn chạy nó bao nhiêu lần, kết quả sẽ là cùng một chuỗi 256 ký tự
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>>  data = b"Some variable length data2" # Đã thêm một ký tự ở cuối.
'9fcaab521baf8e83f07512a7de7a0f567f6eef2688e8b9490694ada0a3ddeec8'

# Note: giá trị băm đã thay đổi hoàn toàn !
1

Ứng dụng sẽ chạy tại http. //máy chủ cục bộ. 5000

Chạy nhiều nút

Ta sẽ chạy nhiều nút bằng cách chạy trên các cổng khác nhau. Sử dụng _______

class Blockchain:
    # độ khó của thuật toán POW
    difficulty = 2
    
    
    ......
    

    def proof_of_work(self, block):
        """
        Hàm thử các giá trị khác nhau của nonce để lấy giá trị băm thỏa mãn
        """
        block.nonce = 0

        computed_hash = block.compute_hash()
        while not computed_hash.startswith('0' * Blockchain.difficulty):
            block.nonce += 1
            computed_hash = block.compute_hash()

        return computed_hash
41 để đăng ký thành một mạng ngang hàng

>>> from hashlib import sha256
>>> data = b"Some variable length data"
>>> sha256(data).hexdigest()
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>> sha256(data).hexdigest() # bất kể bạn chạy nó bao nhiêu lần, kết quả sẽ là cùng một chuỗi 256 ký tự
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>>  data = b"Some variable length data2" # Đã thêm một ký tự ở cuối.
'9fcaab521baf8e83f07512a7de7a0f567f6eef2688e8b9490694ada0a3ddeec8'

# Note: giá trị băm đã thay đổi hoàn toàn !
2
>>> from hashlib import sha256
>>> data = b"Some variable length data"
>>> sha256(data).hexdigest()
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>> sha256(data).hexdigest() # bất kể bạn chạy nó bao nhiêu lần, kết quả sẽ là cùng một chuỗi 256 ký tự
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>>  data = b"Some variable length data2" # Đã thêm một ký tự ở cuối.
'9fcaab521baf8e83f07512a7de7a0f567f6eef2688e8b9490694ada0a3ddeec8'

# Note: giá trị băm đã thay đổi hoàn toàn !
3

You can run application ( python run_app. py) và tạo giao dịch (đăng bài qua giao diện web) và khi bạn khai thác giao dịch, tất cả các nút trong mạng sẽ cập nhật chuỗi. Và các nút cũng có thể được kiểm tra bằng cách gọi bằng cURL hoặc Postman

>>> from hashlib import sha256
>>> data = b"Some variable length data"
>>> sha256(data).hexdigest()
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>> sha256(data).hexdigest() # bất kể bạn chạy nó bao nhiêu lần, kết quả sẽ là cùng một chuỗi 256 ký tự
'b919fbbcae38e2bdaebb6c04ed4098e5c70563d2dc51e085f784c058ff208516'
>>>  data = b"Some variable length data2" # Đã thêm một ký tự ở cuối.
'9fcaab521baf8e83f07512a7de7a0f567f6eef2688e8b9490694ada0a3ddeec8'

# Note: giá trị băm đã thay đổi hoàn toàn !
4Xác thực giao dịch

You may have got to see an error in application is. Bất kỳ ai cũng có thể đổi tên và đăng bất kỳ nội dung nào. Ngoài ra, bài đăng dễ bị giả mạo khi gửi giao dịch lên mạng blockchain. Một cách để giải quyết vấn đề này là tạo tài khoản người dùng bằng mật khẩu mã khóa công khai. Mỗi người dùng mới cần có khóa chung và khóa riêng để có thể đăng bài trong ứng dụng

  • Mỗi giao dịch mới được gửi (đăng ký) được ký bằng khóa cá nhân của người dùng. Chữ ký này được thêm vào giao dịch dữ liệu cùng với thông tin người dùng
  • Trong giai đoạn xác minh khi khai thác các giao dịch, chúng ta có thể xác minh xem chủ sở hữu được yêu cầu của bài đăng có giống với chủ sở hữu chỉ được xác định trong giao dịch dữ liệu hay không và thông báo không được sửa đổi nếu . Điều khoản này có thể được thực hiện bằng cách sử dụng chữ ký và khóa công khai của chủ sở hữu gửi bài đăng
kết luận

Hướng dẫn này bao gồm các nguyên tắc cơ bản của một chuỗi khối công khai. Nếu bạn đã theo dõi đến đấy thì giờ bạn đã có thể phát triển khai thác một blockchain từ đầu và xây dựng một ứng dụng đơn giản, cho phép người dùng chia sẻ thông tin trên blockchain. Mong rằng bài viết sẽ trả lại cho các bạn những kiến ​​thức bổ ích rất vui và hẹn gặp lại ở những bài viết tiếp theo