区块链与p2p技术(Python区块链教程(一))python初学 / python在区块链技术中的应用...

wufei123 发布于 2024-06-10 阅读(6)

简介此区块链教程将详细介绍区块链背后的理论区块链是数字货币比特币的基本构建块,此教程将讨论比特币的复杂性,全面解释区块链架构,并建立我们自己的区块链Satoshi Nakamoto创建了世界上第一个虚拟货币,称为比特币。

你可能想启用自己的货币,我们称为TPCion(TutorialsPoint Coin)你将编写区块链程序记录所有与TPCoin的交易,TPCoin可以用于购买披萨、汉堡等物品其他服务商可能会加入你的区块链网络,并接受TPCoin作为提供服务的货币。

区块链与p2p技术(Python区块链教程(一))python初学 / python在区块链技术中的应用...

The possibilities are endless.本教程将介绍如何构建上述系统,并在市场上推出自己的数字货币整个区块链项目开发包括3个主要部分:客户(Client)、矿工(Miners)、区块链(Blockchain)。

客户:从其他卖方(供应商)购买商品客户本身可能会成为卖方,从其提供的商品中接受买方的钱款我们假设客户既可以是TPCoins的供应商,也可以是其接收者因此,我们需要在代码中创建一个具有收付钱款功能的客户类。

矿工:从交易池(transaction pool)中提取交易并将其组装成一个块矿工必须提供有效的工作证明才能获得采矿奖励矿工收取的所有钱都将由他保留他可能在网上的其他注册供应商那里通过购买商品或服务而消费这笔钱,就像上述客户一样。

区块链:是一种按时间顺序链接所有已开采区块的数据结构 该链不可变,防止被篡改创建Client类客户是持有TPCoins并通过网络上其他供应商(包括他自己)进行商品/服务交易的人为此,应该定义一个Client类。

为了为客户创建全局唯一的标识,我们使用公钥基础设施(Public Key Infrastructure,PKI)客户应能从他的钱包中将钱汇给另一个已知的人同样,客户应能够接受来自第三方的付款为了付款,客户会创建一个交易,指定收款人的姓名和付款金额。

为了收款,客户将其身份提供给第三方(本质上是汇款人)我们不存储客户钱包中的余额在交易过程中,我们将计算实际余额以确保客户有足够的余额进行付款为了编写Client类以及项目中其余的代码,需要导入Python库:

importhashlibimportrandomimportstringimportjsonimportbinasciiimportnumpyasnpimportpandasaspdimportpylab

asplimportloggingimportdatetimeimportcollections除了上述标准库之外,我们还将对交易进行签名,创建对象的哈希等需要导入以下库:# PKI所需的模块import。

CryptoimportCrypto.RandomfromCrypto.HashimportSHAfromCrypto.PublicKeyimportRSAfromCrypto.Signatureimport

PKCS1_v1_5Client类使用Python内置的RSA算法生成私钥和公钥 在对象初始化中,创建私钥和公钥,并将其值存储在实例变量中self._private_key=RSA.generate(1024

,random)self._public_key=self._private_key.publickey()注意:绝不能丢失私钥 为了保持交易记录,可以将生成的私钥复制到安全的外部存储中,或者将其ASCII表示记在一张纸上。

生成的公钥将用作客户的身份 为此,我们定义了一个名为identity的属性,该属性返回公钥的HEX表示形式@propertydefidentity(self):returnbinascii.hexlify。

(self._public_key.exportKey(format=DER)).decode(ascii)该身份对于每个客户而言都是唯一的,并且可以公开使用 任何人都可以使用此身份将虚拟货币发送给你,然后虚拟货币将被添加到你的钱包中。

Client类的完整代码为:classClient():def__init__(self):cyrandom=Crypto.Random.new().readself._private_key=RSA.

generate(1024,cyrandom)self._public_key=self._private_key.publickey()self._signer=PKCS1_v1_5.new(self

._private_key)@propertydefidentity(self):returnbinascii.hexlify(self._public_key.exportKey(format=DER

)).decode(ascii)测试Client创建一个Client实例,并将其分配给变量Dinesh 通过调用Dinesh的标识方法来打印Dinesh的公钥 Dinesh=Client()print(

Dinesh.identity)输出为:30819f300d06092a864886f70d010101050003818d0030818902818100daeb31ee1896e974d9b8548e1fb4a50b01d3353258702ddc6f9b9f210868a7ab81310d6ac3834b59ccc295ee75e31af3be3cf3c149d57c6113086bc04d12d1b99de958b90f8dea84c20002c8077c9175f5c6131c8859f0795f56b22b79d7b65f2e862abfcc1485afa1fb01a08cda00ee10cb19e772c7da1b2f302ff81264fa770203010001

创建Transaction类创建一个Transaction类,以便客户能够向其他人汇款 注意,客户既可以是付款人(sender),也可以是收款人(recipient) 当你想收款时,付款人创建交易并指定你的公共地址。

定义Transaction类的初始化为:def__init__(self,sender,recipient,value):self.sender=senderself.recipient=recipient

self.value=valueself.time=datetime.datetime.now()__init__()有3个参数:付款人的公钥,收款人的公钥和付款金额他们存储在实例变量中,以供其他方法使用。

此外,还创建了一个存储交易时间的变量下面编写一个名为to_dict的方法,将上述4个实例变量组合在字典中 这仅仅是为了通过单个变量能访问整个交易信息区块链中的第一个块是Genesis块 Genesis块包含由区块链创建者发起的第一笔交易。

像比特币一样,此人的身份可以保密 因此创建此第一笔交易时,创建者可以仅发送其身份为Genesis 在创建字典时,我们需要检查付款人是否为Genesis,如果是,我们只是简单地将一些字符串值分配给identity

变量; 否则,我们将付款人的身份分配给identity变量ifself.sender=="Genesis":identity="Genesis"else:identity=self.sender.identity。

构建字典:returncollections.OrderedDict({sender:identity,recipient:self.recipient,value:self.value,time:self

.time})to_dict方法的完整代码为:defto_dict(self):ifself.sender=="Genesis":identity="Genesis"else:identity=self

.sender.identityreturncollections.OrderedDict({sender:identity,recipient:self.recipient,value:self.value

,time:self.time})最后,将使用付款人的私钥对该字典对象进行签名 和之前一样,使用内置带SHA算法的PKI 对生成的签名进行解码,以获得打印和存储在我们区块链中的ASCII表示形式 sign_transaction

方法的代码为:defsign_transaction(self):private_key=self.sender._private_keysigner=PKCS1_v1_5.new(private_key

)h=SHA.new(str(self.to_dict()).encode(utf8))returnbinascii.hexlify(signer.sign(h)).decode(ascii)Transaction类

的完整代码为:classTransaction():def__init__(self,sender,recipient,value):self.sender=senderself.recipient=recipient

self.value=valueself.time=datetime.datetime.now()defto_dict(self):ifself.sender=="Genesis":identity="Genesis"

else:identity=self.sender.identityreturncollections.OrderedDict({sender:identity,recipient:self.recipient

,value:self.value,time:self.time})defsign_transaction(self):private_key=self.sender._private_keysigner

=PKCS1_v1_5.new(private_key)h=SHA.new(str(self.to_dict()).encode(utf8))returnbinascii.hexlify(signer.

sign(h)).decode(ascii)测试Transaction类我们将创建两个用户,分别是Dinesh和Ramesh Dinesh将发送5个TPCoins给Ramesh首先,创建名为Dinesh和Ramesh的客户。

Dinesh=Client()Ramesh=Client()注意:实例化Client类时,将创建该客户唯一的公钥和私钥 当Dinesh向Ramesh发送付款时,他将需要Ramesh的公钥,该公钥通过使用Client的identity属性获得。

创建Transaction实例:t=Transaction(Dinesh,Ramesh.identity,5.0)注意:第1个参数是付款方(sender,发送比特币的人),第2个参数是收款人(recipient,接收比特币的人)的公钥,第3个参数是交易金额。

sign_transaction方法从第1个参数中检索付款人的私钥,以操纵交易创建Transaction对象之后,你将通过调用其中的sign_transaction方法对其签名 此方法可以以打印格式返回生成的签名:。

signature=t.sign_transaction()print(signature)输出为:7bc3b3d1f02ec69b156cd8bcff50f42f059f59a88d17558709ccf82fb73bc13b8aca57a0c2152efcdec0fa9de771f7e5d48d9244842de207c31eef7cd4ddba4a13c6a3f70288026d5cfd7ebaef8c0a990737a41c240e1cf68084f174665367f339abf4a37ae4da6ed14eb5251acaebcbf30b9556697d3dcd0c8de104b8a96547

下一步现在创建客户和交易的基本框架已经准备就绪,下一节我们可以有多个客户,并像现实生活中那样进行多个交易。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻77900