本篇文章由万云团队编译
原文链接:http://mp.weixin.qq.com/s/5-O...
如需转载请联系万云官方微信:万云Wancloud
2018年的门刚打开,区块链的火就烧成了火焰山。徐小平放言要拥抱区块链,朋友圈刷屏不止,连上班地铁上都能听到区块链,一夜起,区块链成了茶前饭后的谈资。于是乎,那个经常听到的问题又开始抓耳挠腮:区块链到底是什么鬼?关注的订阅号不停推送“一篇文章让你搞懂区块链”,“三分钟Get区块链”等不尽相同的内容,声音从四面八方聚焦到你耳边。
万云也在思考能为想了解区块链的老铁们做点什么,鉴于已有如此多区块链概念普及文,此次我们不聊枯燥的概念,而是回归区块链“技术”,一步步认真教你获得一个属于自己区块链。放心,只要你稍微懂一点技术,你就可以实现并拥有它。
|| 以下翻译自Daniel van Flymen的《Learn Blockchains by Building One》,有所删改。
|| 原文地址:https://hackernoon.com/learn-...
前言
概念了解:在开始前你需要知道,区块链是一种按时间将数据区块以顺序相连的方式组合在一起的链式数据结构,并通过密码学来保证其不可篡改和不可伪造的分布式账本。这些区块可以包含交易、文件以及任何你想要的数据,重要的是它们通过哈希链接在一起。
目标读者:可以轻松地阅读和编写一些基本的Python,并且对HTTP有一些了解。
所需工具:Python 3.6+、Flask、Requests:
pip install Flask==0.12.2 requests==2.18.4
除此之外还需安装HTTP工具,如Postman、cURL。
源代码地址:https://github.com/dvf/blockc...
第一步:建立区块链
①实现一个Blockchain类
打开一个你常用的文本编辑器或者IDE,新建一个blockchain.py的python文件,并创建一个Blockchain类,在构造函数中创建两个空的队列,一个用于存储区块链,另一个用于存储交易。下面是Blockchain类的模板代码:
class Blockchain(object):
def __init__(self):
self.chain = []
self.current_transactions = []
def new_block(self):
# Creates a new Block and adds it to the chain
pass
def new_transaction(self):
# Adds a new transaction to the list of transactions
pass
@staticmethod
def hash(block):
# Hashes a Block
pass
@property
def last_block(self):
# Returns the last Block in the chain
pass
我们所创建的Blockchain类将用来管理链,它会存储交易,并且提供一些方法来帮助添加新的区块到链。下面是详细的实现方法。
每个区块所包含5个基本属性:index,timestamp (in Unix time),交易列表,工作量证明和前一个区块的哈希值。我们来看一个例子:
block = {
'index': 1,
'timestamp': 1506057125.900785,
'transactions': [
{
'sender': "8527147fe1f5426f9dd545de4b27ee00",
'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
'amount': 5,
}
],
'proof': 324984774000,
'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}
到这里,我们对于链的概念应该比较清楚了,每个新的区块都会包含上一个区块的哈希值,从而让区块链具有不可篡改的特性。如果攻击者攻击了链中比较靠前的区块,则所有后面的区块将包含不正确的哈希值。如果不能理解,慢慢消化——这是理解区块链技术的核心思想。
②将交易添加到区块
接下来我们实现一个将交易添加到区块的方法,继续看代码:
class Blockchain(object):
...
def new_transaction(self, sender, recipient, amount):
"""
Creates a new transaction to go into the next mined Block
:param sender: <str> Address of the Sender
:param recipient: <str> Address of the Recipient
:param amount: <int> Amount
:return: <int> The index of the Block that will hold this transaction
"""
self.current_transactions.append({
'sender': sender,
'recipient': recipient,
'amount': amount,
})
return self.last_block['index'] + 1