Với sự gia tăng hiện tại của tiền điện tử, blockchain đang tạo ra tiếng vang trong thế giới công nghệ. Công nghệ này đã thu hút rất nhiều sự chú ý chủ yếu là do khả năng đảm bảo an ninh, thực thi phân cấp và đẩy nhanh các quy trình đối với một số ngành—đặc biệt là đối với ngành tài chính.
Về cơ bản, chuỗi khối là một cơ sở dữ liệu công cộng ghi lại tài liệu và xác thực việc sở hữu và truyền tài sản kỹ thuật số một cách không thể đảo ngược. Các loại tiền kỹ thuật số, như Bitcoin và Ethereum, dựa trên khái niệm này. Chuỗi khối là một công nghệ thú vị mà bạn có thể sử dụng để biến đổi khả năng của các ứng dụng của mình.
Gần đây, chúng ta đã thấy các chính phủ, tổ chức và cá nhân sử dụng công nghệ chuỗi khối để tạo ra tiền điện tử của riêng họ—và tránh bị bỏ lại phía sau. Đáng chú ý, khi Facebook đề xuất tiền điện tử của riêng mình, được gọi là Libra, thông báo này đã khuấy động nhiều vùng biển trên khắp thế giới.
Điều gì sẽ xảy ra nếu bạn cũng có thể làm theo và tạo phiên bản tiền điện tử của riêng mình?
Tôi đã nghĩ về điều này và quyết định phát triển một thuật toán tạo ra tiền điện tử.
Tôi quyết định gọi tiền điện tử fccCoin.
Trong hướng dẫn này, tôi sẽ minh họa quy trình từng bước mà tôi đã sử dụng để xây dựng đồng tiền kỹ thuật số (tôi đã sử dụng các khái niệm hướng đối tượng của ngôn ngữ lập trình Python).
Đây là kế hoạch chi tiết cơ bản của thuật toán chuỗi khối để tạo fccCoin:
class Block:
def __init__():
#first block class
pass
def calculate_hash():
#calculates the cryptographic hash of every block
class BlockChain:
def __init__(self):
# constructor method
pass
def construct_genesis(self):
# constructs the initial block
pass
def construct_block(self, proof_no, prev_hash):
# constructs a new block and adds it to the chain
pass
@staticmethod
def check_validity():
# checks whether the blockchain is valid
pass
def new_data(self, sender, recipient, quantity):
# adds a new transaction to the data of the transactions
pass
@staticmethod
def construct_proof_of_work(prev_proof):
# protects the blockchain from attack
pass
@property
def last_block(self):
# returns the last block in the chain
return self.chain[-1]
Bây giờ, hãy để tôi giải thích những gì đang diễn ra…
1. Xây dựng lớp Block đầu tiên
Một chuỗi khối bao gồm một số khối được liên kết với nhau (nghe có vẻ quen thuộc phải không?).
Việc xâu chuỗi các khối diễn ra sao cho nếu một khối bị giả mạo, phần còn lại của chuỗi sẽ không hợp lệ.
Khi áp dụng khái niệm trên, tôi đã tạo lớp khối ban đầu sau:
import hashlib
import time
class Block:
def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
self.index = index
self.proof_no = proof_no
self.prev_hash = prev_hash
self.data = data
self.timestamp = timestamp or time.time()
@property
def calculate_hash(self):
block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
self.prev_hash, self.data,
self.timestamp)
return hashlib.sha256(block_of_string.encode()).hexdigest()
def __repr__(self):
return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
self.prev_hash, self.data,
self.timestamp)
Như bạn có thể thấy từ đoạn mã trên, tôi đã xác định __trong đó__() chức năng, sẽ được thực thi khi Chặn lớp đang được bắt đầu, giống như trong bất kỳ lớp Python nào khác.
Tôi đã cung cấp các tham số sau cho chức năng khởi tạo:
- bản thân—điều này đề cập đến trường hợp của Chặn lớp, giúp có thể truy cập các phương thức và thuộc tính được liên kết với lớp;
- mục lục—điều này theo dõi vị trí của khối trong chuỗi khối;
- bằng chứng_không—đây là số được tạo ra trong quá trình tạo một khối mới (được gọi là khai thác);
- prev_hash—điều này đề cập đến hàm băm của khối trước đó trong chuỗi;
- dữ liệu—điều này cung cấp một bản ghi của tất cả các giao dịch đã hoàn thành, chẳng hạn như số lượng đã mua;
- dấu thời gian—điều này đặt một dấu thời gian cho các giao dịch.
Phương thức thứ hai trong lớp, tính toán_hash, sẽ tạo hàm băm của các khối bằng cách sử dụng các giá trị trên. Mô-đun SHA-256 được nhập vào dự án để hỗ trợ lấy giá trị băm của các khối.
Sau khi các giá trị đã được nhập vào thuật toán băm mật mã, hàm sẽ trả về một chuỗi 256 bit biểu thị nội dung của khối.
Đây là cách bảo mật đạt được trong các chuỗi khối—mỗi khối sẽ có một hàm băm và hàm băm đó sẽ dựa vào hàm băm của khối trước đó.
Như vậy, nếu ai đó cố gắng xâm phạm bất kỳ khối nào trong chuỗi, các khối khác sẽ có giá trị băm không hợp lệ, dẫn đến sự gián đoạn của toàn bộ mạng chuỗi khối.
Cuối cùng, một khối sẽ trông như thế này:
{
"index": 2,
"proof": 21,
"prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823",
"transactions": [
{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}
],
"timestamp": 1521646442.4096143
}
2. Xây dựng lớp Blockchain
Ý tưởng chính của một chuỗi khối, đúng như tên gọi của nó, liên quan đến việc “xâu chuỗi” một số khối với nhau.
Vì vậy, tôi sẽ xây dựng một Chuỗi khối lớp sẽ hữu ích trong việc quản lý hoạt động của toàn bộ chuỗi. Đây là nơi mà hầu hết các hành động sẽ diễn ra.
Các chuỗi khối lớp sẽ có các phương thức trợ giúp khác nhau để hoàn thành các nhiệm vụ khác nhau trong chuỗi khối.
Hãy để tôi giải thích vai trò của từng phương thức trong lớp.
một. phương pháp xây dựng
Phương pháp này đảm bảo chuỗi khối được khởi tạo.
class BlockChain:
def __init__(self):
self.chain = []
self.current_data = []
self.nodes = set()
self.construct_genesis()
Dưới đây là vai trò của các thuộc tính của nó:
- self.chain—biến này giữ tất cả các khối;
- self.current_data—biến này giữ tất cả các giao dịch đã hoàn thành trong khối;
- self.construct_genesis()—phương pháp này sẽ đảm nhiệm việc xây dựng khối ban đầu.
b. Xây dựng khối genesis
Chuỗi khối yêu cầu một construct_genesis phương pháp xây dựng khối ban đầu trong chuỗi. Trong quy ước chuỗi khối, khối này đặc biệt vì nó tượng trưng cho sự khởi đầu của chuỗi khối.
Trong trường hợp này, hãy xây dựng nó bằng cách chuyển một số giá trị mặc định cho construct_block phương pháp.
tôi đã cho cả hai bằng chứng_không và prev_hash giá trị bằng 0, mặc dù bạn có thể cung cấp bất kỳ giá trị nào bạn muốn.
def construct_genesis(self):
self.construct_block(proof_no=0, prev_hash=0)
def construct_block(self, proof_no, prev_hash):
block = Block(
index=len(self.chain),
proof_no=proof_no,
prev_hash=prev_hash,
data=self.current_data)
self.current_data = []
self.chain.append(block)
return block
c. Xây dựng khối mới
Các construct_block phương thức được sử dụng để tạo các khối mới trong chuỗi khối.
Đây là những gì đang diễn ra với các thuộc tính khác nhau của phương pháp này:
- mục lục—điều này thể hiện độ dài của chuỗi khối;
- proof_nor & prev_hash—phương thức người gọi vượt qua chúng;
- dữ liệu—cái này chứa một bản ghi của tất cả các giao dịch không được bao gồm trong bất kỳ khối nào trên nút;
- self.current_data—cái này được sử dụng để đặt lại danh sách giao dịch trên nút. Nếu một khối đã được tạo và các giao dịch được phân bổ cho khối đó, danh sách sẽ được đặt lại để đảm bảo rằng các giao dịch trong tương lai được thêm vào danh sách này. Và, quá trình này sẽ diễn ra liên tục;
- self.chain.append()—phương pháp này nối các khối mới được xây dựng vào chuỗi;
- trở lại—cuối cùng, một đối tượng khối được xây dựng được trả về.
d. Kiểm tra tính hợp lệ
Các check_validity phương pháp này rất quan trọng trong việc đánh giá tính toàn vẹn của chuỗi khối và đảm bảo không có sự bất thường.
Như đã đề cập trước đó, hàm băm rất cần thiết cho tính bảo mật của chuỗi khối vì ngay cả một thay đổi nhỏ nhất trong đối tượng cũng sẽ dẫn đến việc tạo ra một hàm băm hoàn toàn mới.
Vì vậy, điều này check_validity phương pháp sử dụng nếu các câu lệnh để kiểm tra xem hàm băm của mọi khối có đúng không.
Nó cũng xác minh xem mọi khối có trỏ đến khối bên phải trước đó hay không, thông qua so sánh giá trị băm của chúng. Nếu mọi thứ đều đúng, nó sẽ trả về true; ngược lại, nó trả về false.
@staticmethod
def check_validity(block, prev_block):
if prev_block.index + 1 != block.index:
return False
elif prev_block.calculate_hash != block.prev_hash:
return False
elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no):
return False
elif block.timestamp <= prev_block.timestamp:
return False
return True
đ. Bổ sung dữ liệu giao dịch
Các dữ liệu mới phương pháp được sử dụng để thêm dữ liệu của các giao dịch vào một khối. Đó là một phương pháp rất đơn giản: nó chấp nhận ba tham số (chi tiết người gửi, chi tiết người nhận và số lượng) và nối thêm dữ liệu giao dịch vào self.current_data danh sách.
Bất cứ khi nào một khối mới được tạo, danh sách này được phân bổ cho khối đó và đặt lại một lần nữa như được giải thích trong construct_block phương pháp.
Khi dữ liệu giao dịch đã được thêm vào danh sách, chỉ mục của khối tiếp theo được tạo sẽ được trả về.
Chỉ số này được tính bằng cách thêm 1 vào chỉ mục của khối hiện tại (là khối cuối cùng trong chuỗi khối). Dữ liệu sẽ hỗ trợ người dùng gửi giao dịch trong tương lai.
def new_data(self, sender, recipient, quantity):
self.current_data.append({
'sender': sender,
'recipient': recipient,
'quantity': quantity
})
return True
f. Thêm bằng chứng về công việc
Bằng chứng về công việc là một khái niệm ngăn cản việc lạm dụng blockchain. Đơn giản, mục tiêu của nó là xác định một số giải quyết được vấn đề sau khi hoàn thành một lượng công việc tính toán nhất định.
Nếu mức độ khó xác định số cao, nó không khuyến khích gửi thư rác và giả mạo chuỗi khối.
Trong trường hợp này, chúng tôi sẽ sử dụng một thuật toán đơn giản không khuyến khích mọi người khai thác khối hoặc tạo khối một cách dễ dàng.
@staticmethod
def proof_of_work(last_proof):
'''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
f is the previous f'
f' is the new proof
'''
proof_no = 0
while BlockChain.verifying_proof(proof_no, last_proof) is False:
proof_no += 1
return proof_no
@staticmethod
def verifying_proof(last_proof, proof):
#verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?
guess = f'{last_proof}{proof}'.encode()
guess_hash = hashlib.sha256(guess).hexdigest()
return guess_hash[:4] == "0000"
g. Lấy khối cuối cùng
Cuối cùng, latest_block method là một phương thức trợ giúp hỗ trợ lấy khối cuối cùng trong chuỗi khối. Hãy nhớ rằng khối cuối cùng thực sự là khối hiện tại trong chuỗi.
@property
def latest_block(self):
return self.chain[-1]
Hãy tổng hợp mọi thứ lại với nhau
Đây là toàn bộ mã để tạo fccCoin tiền điện tử.
Bạn cũng có thể lấy mã trên kho lưu trữ GitHub này.
import hashlib
import time
class Block:
def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
self.index = index
self.proof_no = proof_no
self.prev_hash = prev_hash
self.data = data
self.timestamp = timestamp or time.time()
@property
def calculate_hash(self):
block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
self.prev_hash, self.data,
self.timestamp)
return hashlib.sha256(block_of_string.encode()).hexdigest()
def __repr__(self):
return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
self.prev_hash, self.data,
self.timestamp)
class BlockChain:
def __init__(self):
self.chain = []
self.current_data = []
self.nodes = set()
self.construct_genesis()
def construct_genesis(self):
self.construct_block(proof_no=0, prev_hash=0)
def construct_block(self, proof_no, prev_hash):
block = Block(
index=len(self.chain),
proof_no=proof_no,
prev_hash=prev_hash,
data=self.current_data)
self.current_data = []
self.chain.append(block)
return block
@staticmethod
def check_validity(block, prev_block):
if prev_block.index + 1 != block.index:
return False
elif prev_block.calculate_hash != block.prev_hash:
return False
elif not BlockChain.verifying_proof(block.proof_no,
prev_block.proof_no):
return False
elif block.timestamp <= prev_block.timestamp:
return False
return True
def new_data(self, sender, recipient, quantity):
self.current_data.append({
'sender': sender,
'recipient': recipient,
'quantity': quantity
})
return True
@staticmethod
def proof_of_work(last_proof):
'''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
f is the previous f'
f' is the new proof
'''
proof_no = 0
while BlockChain.verifying_proof(proof_no, last_proof) is False:
proof_no += 1
return proof_no
@staticmethod
def verifying_proof(last_proof, proof):
#verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?
guess = f'{last_proof}{proof}'.encode()
guess_hash = hashlib.sha256(guess).hexdigest()
return guess_hash[:4] == "0000"
@property
def latest_block(self):
return self.chain[-1]
def block_mining(self, details_miner):
self.new_data(
sender="0", #it implies that this node has created a new block
receiver=details_miner,
quantity=
1, #creating a new block (or identifying the proof number) is awarded with 1
)
last_block = self.latest_block
last_proof_no = last_block.proof_no
proof_no = self.proof_of_work(last_proof_no)
last_hash = last_block.calculate_hash
block = self.construct_block(proof_no, last_hash)
return vars(block)
def create_node(self, address):
self.nodes.add(address)
return True
@staticmethod
def obtain_block_object(block_data):
#obtains block object from the block data
return Block(
block_data['index'],
block_data['proof_no'],
block_data['prev_hash'],
block_data['data'],
timestamp=block_data['timestamp'])
Bây giờ, hãy kiểm tra mã của chúng tôi để xem nó có hoạt động không.
blockchain = BlockChain()
print("***Mining fccCoin about to start***")
print(blockchain.chain)
last_block = blockchain.latest_block
last_proof_no = last_block.proof_no
proof_no = blockchain.proof_of_work(last_proof_no)
blockchain.new_data(
sender="0", #it implies that this node has created a new block
recipient="Quincy Larson", #let's send Quincy some coins!
quantity=
1, #creating a new block (or identifying the proof number) is awarded with 1
)
last_hash = last_block.calculate_hash
block = blockchain.construct_block(proof_no, last_hash)
print("***Mining fccCoin has been successful***")
print(blockchain.chain)
Nó đã làm việc!
Đây là đầu ra của quá trình khai thác:
***Mining fccCoin about to start***
[0 - 0 - 0 - [] - 1566930640.2707076]
***Mining fccCoin has been successful***
[0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243]
Phần kết luận
Ở đó bạn có nó!
Đó là cách bạn có thể tạo chuỗi khối của riêng mình bằng Python.
Hãy để tôi nói rằng hướng dẫn này chỉ trình bày các khái niệm cơ bản để bạn bắt đầu làm quen với công nghệ chuỗi khối sáng tạo.
Nếu đồng xu này được triển khai nguyên trạng, nó không thể đáp ứng nhu cầu thị trường hiện tại về một loại tiền điện tử ổn định, an toàn và dễ sử dụng.
Do đó, nó vẫn có thể được cải thiện bằng cách thêm các tính năng bổ sung để nâng cao khả năng khai thác và gửi các giao dịch tài chính.
Tuy nhiên, đó là một điểm khởi đầu tốt nếu bạn quyết định làm cho tên tuổi của mình được biết đến trong thế giới tuyệt vời của tiền điện tử.
Nếu bạn có bất kỳ ý kiến hoặc câu hỏi, xin vui lòng gửi chúng dưới đây.
Mã hóa (tiền điện tử) vui vẻ!