如果您想学习如何构建区块链,那么您来对地方了。让我们深入了解如何在python中构建区块链.
关于区块链的文章很多,但并不是所有人都谈论从头开始构建区块链。作为开发人员,理论很重要,但是您还需要创建一个区块链以完全了解其背后的概念。.
区块链背后的核心思想是其分散的性质。一切都将如何运作的事实会让您着迷。区块链听起来很简单,但是内部有很多协议和算法可以使之成为现实。我们将使用Python从头开始创建区块链.
您还可以保存该文章并将其标记为“如何构建我们的区块链”。相信我;从长远来看,这篇文章将对您有帮助.
从未听说过区块链吗?然后查看101Blockchain的免费课程。如果您想发展自己的职业,请查看“认证企业区块链课程”,了解企业区块链的工作原理。让我们开始吧.
您是区块链的初学者吗?注册区块链免费课程,立即开始您的区块链之旅.
如何建立区块链
学习任何事物的最好方法就是边做边学。为了确保您与我在同一页面上,让我们先检查一下要求。我们还将简要描述区块链,以便我们都在同一页面上.
要求
遵循指南的基本要求是知道如何编码。如果您一生中从未编码过,那么本指南不适合您。我建议您查看在线上提供的各种初学者课程。我建议使用EdX,Udacity和Coursera,以获得最佳的学习体验.
您已经是编码员了吗?然后,您应该了解基本的Python。此外,它将帮助您遵循“如何构建区块链”教程.
立即阅读:Quorum区块链终极指南
我们创建了该教程,因此任何人都可以关注。因此,如果您不知道并想学习如何从头开始构建区块链,欢迎这样做!
如果您不了解Python,请不要担心,因为它很容易上手。看看 Python文档 开始.
我们将在本教程中使用Python 3.6+。如果您决定使用其他版本的Python,则可能需要做更多的研究才能使代码正常工作。出于教程目的,我建议安装我正在使用的版本.
最后,您还应该了解HTTP-用于在互联网上的两方之间进行通信的协议.
使用pip安装Python
您需要使用pip安装Python。您还需要安装精彩的Requests和Flask库。为此,只需运行以下命令.
$ pip安装Flask == 0.12.2请求== 2.18.4
如果您使用的是Windows环境,则可以直接转到python.org下载最新版本的Python.
对于我来说,我下载了Python 3.8.1,这是编写本教程时的最新版本.
对于IDE,我更喜欢使用PyCharm。我正在使用Python社区版作为本教程。您可以自由使用您选择的任何IDE。另一个不错的选择是Visual Studio Code-一个免费的开源集成开发环境.
您将需要的最后一个工具是Postman-HTTP客户端。另外,您也可以使用cURL.
我还建议安装虚拟环境以为您的开发创建完全不同的环境。您可以关注 本指南 正确设置.
再谈区块链
在开始构建区块链之前,我们需要刷新我们关于区块链的想法。这将帮助我们停留在同一页面上.
区块链是一种分布式分类帐技术,对等方可以参与,交互和执行交易,而无需集中式实体。每个对等方都有一个分类帐的副本,这使黑客无法在系统中进行欺诈。区块链的关键特征包括透明度,不变性和安全性。它利用先进的加密货币算法来确保数据安全。此外,为了达成共识,区块链网络将利用共识算法,例如工作量证明,权益证明等。.
另请阅读:面向初学者的区块链:入门指南
建立区块链入门
完成所有必备组件的安装后,我们现在就可以开始使用我们的教程“如何构建区块链”了。
首先,您需要创建一个blockchain.py文件.
1.区块链创建
第一步是制作功能性的区块链解决方案。首先,我们需要创建一个Blockchain类。在那里,我们将创建一个构造器,该构造器将启动链和事务列表。链表将存储我们的区块链,而交易将存储在current_transacations数组中.
def __init __(self):self.chain = [] self.current_transactions = []
接下来,我们需要创建一个new_block函数,该函数将用于创建新块,然后将其添加到现有链中。 new_block函数的代码如下:
def new_block(self):#此函数创建新的块,然后将其添加到现有的链式通道中
new_transcaction方法将创建一个新事务,然后将该事务添加到已存在的事务列表中.
def new_transaction(self):#此函数将新事务添加到已存在的事务中。我们还有一个哈希函数,用于为块创建哈希。 @staticmethod def hash(block):#用于哈希一个块
我们将要创建的最后一个函数last_block。用于调用链中的最后一个块.
我们还可以在这里再创建三个函数.
- register_node()→注册新节点并将其添加到网络
- valid_proof()→将确保向链上提交块已解决问题
- valid_chain()→这将检查链中的后续块是否有效.
区块链.py的蓝图如下所示.
class Blockchain(object):def __init __(self):self.chain = [] self.current_transactions = [] def new_block(self):#此函数创建新块,然后将其添加到现有链式中def new_transaction(self): #此函数将新事务添加到已存在的事务传递中@staticmethod def hash(block):#用于对一个块进行哈希处理@property def last_block(self):#调用并返回链式传递的最后一个块
区块链类管理整个链。该类下定义的定义管理区块链中的不同动作.
让我们逐一介绍以下每种方法.
立即阅读:什么是区块链分片:区块链扩展解决方案简介
块的结构
一个块包含有关交易和链条的重要信息。链上的任何区块都将包含以下信息
- 指数
- Unix时间中的时间戳
- 交易清单
- 证明
- 上一个区块哈希
该块中的大多数信息都是不言自明的。这里,两个关键变量是previous_hash,它包含前一个块的哈希值。这很重要,因为它可以确保区块链是不可变的,并且没有恶意行为者可以更新,删除或向链中添加任何数据.
立即阅读:为何区块链将改变世界?
将交易添加到区块
了解了区块的结构之后,现在让我们学习如何向区块添加交易。它的代码如下.
def new_transaction(self):#此函数将新事务添加到已存在的事务中 """这将创建一个新事务,该事务将发送到下一个块。它将包含三个变量,包括发件人,收件人和金额 """ self.current_transactions.append({‘sender’:发件人,’recipient’:收件人’amount’:amount,})return self.last_block [‘index’] + 1如您所见,它只是在current_transaction列表后面附加了一个包含三个变量的对象→发件人,收件人,金额.
一旦添加完成,该方法然后将块索引发送到链。这是将要开采的下一个区块.
创建新块
在开始创建新块之前,我们需要创建创世块。为此,我们需要使用以下简单的代码行.
self.new_block(previous_hash = 1,proof = 100)
该行应添加到您的Blockchain类中.
对于new_block()方法,您需要发送两个变量作为其参数。它包括证明和previous_hash.
现在,让我们看一下下面的new_block()方法.
def new_block(self,proof,previous_hash = None):#此函数创建新块,然后添加到现有链中 """此方法将包含两个参数证明,即先前的哈希""" 块= {‘索引’:len(self.chain)+ 1,’timestamp’:time(),’证明’:证明,previous_hash:previous_hash或self.hash(self.chain [-1]),}
#设置当前交易清单为空.
self.current_transactions = [] self.chain.append(block)返回块
让我们解释一下new_block的代码。我们创建一个包含三个重要参数的阻止列表。定义它们之后,我们还要编写代码以重置current_transaction列表,然后将该块附加到链中。当new_block方法被调用时,返回该块.
立即阅读:新手指南:什么是以太坊经典?
我们还要在下面定义last_block方法.
@财产
def last_block():
#调用并返回链的最后一块
返回self.chain [-1]
同样,hash()方法的代码如下:
def hash(block):#用于散列一个块 """以下代码将创建SHA-256块哈希,并确保字典已排序""" block_string = json.dumps(block,sort_keys = True).encode()返回hashlib.sha256(block_string).hexdigest()如果您将所有代码组合到现在,我们将拥有以下blockchain.py。在下面检查.
class Blockchain(object):def __init __(self):self.chain = [] self.current_transactions = [] self.new_block(previous_hash = 1,proof = 100)def new_block(self,proof,previous_hash = None):#此函数创建新块,然后将其添加到现有链中 """此方法将包含两个参数证明,即先前的哈希""" block = {‘index’:len(self.chain)+ 1,’timestamp’:time(),’proof’:证明,previous_hash:previous_hash或self.hash(self.chain [-1]),}#设置当前交易清单为空。 self.current_transactions = [] self.chain.append(block)返回块def new_transaction(self):#此函数将新事务添加到已存在的事务中 """这将创建一个新的事务,该事务将发送到下一个块。它将包含三个变量,包括发件人,收件人和金额 """ self.current_transactions.append({‘sender’:发送者,’recipient’:接收者,’amount’:金额,})return self.last_block [‘index’] + 1 @staticmethod def hash(block):#用于哈希一个街区 """以下代码将创建SHA-256块哈希,并确保字典已排序""" block_string = json.dumps(block,sort_keys = True).encode()返回hashlib.sha256(block_string).hexdigest()@property def last_block(self):#调用并返回链的最后一块返回self.chain [ -1]
工作量证明的实施
我们构建blockchain.py的下一步是工作量证明的实现.
那么,什么是工作证明?这是一种共识方法,用于向链中添加新块。这给矿工带来了挑战,一旦矿工解决了问题,就可以对该区块进行验证。作为回报,矿工会根据问题的复杂性获得奖励.
比特币的工作证明被称为Hashcash。它确保比特币网络共识按预期工作.
另请阅读:共识算法:区块链技术的根源
让我们定义一个proof_of_work()方法。该方法将是Blockchain类的一部分.
defproof_of_work(自己,last_proof): """此方法是实现共识算法的地方。它带有两个参数,包括self和last_proof""" 在self.valid_proof(last_proof,proof)为False时,证明= 0:证明+ = 1返回证明@staticmethod def valid_proof(last_proof,证明): """此方法验证块""" guess = f'{last_proof} {proof}’。encode()guess_hash = hashlib.sha256(guess).hexigest()返回guess_hash [:4] == "0000"
第一个proof_of_work方法很简单;它只是将证明设置为0,然后运行while循环以运行valid_proof方法。如果为False,则在证明中添加一个.
您可以通过添加更多零来增加哈希的难度.
这导致我们到Blockchain.py的结尾。我们的代码如下.
class Blockchain(object):def __init __(self):self.chain = [] self.current_transactions = [] self.new_block(previous_hash = 1,proof = 100)defproof_of_work(self,last_proof): """此方法是实现共识算法的地方。它带有两个参数,包括self和last_proof""" 在self.valid_proof(last_proof,proof)为False时,证明= 0:证明+ = 1返回证明@staticmethod def valid_proof(last_proof,证明): """此方法验证块""" guess = f'{last_proof} {proof}’。encode()guess_hash = hashlib.sha256(guess).hexigest()返回guess_hash [:4] == "0000" def new_block(self,proof,previous_hash = None):#此函数创建新块,然后添加到现有链中 """此方法将包含两个参数证明,即先前的哈希""" block = {‘index’:len(self.chain)+ 1,’timestamp’:time(),’proof’:证明,previous_hash:previous_hash或self.hash(self.chain [-1]),}#设置当前交易清单为空。 self.current_transactions = [] self.chain.append(block)返回块def new_transaction(self):#此函数将新事务添加到已存在的事务中 """这将创建一个新的事务,该事务将发送到下一个块。它将包含三个变量,包括发件人,收件人和金额 """ self.current_transactions.append({‘sender’:发件人,’recipient’:收件人,’amount’:金额,})
返回self.last_block [‘index’] + 1
@staticmethod
def hash(block):
#用于散列块
“”“以下代码将创建SHA-256块哈希,并确保字典已排序””””
block_string = json.dumps(block,sort_keys = True).encode()
返回hashlib.sha256(block_string).hexdigest()
@财产
def last_block():
#调用并返回链的最后一块
返回self.chain [-1]
2. API集成
太好了,我们创建了一个可行的区块链!现在,为了有效地使用它,我们需要创建一个API(应用程序编程接口).
为此,我们将使用流行的Python框架:Flask.
Flask是一个微框架,这意味着它是轻量级的,您可以添加所需的库。它还使您可以轻松创建Python函数端点.
要创建API,我们首先需要确保我们的区块链可以通过HTTP接受请求。为此,我们必须创建更多方法.
现在,我们将修改blockchain.py.
#创建应用节点app = Flask(__ name__)node_identifier = str(uuid4())。replace(’-‘,”)#初始化区块链blockchain = Blockchain()@ app.route(’/ mine’,方法= [ ‘GET’])def mine():返回 "挖一个新块" @ app.route(’/ transactions / new’,methods = [‘POST’])def new_transaction():返回 "添加新交易" @ app.router(’/ chain’,Methods = [‘GET’])def full_chain():response = {‘chain’:区块链.chain,’length’:len(blockchain.chain)}返回jsonify(response) ,如果__name__ ==’__main__’,则为200:app.run(host ="0.0.0.0", 端口= 5000)
该代码在大多数情况下是不言自明的。我们首先进行节点初始化。接下来,我们创建一个随机节点。完成后,我们将初始化我们的Blockchain类。完成后,我们需要创建以下三个端点.
- / mine端点
- / transactions /新端点
- /链端点
最后,我们在5000端口上运行服务器.
该应用程序现已创建完毕。我们需要做的就是创建交易类方法.
@ app.route(’/ transactions / new’,Methods = [‘POST’])def new_transaction():values = request.get_json()#检查所需数据是否存在= [‘sender’,’接收者’,’数量’](如果不是全部)(返回k中的k个值,必填):返回’Missing values’,400#创建一个新的交易索引= blockchain.new_transaction(values [‘sender’],values [‘recipient’ ,values [‘amount’]])response = {‘message’:f’交易已计划添加到块号{index}’} return jsonify(response),201
另请阅读:这是您需要了解的有关区块链工作证明的知识
挖矿端点
我们要创建的最后一个端点是挖掘端点。为此,我们必须确保它执行以下三件事.
- 工作量证明的计算
- 伪造新的区块链,然后将其添加到链中
- 奖励矿工的工作
@ app.route(’/ mine’,Methods = [‘GET’])def mine(): """在这里,我们使工作证明算法起作用""" last_block =区块链。last_blocklast_proof = last_block [‘proof’]证明= blockchain.proof_of_work(last_proof)#奖励矿工的贡献。 0表示已开采新硬币区块链。new_transaction(sender ="0", 收件人= node_identifier,数量= 1,)#现在创建新块并将其添加到链中previous_hash = blockchain.hash(last_block)block = blockchain.new_block(proof,previous_hash)response = {‘message’:’新块已伪造”,“索引”:block [“ index”],“交易”:block [“ transactions”],“ proof”:block [“ proof”],“ previous_hash”:block [“ previous_hash”]}返回jsonify(response),200
立即阅读:新手指南:什么是AION?世界第一第三代区块链网络
3.区块链互动
最后一步是与区块链进行交互。我们将使用Postman通过我们刚创建的API与区块链网络进行交互.
在Python控制台上运行以下代码
python的blockchain.py
结论
这导致我们结束了如何构建区块链的工作。希望以上步骤和代码能帮助您使用Python构建区块链。因此,如果您是新手并且有志于在区块链中发展事业,我们建议您通过我们的免费区块链基础知识课程开始您的区块链事业。选择我们作为您的学习伙伴,直到您找不到理想的工作,我们都会一直陪伴着您.
那么,您如何看待区块链及其实现?在下面发表评论,让我们知道.