python区块链开发教程_Python区块链教程(⼀)
简介
此区块链教程将详细介绍区块链背后的理论。区块链是⽐特币的基本构建块,此教程将讨论⽐特币的复杂性,全⾯解释区块链架构,并建⽴我们⾃⼰的区块链。
Satoshi Nakamoto创建了世界上第⼀个虚拟货币,称为⽐特币。你可能想启⽤⾃⼰的货币,我们称为TPCion(TutorialsPoint Coin)。你将编写区块链程序记录所有与TPCoin的交易,TPCoin可以⽤于购买披萨、汉堡等物品。其他服务商可能会加⼊你的区块链⽹络,并接受TPCoin作为提供服务的货币。The possibilities are endless.
本教程将介绍如何构建上述系统,并在市场上推出⾃⼰的。
整个区块链项⽬开发包括3个主要部分:客户(Client)、矿⼯(Miners)、区块链(Blockchain)。客户:从其他卖⽅(供应商)购买商品。客户本⾝可能会成为卖⽅,从其提供的商品中接受买⽅的钱款。我们假设客户既可以是TPCoins的供应商,也可以是其接收者。因此,我们需要在代码中创建⼀个具有收付钱款功能的客户类。
矿⼯:从交易池(transaction pool)中提取交易并将其组装成⼀个块。矿⼯必须提供有效的⼯作证明才能
获得采矿奖励。矿⼯收取的所有钱都将由他保留。他可能在⽹上的其他注册供应商那⾥通过购买商品或服务⽽消费这笔钱,就像上述客户⼀样。
区块链:是⼀种按时间顺序链接所有已开采区块的数据结构。 该链不可变,防⽌被篡改。
创建Client类
客户是持有TPCoins并通过⽹络上其他供应商(包括他⾃⼰)进⾏商品/服务交易的⼈。为此,应该定义⼀个Client类。为了为客户创建全局唯⼀的标识,我们使⽤公钥基础设施(Public Key Infrastructure,PKI)。
客户应能从他的钱包中将钱汇给另⼀个已知的⼈。同样,客户应能够接受来⾃第三⽅的付款。为了付款,客户会创建⼀个交易,指定收款⼈的姓名和付款⾦额。为了收款,客户将其⾝份提供给第三⽅(本质上是汇款⼈)。我们不存储客户钱包中的余额。在交易过程中,我们将计算实际余额以确保客户有⾜够的余额进⾏付款。
为了编写Client类以及项⽬中其余的代码,需要导⼊Python库:
import hashlib
import random
import string
import json
import binascii
import numpy as np
电源插座英文
import pandas as pd
import pylab as pl
import logging
import datetime
import collections
除了上述标准库之外,我们还将对交易进⾏签名,创建对象的哈希等。需要导⼊以下库:
# PKI所需的模块
import Crypto
import Crypto.Random
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
Client类使⽤Python内置的RSA算法⽣成私钥和公钥。 在对象初始化中,创建私钥和公钥,并将其值存储在实例变量中。
self._private_key = ate(1024, random)
self._public_key = self._private_key.publickey()
注意:绝不能丢失私钥。 为了保持交易记录,可以将⽣成的私钥复制到安全的外部存储中,或者将其ASCII表⽰记在⼀张纸上。
⽣成的公钥将⽤作客户的⾝份。 为此,我们定义了⼀个名为identity的属性,该属性返回公钥的HEX表
⽰形式。
@property
def identity(self):
return binascii.hexlify(self._portKey(format='DER')).decode('ascii')
该⾝份对于每个客户⽽⾔都是唯⼀的,并且可以公开使⽤。 任何⼈都可以使⽤此⾝份将虚拟货币发送给你,然后虚拟货币将被添加到你的
钱包中。
Client类的完整代码为:
class Client():
def __init__(self):
cyrandom = w().read
self._private_key = ate(1024, cyrandom)
self._public_key = self._private_key.publickey()
self._signer = PKCS1_w(self._private_key)
@property
def identity(self):
return binascii.hexlify(self._portKey(format='DER')).decode('ascii')
测试Client
创建⼀个Client实例,并将其分配给变量Dinesh。 通过调⽤Dinesh的标识⽅法来打印Dinesh的公钥。
Dinesh = Client()
print(Dinesh.identity)
输出为:
30819f300d06092a864886f70d010101050003818d0030818902818100daeb31ee1896e974d9b8548e1fb4a50b01d3
private的意思创建Transaction类
创建⼀个Transaction类,以便客户能够向其他⼈汇款。 注意,客户既可以是付款⼈(sender),也可以是收款⼈(recipient)。 当你想收款时,付款⼈创建交易并指定你的公共地址。 定义Transaction类的初始化为:
def __init__(self, sender, recipient, value):
self.sender = sender
self.value = value
self.time = w()
__init__()有3个参数:付款⼈的公钥,收款⼈的公钥和付款⾦额。他们存储在实例变量中,以供其他⽅法使⽤。此外,还创建了⼀个存储交易时间的变量。
下⾯编写⼀个名为to_dict的⽅法,将上述4个实例变量组合在字典中。 这仅仅是为了通过单个变量能访问整个交易信息。
区块链中的第⼀个块是Genesis块。 Genesis块包含由区块链创建者发起的第⼀笔交易。 像⽐特币⼀样,此⼈的⾝份可以保密。 因此创建此第⼀笔交易时,创建者可以仅发送其⾝份为Genesis。 在创建字典时,我们需要检查付款⼈是否为Genesis,如果是,我们只是简单地将⼀些字符串值分配给identity变量; 否则,我们将付款⼈的⾝份分配给identity变量。
if self.sender == "Genesis":
identity = "Genesis"
else:
企业网站建设综合实训心得体会一千字identity = self.sender.identity
构建字典:
return collections.OrderedDict({
'sender': identity,
'recipient': ipient,
selective suspend 怎么设置'value': self.value,
'time' : self.time})
to_dict⽅法的完整代码为:一张图介绍前端三大框架
def to_dict(self):
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
return collections.OrderedDict({
'sender': identity,
'recipient': ipient,
'value': self.value,
'time' : self.time})
最后,将使⽤付款⼈的私钥对该字典对象进⾏签名。 和之前⼀样,使⽤内置带SHA算法的PKI。 对⽣成的签名进⾏解码,以获得打印和存储在我们区块链中的ASCII表⽰形式。 sign_transaction⽅法的代码为:
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_w(private_key)
h = w(_dict()).encode('utf8'))
return binascii.hexlify(signer.sign(h)).decode('ascii')
Transaction类的完整代码为:
class Transaction():
def __init__(self, sender, recipient, value):
self.sender = sender
self.value = value
python基础教程电子书英文版self.time = w()
def to_dict(self):
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
return collections.OrderedDict({
'sender': identity,
'recipient': ipient,
'value': self.value,
'time' : self.time})
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_w(private_key)
h = w(_dict()).encode('utf8'))
return binascii.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)
输出为:
7bc3b3d1f02ec69b156cd8bcff50f42f059f59a88d17558709ccf82fb73bc13b8aca57a0c2152efcdec0fa9de771f7e5d48d
下⼀步
现在创建客户和交易的基本框架已经准备就绪,下⼀节我们可以有多个客户,并像现实⽣活中那样进⾏多个交易。