手把手教你建造区块链(一)——火星技术贴

手把手教你建造区块链(一)——火星技术贴

声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。

边肖:记得要注意

来源:投币助手

了解区块链最快的方法就是自己动手建造一个”

如果你已经掌握了一些基本的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).己糖文摘

这样一个简单的区块链就大功告成了。

如果您会好奇更深层的问题,比如如何创建,伪造或开采新的区块?

暂无评论

暂无评论...