Blockchain là thông tin nổi bật hiện nay đang thống trị các xu hướng phát triển phần mềm. Việc phát triển và thiết kế Blockchain liên quan đến ba thành phần chính: máy khách, người khai thác và chuỗi khối. Hướng dẫn này nhằm cung cấp cho bạn hiểu biết rõ ràng về quá trình xây dựng blockchain của riêng bạn.
Bất kỳ người đam mê lập trình nào muốn bắt kịp xu hướng phát triển Blockchain gần đây đều có thể thu được lợi ích từ hướng dẫn này. Nếu bạn là một người học muốn tìm hiểu những kiến thức cơ bản về Phát triển Blockchain, thì hướng dẫn này rất phù hợp với nhu cầu của bạn
Hướng dẫn này được viết với giả định rằng người học có ý tưởng về lập trình bằng Python và ý tưởng cơ bản về Blockchain. Nếu bạn chưa quen với bất kỳ khái niệm nào trong số này, chúng tôi khuyên bạn nên chọn các hướng dẫn dựa trên các khái niệm này trước khi bạn tham gia vào hướng dẫn này
Python Blockchain – Giới thiệu
Trong phần hướng dẫn về Blockchain, chúng ta đã tìm hiểu chi tiết về lý thuyết đằng sau blockchain. Blockchain là khối xây dựng cơ bản đằng sau đồng tiền kỹ thuật số phổ biến nhất thế giới Bitcoin. Hướng dẫn giải quyết sâu sắc những phức tạp của Bitcoin, giải thích đầy đủ về kiến trúc blockchain. Bước tiếp theo là xây dựng blockchain của riêng chúng tôi.
Satoshi Nakamoto đã tạo ra đồng tiền ảo đầu tiên trên thế giới có tên là Bitcoin. Nhìn vào sự thành công của Bitcoin, nhiều người khác đã tạo ra các loại tiền ảo của riêng họ. Để kể tên một số – Litecoin, Zcash, v.v.
Bây giờ, bạn cũng có thể muốn khởi chạy tiền tệ của riêng mình. Hãy để chúng tôi gọi đây là TPCoin (TutorialsPoint Coin). Bạn sẽ viết một blockchain để ghi lại tất cả các giao dịch giao dịch với TPCoin. TPCoin có thể được sử dụng để mua Pizza, Burger, Salad, v.v. Có thể có các nhà cung cấp dịch vụ khác tham gia vào mạng lưới của bạn và bắt đầu chấp nhận TPCoin làm đơn vị tiền tệ để cung cấp dịch vụ của họ. Khả năng là vô tận.
Trong hướng dẫn này, hãy để chúng tôi hiểu cách xây dựng một hệ thống như vậy và khởi chạy đồng tiền kỹ thuật số của riêng bạn trên thị trường.
Các thành phần tham gia vào phát triển dự án chuỗi khối
Toàn bộ quá trình phát triển dự án blockchain bao gồm ba thành phần chính:
- Khách hàng
- Thợ mỏ
- Chuỗi khối
Khách hàng
Khách hàng là người sẽ mua hàng hóa từ các nhà cung cấp khác. Bản thân khách hàng có thể trở thành người bán hàng và sẽ nhận tiền từ người khác đối với hàng hóa mà anh ta cung cấp. Ở đây chúng tôi giả định rằng khách hàng có thể vừa là nhà cung cấp vừa là người nhận TPCoins. Vì vậy, chúng tôi sẽ tạo một lớp khách hàng trong mã của chúng tôi có khả năng gửi và nhận tiền.
Thợ mỏ
Người khai thác là người chọn các giao dịch từ một nhóm giao dịch và tập hợp chúng thành một khối. Người khai thác phải cung cấp bằng chứng công việc hợp lệ để nhận được phần thưởng khai thác. Tất cả số tiền mà người khai thác thu như một khoản phí sẽ được anh ta giữ. Anh ta có thể chi số tiền đó để mua hàng hóa hoặc dịch vụ từ các nhà cung cấp đã đăng ký khác trên mạng, giống như cách Khách hàng đã mô tả ở trên.
Chuỗi khối
Cuối cùng, Blockchain là một cấu trúc dữ liệu chuỗi tất cả các khối được khai thác theo thứ tự thời gian. Chuỗi này là bất biến và do đó chống nóng.
Bạn có thể làm theo hướng dẫn này bằng cách gõ mã được trình bày trong từng bước trong một sổ ghi chép Jupyter mới. Ngoài ra, bạn có thể tải xuống toàn bộ sổ ghi chép Jupyter từ www.anaconda.com . Trong chương tiếp theo, chúng tôi sẽ phát triển một ứng dụng khách sử dụng hệ thống blockchain của chúng tôi.
Python Blockchain – Đang phát triển khách hàng
Khách hàng là một người nào đó nắm giữ TPCoins và giao dịch chúng cho hàng hóa / dịch vụ từ các nhà cung cấp khác trên mạng bao gồm cả của chính anh ta. Chúng ta nên xác định một lớp Client cho mục đích này. Để tạo nhận dạng duy nhất trên toàn cầu cho khách hàng, chúng tôi sử dụng PKI (Cơ sở hạ tầng khóa công khai). Trong chương này, chúng ta hãy nói về điều này một cách chi tiết.
Khách hàng sẽ có thể gửi tiền từ ví của mình cho một người khác đã biết. Tương tự, khách hàng sẽ có thể nhận tiền từ bên thứ ba. Để tiêu tiền, khách hàng sẽ tạo một giao dịch ghi rõ tên người gửi và số tiền phải trả. Để nhận tiền, khách hàng sẽ cung cấp danh tính của mình cho bên thứ ba – về cơ bản là người gửi tiền. Chúng tôi không lưu trữ số dư tiền mà khách hàng giữ trong ví của mình. Trong quá trình giao dịch, chúng tôi sẽ tính toán số dư thực tế để đảm bảo rằng khách hàng có đủ số dư để thực hiện thanh toán. Để phát triển lớp Client và cho phần còn lại của mã trong dự án, chúng ta sẽ cần nhập nhiều thư viện Python. Chúng được liệt kê dưới đây
# import libraries
import hashlib
import random
import string
import json
import binascii
import numpy as np
import pandas as pd
import pylab as pl
import logging
import datetime
import collections
Ngoài các thư viện tiêu chuẩn ở trên, chúng tôi sẽ ký các giao dịch của mình, tạo hàm băm của các đối tượng, v.v. Đối với điều này, bạn sẽ cần nhập các thư viện sau:
# following imports are required by PKI
import Crypto
import Crypto.Random
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5
Python Blockchain – Lớp khách hàng
Lớp Khách hàng tạo ra các khóa riêng tư và khóa công khai bằng cách sử dụng thuật toán Python RSA được tích hợp sẵn . Người đọc quan tâm có thể tham khảo hướng dẫn này để thực hiện RSA. Trong quá trình khởi tạo đối tượng, chúng tôi tạo khóa riêng tư và khóa công khai và lưu trữ các giá trị của chúng trong biến cá thể.
self._private_key = RSA.generate(1024, random)
self._public_key = self._private_key.publickey()
Lưu ý rằng bạn không bao giờ được làm mất khóa cá nhân của mình. Để lưu trữ hồ sơ, khóa cá nhân đã tạo có thể được sao chép trên bộ nhớ ngoài được bảo mật hoặc bạn có thể chỉ cần viết ra biểu diễn ASCII của nó trên một mảnh giấy. Khóa công khai được tạo sẽ được sử dụng làm danh tính của khách hàng. Đối với điều này, chúng tôi xác định một thuộc tính được gọi là danh tính trả về biểu diễn HEX của khóa công khai.
@property
def identity(self):
return
binascii.hexlify(self._public_key.exportKey(format='DER'))
.decode('ascii')
Danh tính là duy nhất cho mỗi khách hàng và có thể được công bố công khai. Bất kỳ ai cũng có thể gửi tiền ảo cho bạn bằng cách sử dụng danh tính này và nó sẽ được thêm vào ví của bạn. Mã đầy đủ cho lớp Khách hàng được hiển thị ở đây
class Client:
def __init__(self):
random = Crypto.Random.new().read
self._private_key = RSA.generate(1024, random)
self._public_key = self._private_key.publickey()
self._signer = PKCS1_v1_5.new(self._private_key)
@property
def identity(self):
return
binascii.hexlify(self._public_key.exportKey(format='DER')).decode('ascii')
class Client:
def __init__(self):
random = Crypto.Random.new().read
self._private_key = RSA.generate(1024, random)
self._public_key = self._private_key.publickey()
self._signer = PKCS1_v1_5.new(self._private_key)
@property
def identity(self):
return
binascii.hexlify(self._public_key.exportKey(format='DER')).decode('ascii')
Kiểm tra khách hàng
Bây giờ, chúng ta sẽ viết mã minh họa cách sử dụng lớp Khách hàng
Dinesh = Client()
print (Dinesh.identity)
Đoạn mã trên tạo một thể hiện của Máy khách và gán nó cho biến Dinesh . Chúng tôi in khóa công khai của Dinesh bằng cách gọi phương thức nhận dạng của nó . Kết quả được hiển thị ở đây
30819f300d06092a864886f70d010101050003818d0030818902818100b547fafceeb131e07
0166a6b23fec473cce22c3f55c35ce535b31d4c74754fecd820aa94c1166643a49ea5f49f72
3181ff943eb3fdc5b2cb2db12d21c06c880ccf493e14dd3e93f3a9e175325790004954c34d3
c7bc2ccc9f0eb5332014937f9e49bca9b7856d351a553d9812367dc8f2ac734992a4e6a6ff6
6f347bd411d07f0203010001
Python Blockchain – Lớp giao dịch
Trong chương này, chúng ta hãy tạo một lớp Giao dịch để khách hàng có thể gửi tiền cho ai đó. Lưu ý rằng khách hàng có thể vừa là người gửi hoặc vừa là người nhận tiền. Khi bạn muốn nhận tiền, một số người gửi khác sẽ tạo một giao dịch và chỉ định địa chỉ công khai của bạn trong đó. Chúng tôi định nghĩa việc khởi tạo một lớp giao dịch như sau:
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
Các init phương pháp có ba thông số – của người gửi công cộng quan trọng, của người nhận công cộng quan trọng, và số tiền được gửi đi. Chúng được lưu trữ trong các biến cá thể để sử dụng bởi các phương thức khác. Ngoài ra, chúng tôi tạo thêm một biến để lưu trữ thời gian giao dịch.
Tiếp theo, chúng ta viết một phương thức tiện ích có tên là to_dict kết hợp tất cả bốn biến phiên bản nêu trên trong một đối tượng từ điển. Điều này chỉ là để đưa toàn bộ thông tin giao dịch có thể truy cập được thông qua một biến duy nhất. Như bạn đã biết từ hướng dẫn trước đó rằng khối đầu tiên trong blockchain là khối Genesis . Khối Genesis chứa giao dịch đầu tiên do người tạo ra blockchain khởi xướng. Danh tính của người này có thể được giữ bí mật như trong trường hợp của Bitcoin. Vì vậy, khi giao dịch đầu tiên này được tạo, người tạo có thể chỉ gửi danh tính của mình là Genesis . Do đó, trong khi tạo từ điển, chúng tôi kiểm tra xem người gửi có phải là Genesis hay không và nếu có, chúng tôi chỉ cần gán một số giá trị chuỗi cho biến nhận dạng; nếu không, chúng tôi chỉ định danh tính của người gửi cho biến nhận dạng .
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
Chúng tôi xây dựng từ điển bằng cách sử dụng dòng mã sau
return collections.OrderedDict({
'sender': identity,
'recipient': self.recipient,
'value': self.value,
'time' : self.time})
Toàn bộ mã cho phương thức to_dict được hiển thị bên dưới:
def to_dict(self):
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
return collections.OrderedDict({
'sender': identity,
'recipient': self.recipient,
'value': self.value,
'time' : self.time})
Cuối cùng, chúng tôi sẽ ký đối tượng từ điển này bằng cách sử dụng khóa riêng của người gửi. Như trước đây, chúng tôi sử dụng PKI tích hợp với thuật toán SHA. Chữ ký đã tạo được giải mã để lấy biểu diễn ASCII để in và lưu trữ nó trong chuỗi khối của chúng tôi. Các sign_transaction phương pháp mã được hiển thị ở đây
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_v1_5.new(private_key)
h = SHA.new(str(self.to_dict()).encode('utf8'))
return binascii.hexlify(signer.sign(h)).decode('ascii')
Bây giờ chúng ta sẽ kiểm tra lớp Giao dịch này
Kiểm tra lớp giao dịch
Với mục đích này, chúng tôi sẽ tạo hai người dùng, được gọi là Dinesh và Ramesh . Dinesh sẽ gửi 5 TPCoins cho Ramesh. Đầu tiên, chúng tôi tạo các khách hàng có tên là Dinesh và Ramesh.
Dinesh = Client()
Ramesh = Client()
Hãy nhớ rằng khi bạn khởi tạo một lớp Máy khách , các khóa công khai và riêng tư duy nhất cho máy khách sẽ được tạo. Vì Dinesh đang gửi thanh toán cho Ramesh, anh ta sẽ cần khóa công khai của Ramesh, khóa này có được bằng cách sử dụng thuộc tính nhận dạng của khách hàng. Do đó, chúng tôi sẽ tạo phiên bản giao dịch bằng cách sử dụng mã sau:
t = Transaction(
Dinesh,
Ramesh.identity,
5.0
)
Lưu ý rằng tham số đầu tiên là người gửi, tham số thứ hai là khóa công khai của người nhận và tham số thứ ba là số tiền cần chuyển. Các sign_transaction phương pháp lấy private key của người gửi từ tham số đầu tiên cho hát giao dịch. Sau khi đối tượng giao dịch được tạo, bạn sẽ ký nó bằng cách gọi phương thức sign_transaction của nó . Phương thức này trả về chữ ký đã tạo ở định dạng có thể in được. Chúng tôi tạo và in chữ ký bằng hai dòng mã sau:
signature = t.sign_transaction()
print (signature)
Khi bạn chạy đoạn mã trên, bạn sẽ thấy đầu ra tương tự như sau:
7c7e3c97629b218e9ec6e86b01f9abd8e361fd69e7d373c38420790b655b9abe3b575e343c7
13703ca1aee781acd7157a0624db3d57d7c2f1172730ee3f45af943338157f899965856f6b0
0e34db240b62673ad5a08c8e490f880b568efbc36035cae2e748f1d802d5e8e66298be826f5
c6363dc511222fb2416036ac04eb972
Bây giờ khi cơ sở hạ tầng cơ bản của chúng tôi để tạo khách hàng và giao dịch đã sẵn sàng, giờ đây chúng tôi sẽ có nhiều khách hàng thực hiện nhiều giao dịch như trong một tình huống thực tế.