央行数字货币DECP钱包内测截图
随着加密货币的兴起,区块链技术逐渐进入大众的视野。这项技术之所以吸引如此多的关注,主要是因为它具有分布式、可追溯性、共识机制、安全性、高可用性和不变性等特性。区块链本质上是一个公共数据库,它记录和认证数字资产的持有和传输,并且不可逆,像比特币和以太坊这样的数字货币就是基于这个概念。
很多政府、组织和个人都在使用区块链技术来创建自己的加密货币,世界社交媒体巨头Facebook主导的Libra数字货币项目发布了新版Libra白皮书,最近关于中国人民银行数字货币DCEP进入市场测试也见诸众多媒体报道。
那么我们能否效仿并建立自己的加密货币呢?在本教程中,我们会用 Python 来逐步说明构建数字货币的过程,我们把将要创建的加密货币命名为PyCoin,下面是创建PyCoin的区块链算法基本蓝图:
class Block:
def __init__():
#第一个区块类
pass
def calculate_hash():
#计算每一个区块的哈希值
class BlockChain:
def __init__(self):
# 构造方法
pass
def construct_genesis(self):
# 构建初始区块
pass
def construct_block(self, proof_no, prev_hash):
# 构建新的区块并添加到区块链
pass
@staticmethod
def check_validity():
# 检验区块链是否有效
pass
def new_data(self, sender, recipient, quantity):
# 添加一个新的交易数据
pass
@staticmethod
def construct_proof_of_work(prev_proof):
# 避免区块链被攻击
pass
@property
def last_block(self):
# 返回链上最后一个区块
return self.chain[-1]
一、创建第一个区块的类
区块链由多个相互连接的区块组成,如果一个区块被篡改,那么链上的其它部分将变得无效。对应以上概念,我们创建以下的初始区块类函数:
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)
从上面的代码中可以看到,我们定义了 __init__()
函数,该函数将在启动Block
类时执行,就像 Python 中其他任何类中一样。
我们为初始函数定义以下参数:
self
:引用Block
类的实例,从而可以访问与该类关联的方法和属性;
index
:记录某个区块在区块链中的位置;
proof_no
:在创建新区块(即挖矿)期间产生的数量;
prev_hash
:指上一个区块的哈希值;
data
:记录所有已完成的交易,例如购买数量;
timestamp
:标记交易的时间戳
类中的第二个方法calculate_hash
将由上一个区块的哈希值来生成当前区块的哈希值,SHA-256算法模块将被导入用来获得区块的哈希值。
当值输入加密哈希算法中后,该函数将返回一个256位的字符串,表示该区块所包含的内容。
这就是为什么区块链具有安全性这一特征,因为每个区块都有一个哈希值,而该哈希值将依赖于前一个区块的哈希值。因此,如果有人试图篡改链中的任何区块,其他区块将具有无效的哈希值,从而破坏整个区块链网络。
最终一个区块将会是像下面这样:
{
"index": 2,
"proof": 21,
"prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823",
"transactions": [
{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}
],
"timestamp": 1521646442.4096143
}
二、创建区块链的类
顾名思义,区块链的主要思想是将多个区块相互“链接”。因此我们将构建一个blockchain
类,该类将对管理整个链的运行至关重要。blockchain
类具有各种辅助方法来完成区块链中的任务。
下面我们解释一下每个方法在类中的作用:
a、构造函数方法
这个方法确保区块链能被实例化。
class BlockChain:
def __init__(self):
self.chain = []
self.current_data = []
self.nodes = set()
self.construct_genesis()
下面是其属性的作用:
self.chain:该变量保存所有区块;
self.current_data:该变量保存所有完成交易的区块;
self.construct_genesis():该方法负责构建初始区块
b、构建创世区块
区块链中需要用construct_genesis
方法来构建链上的初始区块。惯例上,此区块比较特殊,因为它象征着区块链的开始。因此我们只需将一些默认值传递给Construct_block
方法来构造它。例如我们可以给proof_no
和prev_hash
赋一个零值。
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、构建新的区块