给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

任何依赖中心化数据库作为核心竞争优势的企业或组织都可能被区块链技术所颠覆。

进群:125240963  即可获取数十套PDF哦!文章末尾有源码地址!

本文分三部分,前两部分介绍区块链的 核心概念 ;第三部分介绍如何利用Python实现区块链以及2个 区块链Web应用程序 ,以便终端用户轻松与区块链进行链上交互,效果图如下。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

极简的区块链速成教程

2008年中本聪发布标题为“ 比特币:点对点电子现金系统 ” 的比特币白皮书,奠定了区块链的基础。

在最初的比特币白皮书中, 中本聪描述了如何建立一个点对点电子现金系统,允许不通过中心化机构实现在线支付,直接从一方发送到另一方 。该系统解决了数字货币中一个称为双重支付的重要问题。

什么是双重支付?

假设Alice想要支付Bob 1美元。如果Alice和Bob使用实物现金,那么Alice在执行交易后将不再拥有1美元;如果Alice和Bob使用数字货币,那么问题会变得更加复杂。

数字货币以数字形式存在,可以轻松进行复制。例如,如果Alice通过电子邮件向Bob发送价值1美元的数字文件,则 Bob无法确定Alice是否删除了她的文件副本 ,如果Alice仍然拥有1美元数字文件,那么她可以选择将相同的文件发送给Carol。这个问题就叫做双重支付。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

解决双重支付问题的一种方法是在Alice、Bob和网络中其他参与者之间建立 可信任的第三方(例如银行) ,该第三方负责管理中心化分类账,而分类账跟踪并验证网络中的所有交易。该解决方案的缺点是,为了使系统运行,它需要信任中心化的第三方。

比特币:双重支付问题的去中心化方案

为了解决双重支付问题,中本聪提出了一个公共分类账,即 通过比特币的区块链来跟踪网络中的所有交易 。比特币的区块链具有以下特征:

  • 分布式 :分类帐在多台计算机上复制,而不是存储在中央服务器上。任何具有互联网连接的计算机都可以下载区块链的完整副本。
  • 加密 :用于确认发送人持有她想要发送的比特币,并决定如何将交易添加到区块链中。
  • 不可变 :交易只能添加到区块链中,但不能删除修改
  • 工作量证明(PoW) :网络中一种特殊类型的参与者称为矿工,他们竞争搜索加密难题的解决方案,该解决方案允许他们向比特币的区块链添加一个交易区块,此过程称为工作量证明,它能确保系统安全。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

发送比特币资金流程如下:

  1. 创建一个比特币钱包 。用于发送或接收比特币,比特币钱包存储2条信息:私钥和公钥。私钥是一个秘密号码,允许所有者将比特币发送给另一个用户,或者消费比特币。公钥是接收比特币所需的数字。钱包本身不存储比特币,有关比特币余额的信息存储在比特币的区块链中。
  2. 创建比特币交易 。如果Alice想要向Bob发送1个比特币,Alice需要使用她的私钥连接到她的比特币钱包,并创建一个包含她想要发送的比特币数量和地址的交易。
  3. 将交易广播到比特币网络 。一旦Alice创建比特币交易,她需要将此交易广播到整个比特币网络。
  4. 确认交易 。收听到比特币网络的矿工使用Alice的公钥验证交易,确认Alice的钱包中有足够的比特币,并向比特币区块链添加一条包含交易详细信息的新纪录。
  5. 将区块链的变更广播给所有矿工 。 一旦交易得到确认,该矿工应向所有矿工广播区块链变更,以确保他们的区块链副本全部同步。

区块链技术深度研究

为深入研究区块链技术构建模块,作者系统介绍了公钥密码学,Hash函数和区块链挖掘及安全性等。

公钥密码学

公钥密码学或非对称加密学是任何使用密钥对的加密系统:包括可以广泛传播的公钥,以及只有所有者知道的私钥。 这实现了两个基本功能

  • 身份验证 :公钥验证发送消息的配对私钥的持有者
  • 加密 :只有配对的私钥持有者可以解密用公钥加密的消息。

RSA和ECDSA(椭圆曲线数字签名算法)是最流行的公钥加密算法,ECDSA算法用于生成比特币钱包。

为了发送或接收BTC,用户首先生成包含一对私钥和公钥的钱包。

如果Alice想要向Bob发送一定数量的BTC,她会创建一个交易,在该交易中输入她和Bob的公钥以及她想要发送的BTC数量,然后使用她的私钥签署交易。

区块链上的计算机使用Alice的公钥来验证交易是否可信,并将交易写入即将添加到区块链的区块中。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

Hash函数和挖掘

所有比特币交易都存储在称为区块的文件中。比特币每10分钟增加一个新的交易区块,将新区块添加到区块链后,它将不可变、无法删除修改

网络中一组特殊的参与者称为矿工(连接到区块链的计算机),负责创建新的交易区块。 矿工必须使用发件人的公钥对每笔交易进行身份验证,确认发件人有足够的余额用于所请求的交易,并将交易添加到块中 。

矿工可以完全自由选择区块中的交易,因此发件人需要包含交易费以激励矿工将他们的交易添加到区块中。

对于区块链接受的区块,需要进行“挖掘”。为了挖掘区块,矿工需要找到一种非常罕见的加密难题解决方案。 如果区块链接受了采矿区块,则矿工将获得比特币奖励,这是对交易费用的额外奖励 。挖掘过程也称为工作量证明(PoW),它是使区块链无信任和安全的主要机制。

哈希和区块链加密难题

哈希函数是任何可以用来将任意大小的数据映射到固定大小的数据的函数 。哈希函数返回的值称为Hash值。哈希函数通常用于通过检测重复的记录来加速数据库查找,它们在密码学中也被广泛使用。

哈希函数 允许我们轻松地验证某些输入数据映射到给定的散列值,但是如果输入数据是未知的,那么通过存储的散列值来重构它是很困难的。

比特币使用称为 SHA-256 的加密哈希函数。SHA-256应用于区块数据(比特币交易)和名为Nonce的数字组合。通过更改区块数据或Nonce,我们得到完全不同的Hash值。

对于被认为有效或“已挖掘”的区块,区块和Nonce的Hash值需要满足特定条件。 例如,Hash值的四个前导数字需要等于“0000”。 我们可以通过使条件更复杂来增加挖矿的复杂性,例如我们可以增加Hash值开头0的数量

矿工需要解决的密码难题是找到一个Nonce值,使Hash值满足挖掘条件。

使用下面的应用程序来模拟区块挖掘 。

当你在“Data”文本框中输入或更改Nonce值时,你会注意到Hash值的变化。 当你单击“mine”按钮时,应用程序从Nonce等于零开始,计算Hash值并检查Hash值的前四位是否等于“0000”。

如果前四位数不等于“0000”,则将Nonce增加1并重复整个过程,直到找到满足条件的Nonce值。如果区块已开采,背景颜色变为绿色。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

从区块到区块链

交易按区块分组,区块被附加到区块链。

为了创建一条由区块组成的链,每个新块使用前一个块的Hash值作为其数据的一部分。为了创建新块,矿工选择一组交易,添加一个块的Hash值开始区块挖掘工作。

对任何区块数据进行的任何更改都将影响其后所有区块的Hash值,并且它们将变为无效 ,这就是区块链的不变性。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

使用下面的应用程序模拟包含3个区块的区块链。

当你在“Data”文本框中输入或更改Nonce值时,你可以注意到当前区块Hash值以及下一区块的“Prev”值(上一个Hash值)的变化。

你可以通过单击每个块的“mine”按钮来模拟挖矿过程。挖掘出3个区块之后,尝试更改块1或2中的数据,你将注意到之后的所有区块都变为无效。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

将区块添加到区块链

比特币网络中的所有矿工互相竞争,以找到一个有效的区块,该区块将被添加到区块链并从网络获得奖励。

虽然找到验证区块Nonce几率很低,但由于矿工的数量很多,网络中矿工验证区块的概率非常高。第一个提交有效区块的矿工将他的区块添加到区块链中并获得比特币的奖励。

如果两个矿工或更多的矿工同时提交,会发生什么呢?

解决冲突

如果2名矿工几乎同时解决一个区块,那么我们将在网络中有2个不同的区块链,我们需要等待下一个区块来解决冲突。 一些矿工选择在区块链1顶部挖掘,其他矿工选择在区块链2顶部挖掘。

当有矿工找到一个新的区块之后,冲突就被解决了。

如果新区块在区块链1的顶部被挖掘出来,则区块链2变为无效,前一区块的奖励通过区块链1奖励给矿工,区块链2部分和未添加到区块链中的交易将被退回到交易池并添加到下一个块。

简而言之,如果区块链存在冲突,那么最长的链就会获胜。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

区块链和双重支付

接下来,详细介绍对区块链进行双重支付攻击的常见形式,以及用户为防止受到损害应采取的措施。

  • 种族攻击: 攻击者将相同的硬币快速发送到两个不同的地址。 为防止此类攻击,建议在接受付款前等待至少一次区块确认 。
  • 芬尼攻击: 攻击者使用交易预先挖掘区块,并在释放区块之前在第二个交易中花费相同的币。 在这种情况下,将不验证第二个交易。 为防止此类攻击,建议在接受付款前等待至少6次区块确认 。
  • 51%攻击: 在这类攻击中,攻击者拥有网络51%的算力。攻击者首先向整个网络广播进行交易,然后挖掘一个私有区块链,在那里将上一笔交易的币加倍。
  • 由于攻击者拥有大部分算力,因此保证他在某些时候会拥有比正常网络更长的链。然后,他可以发布更长的区块链,取代正常区块链并取消原始交易。
  • 这种攻击极不可能 ,因为它在像比特币这样的区块链网络中非常昂贵。

Python中的区块链实现

在本节中,我们将使用Python实现基本的区块链和区块链客户端。

区块链将具有以下功能

区块链客户端将具有以下功能

  • 使用公钥/私钥加密生成钱包(基于RSA算法)
  • 使用RSA加密生成交易

还将实现2个显示页:

  • 供矿工使用的“区块链前端”
  • 用户生成钱包和发送数字货币的“区块链客户端”

本文区块链实现主要参考下面的GitHub项目,作者对原始代码进行了一些修改,以便为交易添加RSA加密。

使用Jupyter notebook生成电子钱包,进行加密交易,使用HTML / CSS / JS2完成2个显示页。

区块链客户端

切换到blockchain_client文件夹下,在终端输入 python blockchain_client.py ,启动区块链客户端。在浏览器中,转到 http:// localhost:8080 , 你将看到下面的显示页面

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

显示页面在导航栏中有3个选项卡:

  • Wallet Generator :使用RSA加密算法生成钱包(公钥/私钥对)
  • Make Transaction :生成交易并将其发送到区块链节点
  • View Transasctions :查看区块链上的交易

要创建或查看交易,你至少需要运行一个区块链节点。

下面,对blockchain_client.py代码重要的部分进行解释。

定义一个名为Transaction的python类,它有 sender_address,sender_private_key,recipient_address 和 value 4个属性。这些是发件人创建交易所需的4条信息。

使用 to_dict() 方法以Python字典格式(没有发件人的私钥)返回交易信息。

通过使用 sign_transaction() 方法获取交易信息(没有发件人的私钥),并使用发件人的私钥对其进行签名。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

启动一个Python Flask应用程序,使用它来创建不同的API,与区块链及其客户端进行交互。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

下面定义3个Flask html页面返回路径,每个标签连接一个html页面

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

然后,定义一个生成钱包的API(私钥/公钥对)。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

下面定义一个API,将 sender_address,sender_private_key,recipient_address,value 作为输入项,并返回交易(没有私钥)和签名。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

区块链

转到blockchain文件夹从终端启动区块链节点,然后键入 python blockchain_client.py 或 python blockchain_client.py -p 。如果未指定端口号,则认为端口5000。在浏览器中,转到 http:// localhost: 查看区块链前端显示页。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

导航栏下显示页有2个选项卡:

  • mine :用于查看交易和区块链数据,以及挖掘新的交易区块。
  • Configure :用于配置不同区块链节点之间的连接。

接下来,对blockchain.py代码中重要部分进行解释。

首先定义一个具有以下属性的Blockchain类:

  • transactions :将添加到下一区块的交易列表。
  • chain :由一系列区块组成的区块链。
  • nodes :包含节点url的集合。区块链使用这些节点从其他节点检索区块链数据,如果它们不同步则更新其区块链。
  • node_id :用于标识区块链节点的随机字符串。

Blockchain类还实现了以下方法

  • register_node(node_url) :将新的区块链节点添加到节点列表中。
  • verify_transaction_signature(sender_address,signature,transaction) : 检查提供的签名是否与公钥(sender_address)签名的交易相对应。
  • socmit_transaction(sender_address,recipient_address,value,signature) :如果签名已验证,则将交易添加到交易列表中。
  • create_block(Nonce,prevIoUs_hash) :向区块链添加一个包含交易信息的区块。
  • hash(block) :创建一个区块的SHA-256 Hash值。
  • proof_of_work() :工作量证明。寻找满足挖掘条件的Nonce。
  • valid_proof(transactions,last_hash,Nonce,difficulty = MINING_DIFFICULTY) :检查Hash值是否满足挖掘条件,此函数在proof_of_work函数中使用。
  • valid_chain(chain) :检查区块链是否有效。
  • resolution_conflicts() :通过用网络中最长的链替换链来解决区块链节点之间的冲突。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

启动一个Python Flask应用程序,使用它创建不同的API以与区块链进行交互。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

接下来,启动Blockchain实例。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

定义2条返回区块链前端html页面的Flask路径。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

下面定义Flask API来管理交易和挖掘区块链。

  • '/ transactions / new' :此API用来输入 'sender_address', 'recipient_address','amount'和'signature',并将交易添加到签名有效的、可添加到下一区块的交易列表中。
  • '/ transactions / get' :此API返回可以被添加到下一区块的所有交易。
  • '/ chain' :此API返回所有区块链数据。
  • '/ mine' :此API运行工作量证明算法,并将新的交易块添加到区块链中。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

下面定义Flask API来管理区块链节点。

  • '/ nodes / register' :此API将节点URL列表作为输入,并将它们添加到节点列表中。
  • '/ nodes / resolve' :此API通过用网络中可用的最长链替换本地链来解决区块链节点之间的冲突。
  • '/ nodes / get' :此API返回节点列表。

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

给我十分钟,就算是菜鸟小白也会开发一个区块链客户端!真简单!

原文链接

http://adilmoujahid.com/posts/2018/03/intro-blockchain-bitcoin-python/

代码

https://github.com/adilmoujahid/blockchain-python-tutorial

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实