主页 > imtoken钱包下载国际版 > Python 区块链教程
Python 区块链教程
来源
本区块链教程将详细介绍区块链背后的理论。 区块链是数字货币比特币的基本构建块,本教程将讨论比特币的复杂性,全面解释区块链架构,并构建我们自己的区块链。
中本聪创造了世界上第一个虚拟货币比特币。 您可能想要启用您自己的货币,我们称之为 TPCion (TutorialsPoint Coin)。 您将编写一个区块链程序来记录所有与 TPCoin 的交易,可用于购买披萨、汉堡等。其他服务提供商可能会加入您的区块链网络并接受 TPCoin 作为提供服务的货币。 可能性是无止境。
本教程将展示如何构建上述系统并在市场上推出您自己的数字货币。
整个区块链项目开发包括3个主要部分:Client、Miners和Blockchain。
创建客户端类
客户是持有 TPCoins 并通过网络上的其他提供商(包括他自己)交易商品/服务的人。 为此,应定义一个 Client 类。 为了为我们的客户创建全球唯一的身份,我们使用公钥基础设施 (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 = RSA.generate(1024, random)
self._public_key = self._private_key.publickey()
注意:私钥绝不能丢失。 为了保留交易记录,可以将生成的私钥复制到安全的外部存储中,或者可以将其 ASCII 表示形式写在一张纸上。
生成的公钥将用作客户端的身份。 为此,我们定义了一个名为 identity 的属性,它返回公钥的 HEX 表示形式。
@property
def identity(self):
return binascii.hexlify(self._public_key.exportKey(format=\'DER\')).decode(\'ascii\')
此身份对每个客户都是唯一的,并且是公开的。 任何人都可以使用此身份向您发送虚拟货币比特币收款人不知道汇款人,然后将其添加到您的钱包中。
Client类的完整代码为:
class Client():
def __init__(self):
cyrandom = Crypto.Random.new().read
self._private_key = RSA.generate(1024, cyrandom)
self._public_key = self._private_key.publickey()
self._signer = PKCS1_v1_5.new(self._private_key)
@property
def identity(self):
return binascii.hexlify(self._public_key.exportKey(format=\'DER\')).decode(\'ascii\')
测试客户端
创建一个 Client 实例并将其分配给变量 Dinesh。 通过调用 Dinesh 的 identify 方法打印 Dinesh 的公钥。
Dinesh = Client()
print(Dinesh.identity)
输出是:
30819f300d06092a864886f70d010101050003818d0030818902818100daeb31ee1896e974d9b8548e1fb4a50b01d3353258702ddc6f9b9f210868a7ab81310d6ac3834b59ccc295ee75e31af3be3cf3c149d57c6113086bc04d12d1b99de958b90f8dea84c20002c8077c9175f5c6131c8859f0795f56b22b79d7b65f2e862abfcc1485afa1fb01a08cda00ee10cb19e772c7da1b2f302ff81264fa770203010001
创建事务类
创建一个交易类,以便客户可以向其他人汇款。 请注意,客户既可以是发件人也可以是收件人。 当你想收钱时,发件人创建一个交易并指定你的公共地址。 定义Transaction类的初始化为:
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
__init__()有3个参数:付款人公钥、收款人公钥、支付金额。 它们存储在实例变量中以供其他方法使用。 此外,还创建了一个变量来存储交易时间。
让我们编写一个名为 to_dict 的方法比特币收款人不知道汇款人,它将上述 4 个实例变量组合在一个字典中。 这只是为了允许通过单个变量访问整个交易信息。
区块链中的第一个区块是创世区块。 创世块包含区块链创建者发起的第一笔交易。 像比特币一样,这个人的身份可以保密。 因此,在创建第一笔交易时,创建者只需发送他作为 Genesis 的身份即可。 在创建字典时,我们需要检查付款人是否是 Genesis,如果是,我们只需将一些字符串值分配给标识变量; 否则,我们将付款人的身份分配给身份变量。
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
建立字典:
return collections.OrderedDict({
\'sender\': identity,
\'recipient\': self.recipient,
\'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\': self.recipient,
\'value\': self.value,
\'time\' : self.time})
最后,字典对象将使用付款人的私钥进行签名。 和以前一样,使用带有 SHA 算法的内置 PKI。 生成的签名被解码以获得打印并存储在我们的区块链中的 ASCII 表示。 sign_transaction 方法的代码是:
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_v1_5.new(private_key)
h = SHA.new(str(self.to_dict()).encode(\'utf8\'))
return binascii.hexlify(signer.sign(h)).decode(\'ascii\')
Transaction类的完整代码为:
class Transaction():
def __init__(self, sender, recipient, value):
self.sender = sender
self.recipient = recipient
self.value = value
self.time = datetime.datetime.now()
def to_dict(self):
if self.sender == "Genesis":
identity = "Genesis"
else:
identity = self.sender.identity
return collections.OrderedDict({
\'sender\': identity,
\'recipient\': self.recipient,
\'value\': self.value,
\'time\' : self.time})
def sign_transaction(self):
private_key = self.sender._private_key
signer = PKCS1_v1_5.new(private_key)
h = SHA.new(str(self.to_dict()).encode(\'utf8\'))
return binascii.hexlify(signer.sign(h)).decode(\'ascii\')
测试事务类
我们将创建两个用户,Dinesh 和 Ramesh。 Dinesh 将发送 5 个 TPCoins 给 Ramesh。
首先,创建名为 Dinesh 和 Ramesh 的客户端。
Dinesh = Client()
Ramesh = Client()
注意:实例化 Client 类时,将创建该客户端唯一的公钥和私钥。 当 Dinesh 向 Ramesh 发送付款时,他将需要 Ramesh 的公钥,该公钥是使用 Client 的身份属性获得的。
创建事务实例:
t = Transaction(Dinesh, Ramesh.identity, 5.0)
注:第一个参数为payer(发送者,发送比特币的人),第二个参数为接收者(recipient,接收比特币的人)的公钥,第三个参数为交易金额。 sign_transaction 方法从第一个参数中检索付款人的私钥以操纵交易。
创建事务对象后,您可以通过调用其 sign_transaction 方法对其进行签名。 此方法可以以可打印格式返回生成的签名:
signature = t.sign_transaction()
print(signature)
输出是:
7bc3b3d1f02ec69b156cd8bcff50f42f059f59a88d17558709ccf82fb73bc13b8aca57a0c2152efcdec0fa9de771f7e5d48d9244842de207c31eef7cd4ddba4a13c6a3f70288026d5cfd7ebaef8c0a990737a41c240e1cf68084f174665367f339abf4a37ae4da6ed14eb5251acaebcbf30b9556697d3dcd0c8de104b8a96547
下一步
现在创建客户和交易的基本框架已经准备就绪,在下一节中,我们可以拥有多个客户并像在现实生活中一样进行多次交易。