如果您想学习如何构建区块链,那么您来对地方了。让我们深入了解如何在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构建区块链。因此,如果您是新手并且有志于在区块链中发展事业,我们建议您从我们的免费区块链基础知识课程开始您的区块链事业。选择我们作为您的学习伙伴,直到您找不到理想的工作,我们都会一直陪伴着您.
那么,您如何看待区块链及其实现?在下面发表评论,让我们知道.