手把手教你建造区块链(一)——火星技术贴
声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
边肖:记得要注意
如果你已经掌握了一些基本的python知识,那么按照这篇文章来构建一个区块链并不困难。
1.区块链是不变的顺序记录链,称为block。它们可以包含交易、文件或任何您想要记录的数据。请记住,它们是使用哈希值链接在一起的。
2.哈希函数是一个简单的函数,它接受输入值,并根据输入创建输出值来确定输入值。对于任何X输入值,只要运行散列函数,您将总是收到相同的Y输出值。这样,每个输入都有一个确定的输出。哈希函数通常是不可逆的(单向的),这意味着只知道输出并不能让输入变得清晰——除非尝试了所有可能的输入(也称为暴力破解)。
这是散列函数md5,它可以从任何输入数据创建32个字符的十六进制输出
掌握了块、哈希等基本概念之后。你需要做一些构建区块链的环境准备:请确保你的电脑上安装了Python 3.6以上(以及pip)、Flask和Requests库。
pip安装烧瓶==0.12.2请求==2.18.4
第一步:建造一个区块链
打开自己喜欢的文本编辑器或IDE,推荐PyCharm。创建一个名为blockchain.py的新文件
创建一个区块链类,并创建两个初始空列表作为构造函数,一个用于存储我们的区块链,另一个用于存储事务。
类区块链(对象):
def __init__(self):
self.chain=
self.current_transactions=
def new_block(自身):
#创建一个新块并将其添加到链中
及格
def new_transaction(自身):
#将新事务添加到事务列表中
及格
@静态方法
定义哈希(块):
#散列一个块
及格
@属性
def last_block(自身):
#返回链中的最后一个块
及格
这个区块链类负责管理链。它存储事务,并有一些用于向链中添加新块的辅助方法。
“块”是什么样子的?\"
每个块都有一个索引index、一个时间戳(用Unix时间表示)、一个事务列表、一个证明证书(后面会详细介绍)和前一个块的哈希值。如下面的代码所示:
block={
索引\' : 1,
时间戳\' : 1506057125.900785,
交易\' : [
{
发件人\' : \' 8527147 fe1f 5426 f9dd 545 de 4b 27 ee 00 \',
收件人\' : \' a 77 F5 cdfa 2934 df 3954 a5 C7 c 7 da 5d f1f \':
金额\' : 5,
}
],
证明\' : 324984774000,
previous _ hash \' : \' 2 cf 24 DBA 5 FB 0 a 30 e 26 e 83 B2 AC 5b 9 e 29 E1 e 1b 161 E5 C1 fa 7425 e 73043362938 b 9824 \'
}
此时,链的概念应该很明显:每个新块本身都包含前一个块的散列。这一点非常重要,因为它使区块链不变,也就是说,如果攻击者破坏了链中的早期块,所有后续块都将包含不正确的哈希。
\"将事务添加到块中\"
创建new_transaction方法,将事务添加到块中:
类区块链(对象):
.
def new_transaction(本人、发件人、收件人、金额):
\'\'\'
创建新事务以进入下一个挖掘块
:参数发送器:
:参数接收者:
:参数数量:
:返回:
\'\'\'
self . current _ transactions . append({
寄件人\' :寄件人:
收件人\' :收件人:
金额\' :金额,
})
return self . last _ block[\' index \']1
在new_transaction将事务添加到列表中之后,它将返回事务将被添加到的块的索引:即下一个要被挖掘的块。这对提交事务的用户很有用。
\"创建新块\"
在实例化我们的区块链时,我们需要使用创建块(即前面没有块)。
我们还需要在创世区块中添加\"证明\",这是挖矿(或工作量证明工作证明)的结果。关于啪可以参考我之前写过的文章:金融小课堂|加密货币一级市场概述(上)。
除了在构造函数中创建创世区块之外,我们还需要实例化新块,新事务和混杂这三个方法:
导入摘要算法
导入数据
从时间导入时间
类区块链(对象):
def __init__(self):
self.current_transactions=
self.chain=
#创建创世块
self.new_block(previous_hash=1,proof=100)
def new_block(self,proof,previous _ hash=无):
\'\'\'
在区块链中创建新区块
:参数证明:
:param previous_hash:(可选)
:返回:
\'\'\'
block={
index\':镜头(自身链)1,
时间戳\' :时间,
交易: self.current _交易,
证明\' :证明,
上一个哈希\' :上一个哈希或self.hash(self.chain[-1]),
}
#重置当前交易列表
self.current_transactions=
self.chain.append(块)
导回滑轮
定义新事务(本人、发件人、收件人、金额):
\'\'\'
创建新事务以进入下一个挖掘块
:参数发送器:
:参数接收者:
:参数数量:
:返回:
\'\'\'
自我。当前交易记录。追加({
寄件人\' :寄件人:
收件人\' :收件人:
金额\' :金额,
})
回归自我。last _ block[\' index \']1
@属性
定义最后一个块(自身):
return self.chain[-1]
@静态方法
定义哈希(块):
\'\'\'
创建块的阿沙256哈希
:参数块:
:返回:
\'\'\'
#我们必须确保字典是有序的,否则我们会得到不一致的哈希值
block_string=json.dumps(block,sort_keys=True).编码
返回hashlib.sha256(block_string).己糖文摘
这样一个简单的区块链就大功告成了。
如果您会好奇更深层的问题,比如如何创建,伪造或开采新的区块?