Thêm một khối vào chuỗi khối liên quan đến việc thêm khối đã tạo vào danh sách TPCoins của chúng tôi .
TPCoins.append (block0)
Lưu ý rằng không giống như các khối còn lại trong hệ thống, khối gốc chỉ chứa một giao dịch được khởi tạo bởi người khởi tạo hệ thống TPCoins. Bây giờ, bạn sẽ kết xuất nội dung của chuỗi khối bằng cách gọi hàm toàn cầu của chúng tôi là dump_blockchain –
dump_blockchain(TPCoins)
Khi bạn thực thi chức năng này, bạn sẽ thấy kết quả sau:
Number of blocks in the chain: 1
block # 0
sender: Genesis
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100ed272b52ccb539
e2cd779c6cc10ed1dfadf5d97c6ab6de90ed0372b2655626fb79f62d0e01081c163b0864
cc68d426bbe9438e8566303bb77414d4bfcaa3468ab7febac099294de10273a816f7047d
4087b4bafa11f141544d48e2f10b842cab91faf33153900c7bf6c08c9e47a7df8aa7e60d
c9e0798fb2ba3484bbdad2e4430203010001
-----
value: 500.0
-----
time: 2019-01-14 16:18:02.042739
-----
--------------
=====================================
Tại thời điểm này, hệ thống blockchain đã sẵn sàng để sử dụng. Giờ đây, chúng tôi sẽ cho phép những khách hàng quan tâm trở thành thợ đào bằng cách cung cấp cho họ một chức năng khai thác
Python Blockchain – Tạo công cụ khai thác
Để cho phép khai thác, chúng ta cần phát triển một chức năng khai thác. Chức năng khai thác cần tạo thông báo về một chuỗi thông báo nhất định và cung cấp bằng chứng công việc. Hãy để chúng tôi thảo luận về điều này trong chương này.
Chức năng thông báo thông báo
Chúng tôi sẽ viết một hàm tiện ích có tên là sha256 để tạo thông báo về một thông báo nhất định
def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()
Hàm sha256 nhận một thông báo làm tham số, mã hóa nó thành ASCII, tạo một thông báo thập lục phân và trả về giá trị cho người gọi.
Chức năng khai thác
Bây giờ chúng tôi phát triển chức năng khai thác để thực hiện chiến lược khai thác của riêng mình. Chiến lược của chúng tôi trong trường hợp này sẽ là tạo một mã băm trên thông báo đã cho có tiền tố là số 1 cho trước. Số lượng nhất định của 1 được chỉ định làm tham số để khai thác chức năng được chỉ định là mức độ khó.
Ví dụ: nếu bạn chỉ định mức độ khó là 2, hàm băm được tạo trên một tin nhắn nhất định sẽ bắt đầu bằng hai chữ 1 – như 11xxxxxxxx. Nếu mức độ khó là 3, hàm băm được tạo phải bắt đầu bằng ba số 1 – như 111xxxxxxxx. Với những yêu cầu này, bây giờ chúng ta sẽ phát triển chức năng khai thác như được hiển thị trong các bước dưới đây.
Bước 1
Hàm khai thác nhận hai tham số – thông báo và mức độ khó.
def mine(message, difficulty=1):
Bước 2
Mức độ khó cần lớn hơn hoặc bằng 1, chúng tôi đảm bảo điều này với câu khẳng định sau:
assert difficulty >= 1
Bước 3
Chúng tôi tạo một biến tiền tố bằng cách sử dụng mức độ khó đã đặt.
prefix = '1' * difficulty
Lưu ý nếu mức độ khó là 2, tiền tố sẽ là “11” và nếu mức độ khó là 3, tiền tố sẽ là “111”, v.v. Chúng tôi sẽ kiểm tra xem tiền tố này có tồn tại trong bản tóm tắt thông báo được tạo hay không. Để thông báo chính nó, chúng tôi sử dụng hai dòng mã sau:
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
Chúng tôi tiếp tục thêm một số mới i vào băm thông báo trong mỗi lần lặp lại và tạo một thông báo mới về thông báo kết hợp. Khi đầu vào cho hàm sha256 thay đổi trong mỗi lần lặp, giá trị thông báo cũng sẽ thay đổi. Chúng tôi kiểm tra xem giá trị thông báo này có tiền tố đã đặt ở trên hay không .
if digest.startswith(prefix):
Nếu điều kiện được thỏa mãn, chúng ta sẽ kết thúc vòng lặp for và trả về giá trị thông báo cho người gọi. Toàn bộ mã mỏ được hiển thị ở đây
def mine(message, difficulty=1):
assert difficulty >= 1
prefix = '1' * difficulty
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
if digest.startswith(prefix):
print ("after " + str(i) + " iterations found nonce: "+ digest)
return digest
Đối với sự hiểu biết của bạn, chúng tôi đã thêm in tuyên bố rằng in các tiêu hóa giá trị và số lần lặp lại nó mất để đáp ứng điều kiện trước khi trở về từ hàm.
Kiểm tra chức năng khai thác
Để kiểm tra chức năng khai thác của chúng tôi, chỉ cần thực hiện câu lệnh sau:
mine ("test message", 2)
Khi bạn chạy đoạn mã trên, bạn sẽ thấy kết quả tương tự như bên dưới:
after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c
Lưu ý rằng thông báo được tạo bắt đầu bằng “11”. Nếu bạn thay đổi mức độ khó thành 3, thông báo được tạo sẽ bắt đầu bằng “111” và tất nhiên, nó có thể sẽ yêu cầu nhiều lần lặp hơn. Như bạn có thể thấy, một người khai thác có nhiều khả năng xử lý hơn sẽ có thể khai thác một tin nhắn nhất định sớm hơn. Đó là cách các thợ mỏ cạnh tranh với nhau để kiếm doanh thu của họ.
Bây giờ, chúng tôi đã sẵn sàng thêm nhiều khối hơn vào chuỗi khối của mình. Hãy để chúng tôi tìm hiểu điều này trong chương tiếp theo của chúng tôi.
Python Blockchain – Thêm khối
Mỗi người khai thác sẽ chọn các giao dịch từ một nhóm giao dịch đã tạo trước đó. Để theo dõi số lượng tin nhắn đã được khai thác, chúng ta phải tạo một biến toàn cục –
last_transaction_index = 0
Bây giờ chúng tôi sẽ có người khai thác đầu tiên của chúng tôi thêm một khối vào blockchain.
Thêm khối đầu tiên
Để thêm một khối mới, trước tiên chúng ta tạo một thể hiện của lớp Block .
block = Block()
Chúng tôi chọn 3 giao dịch hàng đầu từ hàng đợi
for i in range(3):
temp_transaction = transactions[last_transaction_index]
# validate transaction
Trước khi thêm giao dịch vào khối, người khai thác sẽ xác minh tính hợp lệ của giao dịch. Tính hợp lệ của giao dịch được xác minh bằng cách kiểm tra tính bình đẳng giữa hàm băm do người gửi cung cấp so với hàm băm do người khai thác tạo ra bằng cách sử dụng khóa công khai của người gửi. Ngoài ra, người khai thác sẽ xác minh rằng người gửi có đủ số dư để thanh toán cho giao dịch hiện tại.
Để ngắn gọn, chúng tôi chưa đưa chức năng này vào hướng dẫn. Sau khi giao dịch được xác thực, chúng tôi thêm nó vào danh sách verify_transactions trong trường hợp khối .
block.verified_transactions.append (temp_transaction)
Chúng tôi tăng chỉ số giao dịch cuối cùng để người khai thác tiếp theo sẽ nhận các giao dịch tiếp theo trong hàng đợi.
last_transaction_index += 1
Chúng tôi thêm chính xác ba giao dịch vào khối. Khi điều này được thực hiện, chúng tôi sẽ khởi tạo phần còn lại của các biến cá thể của lớp Block . Đầu tiên chúng tôi thêm băm của khối cuối cùng.
block.previous_block_hash = last_block_hash
Tiếp theo, chúng tôi khai thác khối với độ khó là 2.
block.Nonce = mine (block, 2)
Lưu ý rằng tham số đầu tiên của hàm mine là một đối tượng nhị phân. Bây giờ chúng tôi băm toàn bộ khối và tạo thông báo về nó.
digest = hash (block)
Cuối cùng, chúng tôi thêm khối đã tạo vào blockchain và khởi tạo lại biến toàn cục last_block_hash để sử dụng trong khối tiếp theo.
Toàn bộ mã để thêm khối được hiển thị bên dưới:
block = Block()
for i in range(3):
temp_transaction = transactions[last_transaction_index]
# validate transaction
# if valid
block.verified_transactions.append (temp_transaction)
last_transaction_index += 1
block.previous_block_hash = last_block_hash
block.Nonce = mine (block, 2)
digest = hash (block)
TPCoins.append (block)
last_block_hash = digest
Thêm các khối khác
Bây giờ chúng tôi sẽ thêm hai khối nữa vào blockchain của mình. Mã để thêm hai khối tiếp theo được đưa ra dưới đây:
# Miner 2 adds a block
block = Block()
for i in range(3):
temp_transaction = transactions[last_transaction_index]
# validate transaction
# if valid
block.verified_transactions.append (temp_transaction)
last_transaction_index += 1
block.previous_block_hash = last_block_hash
block.Nonce = mine (block, 2)digest = hash (block)
TPCoins.append (block)last_block_hash = digest
# Miner 3 adds a block
block = Block()
for i in range(3):
temp_transaction = transactions[last_transaction_index]
#display_transaction (temp_transaction)
# validate transaction
# if valid
block.verified_transactions.append (temp_transaction)
last_transaction_index += 1
block.previous_block_hash = last_block_hash
block.Nonce = mine (block, 2)
digest = hash (block)
TPCoins.append (block)
last_block_hash = digest
Khi bạn thêm hai khối này, bạn cũng sẽ thấy số lần lặp lại để tìm Nonce. Tại thời điểm này, blockchain của chúng tôi bao gồm hoàn toàn 4 khối bao gồm cả khối gốc.
Bán phá giá toàn bộ chuỗi khối
Bạn có thể xác minh nội dung của toàn bộ chuỗi khối bằng cách sử dụng câu lệnh sau:
dump_blockchain(TPCoins)
Bạn sẽ thấy đầu ra tương tự như kết quả được hiển thị bên dưới:
Number of blocks in the chain: 4
block # 0
sender: Genesis
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100ed272b52ccb539e2cd779
c6cc10ed1dfadf5d97c6ab6de90ed0372b2655626fb79f62d0e01081c163b0864cc68d426bbe943
8e8566303bb77414d4bfcaa3468ab7febac099294de10273a816f7047d4087b4bafa11f141544d4
8e2f10b842cab91faf33153900c7bf6c08c9e47a7df8aa7e60dc9e0798fb2ba3484bbdad2e44302
03010001
-----
value: 500.0
-----
time: 2019-01-14 16:18:02.042739
-----
--------------
=====================================
block # 1
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c492144a9f463
480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329ec86794b04d773e
b4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b47e5157f8fe56c2ce3279
c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311c4d866c12d79d3fc3034563dfb02
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e674abe7
abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8add126b6e1a1308f
b98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa9397704de625d1836d3f42c7ee
5683f6703259592cc24b09699376807f28fe0e00ff882974484d805f874260dfc2d1627473b9102
03010001
-----
value: 15.0
-----
time: 2019-01-14 16:18:01.859915
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c492144a9f463
480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329ec86794b04d773e
b4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b47e5157f8fe56c2ce3279
c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311c4d866c12d79d3fc3034563dfb02
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae143cbe59b
3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fbd9ee74b9e7ea12
334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0961b4f212d1fd5b5e49ae
09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d062375799742a359b8f22c5362e56502
03010001
-----
value: 6.0
-----
time: 2019-01-14 16:18:01.860966
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e674abe7
abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8add126b6e1a1308f
b98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa9397704de625d1836d3f42c7ee
5683f6703259592cc24b09699376807f28fe0e00ff882974484d805f874260dfc2d1627473b9102
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876f41338c
62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cce25be99452a81d
f4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47452590137869c25d9ff83
d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f00e321b65e4c33acaf6469e18e302
03010001
-----
value: 2.0
-----
time: 2019-01-14 16:18:01.861958
-----
--------------
=====================================
block # 2
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae143cbe59b
3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fbd9ee74b9e7ea12
334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0961b4f212d1fd5b5e49ae
09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d062375799742a359b8f22c5362e56502
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e674abe7
abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8add126b6e1a1308f
b98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa9397704de625d1836d3f42c7ee
5683f6703259592cc24b09699376807f28fe0e00ff882974484d805f874260dfc2d1627473b9102
03010001
-----
value: 4.0
-----
time: 2019-01-14 16:18:01.862946
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876f41338c
62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cce25be99452a81d
f4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47452590137869c25d9ff83
d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f00e321b65e4c33acaf6469e18e302
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae143cbe59b
3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fbd9ee74b9e7ea12
334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0961b4f212d1fd5b5e49ae
09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d062375799742a359b8f22c5362e56502
03010001
-----
value: 7.0
-----
time: 2019-01-14 16:18:01.863932
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e674abe7
abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8add126b6e1a1308f
b98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa9397704de625d1836d3f42c7ee
5683f6703259592cc24b09699376807f28fe0e00ff882974484d805f874260dfc2d1627473b9102
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae143cbe59b
3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fbd9ee74b9e7ea12
334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0961b4f212d1fd5b5e49ae
09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d062375799742a359b8f22c5362e56502
03010001
-----
value: 3.0
-----
time: 2019-01-14 16:18:01.865099
-----
--------------
=====================================
block # 3
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae143cbe59b
3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fbd9ee74b9e7ea12
334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0961b4f212d1fd5b5e49ae
09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d062375799742a359b8f22c5362e56502
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c492144a9f463
480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329ec86794b04d773e
b4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b47e5157f8fe56c2ce3279
c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311c4d866c12d79d3fc3034563dfb02
03010001
-----
value: 8.0
-----
time: 2019-01-14 16:18:01.866219
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae143cbe59b
3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fbd9ee74b9e7ea12
334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0961b4f212d1fd5b5e49ae
09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d062375799742a359b8f22c5362e56502
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e674abe7
abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8add126b6e1a1308f
b98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa9397704de625d1836d3f42c7ee
5683f6703259592cc24b09699376807f28fe0e00ff882974484d805f874260dfc2d1627473b9102
03010001
-----
value: 1.0
-----
time: 2019-01-14 16:18:01.867223
-----
--------------
sender:
30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876f41338c
62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cce25be99452a81d
f4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47452590137869c25d9ff83
d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f00e321b65e4c33acaf6469e18e302
03010001
-----
recipient:
30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c492144a9f463
480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329ec86794b04d773e
b4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b47e5157f8fe56c2ce3279
c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311c4d866c12d79d3fc3034563dfb02
03010001
-----
value: 5.0
-----
time: 2019-01-14 16:18:01.868241
-----
--------------
=====================================
Python Blockchain – Phạm vi và Kết luận
Trong hướng dẫn này, chúng ta đã học cách xây dựng một dự án blockchain bằng Python. Có rất nhiều khu vực mà bạn cần bổ sung thêm chức năng cho dự án này.
Ví dụ, bạn sẽ cần viết các hàm để quản lý hàng đợi giao dịch. Sau khi các giao dịch được khai thác và khối được khai thác được hệ thống chấp nhận, chúng không cần được lưu trữ nữa.
Ngoài ra, các thợ đào chắc chắn sẽ thích nhận các giao dịch với mức phí cao nhất. Đồng thời, bạn sẽ phải đảm bảo rằng các giao dịch có phí thấp hoặc miễn phí sẽ không bị chết đói mãi mãi.
Bạn sẽ cần phát triển các thuật toán để quản lý hàng đợi. Ngoài ra, hướng dẫn hiện tại không bao gồm mã giao diện máy khách. Bạn sẽ cần phát triển điều này cho cả khách hàng bình thường và thợ đào. Dự án blockchain chính thức sẽ chạy vào nhiều dòng mã hơn và nằm ngoài phạm vi của hướng dẫn này. Bạn đọc quan tâm có thể tải xuống nguồn bitcoin để nghiên cứu thêm.
Kết luận
Hướng dẫn rõ ràng này sẽ giúp bạn bắt đầu tạo dự án blockchain của riêng mình.
Để phát triển dự án blockchain chính thức, bạn có thể tìm hiểu thêm từ nguồn bitcoin . Đối với các dự án thương mại hoặc phi thương mại lớn hơn, bạn có thể cân nhắc sử dụng Ethereum – một nền tảng ứng dụng blockchain sẵn sàng sử dụng.