简介

此区块链教程将详细介绍区块链背后的理论。区块链是数字货币比特币的基本构建块,此教程将讨论比特币的复杂性,全面解释区块链架构,并建立我们自己的区块链。

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 = 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

创建一个Client实例,并将其分配给变量Dinesh。 通过调用Dinesh的标识方法来打印Dinesh的公钥。

Dinesh = Client()

print(Dinesh.identity)

输出为:

30819f300d06092a864886f70d010101050003818d0030818902818100daeb31ee1896e974d9b8548e1fb4a50b01d3353258702ddc6f9b9f210868a7ab81310d6ac3834b59ccc295ee75e31af3be3cf3c149d57c6113086bc04d12d1b99de958b90f8dea84c20002c8077c9175f5c6131c8859f0795f56b22b79d7b65f2e862abfcc1485afa1fb01a08cda00ee10cb19e772c7da1b2f302ff81264fa770203010001

创建Transaction类

创建一个Transaction类,以便客户能够向其他人汇款。 注意,客户既可以是付款人(sender),也可以是收款人(recipient)。 当你想收款时,付款人创建交易并指定你的公共地址。 定义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块包含由区块链创建者发起的第一笔交易。 像比特币一样,此人的身份可以保密。 因此创建此第一笔交易时,创建者可以仅发送其身份为Genesis。 在创建字典时,我们需要检查付款人是否为Genesis,如果是,我们只是简单地将一些字符串值分配给identity变量; 否则,我们将付款人的身份分配给identity变量。

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')

测试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

下一步

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

python 区块链开发教程_Python区块链教程(一)相关推荐

  1. 区块链开发指南_区块链开发权威指南

    区块链开发指南 by Haseeb Qureshi 由Haseeb Qureshi 区块链开发权威指南 (The authoritative guide to blockchain developme ...

  2. 区块链开发语言python_区块链开发中使用的最流行的编程语言

    我们目前正处于一个新兴的区块链开发行业中.区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣.由于许多资金充足的项目现在急于建立区块链网络并在其上部署分散的 ...

  3. 区块链开发指南_区块链开发完全指南

    区块链将是技术的发展方向. 我认为未来将围绕区块链一新兴技术构建,这绝不是什么牵强附会.区块链最初被设计成一种公共的,无权限的技术,后来引入了另一种区块链,每种区块链都有自己独特的用例集.公共/无权限 ...

  4. 区块链开发语言python_区块链开发中经常使用的编程语言有哪些

    我们目前正处于一个新兴行业--区块链的发展中.区块链技术在很大程度上还处于萌芽阶段,然而,这种颠覆性的技术已经成功地席卷了全球,并经历了近年来前所未有的繁荣. 许多资金充足的项目现在都渴望构建自己的区 ...

  5. 5分钟学会区块链 - 开发一条区块链 Develop BlockChain with Tendermint

    本文攻略:解惑区块链开发,学习 Tendermint,给自己造一条区块链 建议玩家等级:技术小白,学生党,初级码农 阅读此文先解锁技能: 一点点命令行基础 一点点 GO 基础:三天包学会 一点点区块链 ...

  6. 区块链开发公司:区块链技术如何改变个人数据安全

    随着大数据的普及,第三方平台的个人数据量几乎每天都在以难以理解的速度增长.但是这些公司中的绝大多数都依赖于集中的服务器来保护客户信息,因此,在2018年,数百万人的个人信息在国际范围内遭到泄露,这或许 ...

  7. 区块链开发先达区块链跨境支付系统解决方案

    支付行业发展最快的领域是移动支付,但是现在最吸引大家眼球的当属区块链.现下,区块链成为金融科技领域的大热门,区块链技术在各个行业领域有着广泛的应用.那么,"区块链+跨境支付"这个组 ...

  8. 区块链开发公司:区块链数字资产的名词解释

    区块链资产钱包的使用会越来越频繁和重要,因此我们在使用钱包时,有几个名词必须理解,不然就有可能造成区块链资产的损失,这几个名词为地址.密码.私钥.助记词.keystore. 若以银行账户为类比,这 5 ...

  9. 区块链开发公司 论区块链实现开发的价值

    历史上每一次生产关系的革命,都大大促进了生产力和整个时代的发展.就如商业风口的区块链开发,有人说区块链开发公司"没有创造新的价值""只是财富的转移",没错,进一 ...

  10. 区块链开发公司:区块链技术共识算法的新玩法

    共识算法是什么? 共识机制就是用来解决分布式系统的一致性问题,其核心为在某个协议(共识算法)保障下,在有限的时间内,使得指定操作在分布式网络中是一致的.被承认的.不可篡改的.在区块链系统中,特定的共识 ...

最新文章

  1. Selenium2+python自动化1(环境安装)
  2. 美国正式宣告将在月球建立永久存在基地
  3. 《Linux From Scratch》第三部分:构建LFS系统 第八章:让LFS系统可引导 - 8.2. 创建 /etc/fstab 文件...
  4. redis缓存设计要点随谈
  5. python画相关性可视化图_Python可视化很简单,一文教你绘制饼图、极线图和气泡图...
  6. Java 8日期时间API教程:LocalDateTime
  7. nutch2.1在windows平台上使用eclipsedebug 存储在mysql的搭建过程
  8. php实现多条件查找分页,Yii2.0框架实现带分页的多条件搜索功能示例
  9. 秘籍分享:如何将负载均衡按量付费实例转换为包年包月实例
  10. mysql 集成模式_mysql基础学习整合
  11. 51nod 1180 方格射击游戏
  12. php对smarty的使用,[ php ] php smarty使用!
  13. selenium课程笔记3-使用selenium中的webdriver对浏览器操作-页面元素定位及操作
  14. 哪种工业仓库扫描枪适合您?
  15. Python调用有道智云文本翻译API接口实现“智能”伪原创
  16. 【零基础学Python】Day7 Python基本数据类型之Set
  17. php主机卫士,Bypass 360主机卫士SQL注入防御(附tamper脚本)
  18. 初中英语语法(006)-特殊疑问句·祈使句·感叹句
  19. 阿里 P9 用 500 多页手册完成双十一高并发秒杀系统,绝了
  20. workman用户组

热门文章

  1. 从混沌熬到风口:移动FM的五年之争
  2. 智慧医院解决方案如何落地 智慧医院解决方案实际应用
  3. PDF转CAD的技巧以及转换后的编辑方法
  4. 条形码扫描仪行业调研报告 - 市场现状分析与发展前景预测
  5. 关于数据库方言MySQLDialect、MySQL5Dialect、MySQL55Dialect、MySQL57Dialect、MySQL8Dialect之间的区别与联系
  6. EICU数据库安装教程
  7. (6)微信UI自动化-搜索指定联系人(C#)
  8. vue echarts 柱状图
  9. termux如何下载metasploit(msf)
  10. matlab 线性规划 单纯形法