赞
踩
区块链现在有多火看看比特币的价格也就知道了,不过作为一个有逼格的程序员,我们不应只关注到币的价值(为啥我没去买比特币,T-T),而应该去关注技术的本质,这个号称“第四次工业革命”的区块链技术。不过很多人估计对这个技术不太了解,包括我自己。既然不懂不如自己动手撸一个,实践出真知。在翻阅文章的时候刚好找到了这篇文章,下面让我们自己动手搭建一个简单的区块链。
简单的说,区块链就是一个不可变、有序的链(chain)结构,链中保存着称之为块(block)的记录,这些记录可以是交易,文件或是任意你想要的数据。其中重要的是它们通过哈希链接在一起。
如果你不懂哈希,可以查看一下这里,不过作为开发者应该都懂吧。。。
这里我们会以python实现一个区块链,因此需要首先安装python,这里我是用的是python2.7版本,需要安装flask以及Requests库。
pip install Flask requests
同时还需要一个http客户端,比如postman或curl。
新建一个blockchain.py文件,我们这里只使用这一个文件。
区块链表示
我们首先创建一个Blockchain类,并且在构造函数中创建两个空的list,一个用于储存我们的区块链,另一个用于储存交易。
Blockchain类的定义如下:
class Blockchain(object): def __init__(self): self.chain = [] self.current_transactions = [] def new_block(self): # 创建一个新的块,并添加到链中 pass def new_transaction(self): # 添加一笔新的交易到transactions中 pass @staticmethod def hash(block): # 对一个块做hash pass @property def last_block(self):】 # 返回链中的最后一个块 pass
我们的Blockchain类用来管理链,它会存储交易信息,以及一些添加新的块到链中的辅助方法,让我们开始实现这些方法。
每个块都包含如下属性:索引(index),时间戳(Unix时间),交易列表(transactions),工作量证明(proof,稍后解释)以及前一个块的hash值,下面是一个区块的例子:
block = {
'index': 1,
'timestamp': 1506057125.900785,
'transactions': [
{
'sender': "8527147fe1f5426f9dd545de4b27ee00",
'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
'amount': 5,
}
],
'proof': 324984774000,
'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}
现在,链的概念应该很清楚了–每个新的区块都包含了上一个区块的hash值。这很重要,因为它保障了整个区块链的不可变性:如果攻击者毁坏了一个之前的块,那么后续所有的块的hash值都将错误。没有理解?停下来细想一下,这是区块链背后的核心思想
我们需要一个添加交易到区块的地方,实现一下new_transaction方法:
class Blockchain(object): ... def new_transaction(self, sender, recipient, amount): """ 添加一笔新的交易到transactions中 :param sender: <str> 发送者地址 :param recipient: <str> 接收者地址 :param amount: <int> 数量 :return: <int> 包含该交易记录的块的索引 """ self.current_transactions.append({ 'sender': sender, 'recipient': recipient, 'amount': amount, }) return self.last_block['index'] + 1
在new_transaction方法向列表中添加一个交易记录后,它返回该记录将被添加到的区块的索引–下一个待挖掘的区块。这在后面用户提交交易记录的时候会有用。
当我们的Blockchain实例化之后,我们需要为它创建一个创世块(第一个区块,没有前区块,类似于链表的head),并且给该创世块添加一个工作量证明(proof of work),工作量证明是挖矿的结果。我们后面在来讨论挖矿。
除了在我们的构造函数中创建一个创世块之外,我们也要实现new_block(), new_transaction() 和 hash()方法:
import hashlib
import json
from time import time
class Blockchain(object):
def __init__(self):
self.chain = []
self.current_transactions = []
# 创建创世块
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。