用 Python 创建你自己的加密货币(附源码)
央行数字货币DECP钱包内测截图
随着加密货币的兴起,区块链技术逐渐进入大众的视野。这项技术之所以吸引如此多的关注,主要是因为它具有分布式、可追溯性、共识机制、安全性、高可用性和不变性等特性。区块链本质上是一个公共数据库,它记录和认证数字资产的持有和传输,并且不可逆,像比特币和以太坊这样的数字货币就是基于这个概念。
很多政府、组织和个人都在使用区块链技术来创建自己的加密货币,世界社交媒体巨头Facebook主导的Libra数字货币项目发布了新版Libra白皮书,最近关于中国人民银行数字货币DCEP进入市场测试也见诸众多媒体报道。
那么我们能否效仿并建立自己的加密货币呢?在本教程中,我们会用 Python 来逐步说明构建数字货币的过程,我们把将要创建的加密货币命名为PyCoin,下面是创建PyCoin的区块链算法基本蓝图:
class Block:def __init__():#第一个区块类passdef calculate_hash(): #计算每一个区块的哈希值class BlockChain:def __init__(self):# 构造方法passdef construct_genesis(self):# 构建初始区块passdef construct_block(self, proof_no, prev_hash):# 构建新的区块并添加到区块链pass@staticmethoddef check_validity():# 检验区块链是否有效passdef new_data(self, sender, recipient, quantity):# 添加一个新的交易数据pass@staticmethoddef construct_proof_of_work(prev_proof):# 避免区块链被攻击pass@propertydef last_block(self):# 返回链上最后一个区块return self.chain[-1]
一、创建第一个区块的类
区块链由多个相互连接的区块组成,如果一个区块被篡改,那么链上的其它部分将变得无效。对应以上概念,我们创建以下的初始区块类函数:
import hashlib
import timeclass Block:def __init__(self, index, proof_no, prev_hash, data, timestamp=None):self.index = indexself.proof_no = proof_noself.prev_hash = prev_hashself.data = dataself.timestamp = timestamp or time.time()@propertydef calculate_hash(self):block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,self.prev_hash, self.data,self.timestamp)return hashlib.sha256(block_of_string.encode()).hexdigest()def __repr__(self):return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,self.prev_hash, self.data,self.timestamp)
从上面的代码中可以看到,我们定义了 __init__()
函数,该函数将在启动Block
类时执行,就像 Python 中其他任何类中一样。
我们为初始函数定义以下参数:
self
:引用Block
类的实例,从而可以访问与该类关联的方法和属性;index
:记录某个区块在区块链中的位置;proof_no
:在创建新区块(即挖矿)期间产生的数量;prev_hash
:指上一个区块的哈希值;data
:记录所有已完成的交易,例如购买数量;timestamp
:标记交易的时间戳
类中的第二个方法calculate_hash
将由上一个区块的哈希值来生成当前区块的哈希值,SHA-256算法模块将被导入用来获得区块的哈希值。
当值输入加密哈希算法中后,该函数将返回一个256位的字符串,表示该区块所包含的内容。
这就是为什么区块链具有安全性这一特征,因为每个区块都有一个哈希值,而该哈希值将依赖于前一个区块的哈希值。因此,如果有人试图篡改链中的任何区块,其他区块将具有无效的哈希值,从而破坏整个区块链网络。
最终一个区块将会是像下面这样:
{"index": 2,"proof": 21,"prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823","transactions": [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}],"timestamp": 1521646442.4096143
}
二、创建区块链的类
顾名思义,区块链的主要思想是将多个区块相互“链接”。因此我们将构建一个blockchain
类,该类将对管理整个链的运行至关重要。blockchain
类具有各种辅助方法来完成区块链中的任务。
下面我们解释一下每个方法在类中的作用:
a、构造函数方法
这个方法确保区块链能被实例化。
class BlockChain:def __init__(self):self.chain = []self.current_data = []self.nodes = set()self.construct_genesis()
下面是其属性的作用:
self.chain:该变量保存所有区块;
self.current_data:该变量保存所有完成交易的区块;
self.construct_genesis():该方法负责构建初始区块
b、构建创世区块
区块链中需要用construct_genesis
方法来构建链上的初始区块。惯例上,此区块比较特殊,因为它象征着区块链的开始。因此我们只需将一些默认值传递给Construct_block
方法来构造它。例如我们可以给proof_no
和prev_hash
赋一个零值。
def construct_genesis(self):self.construct_block(proof_no=0, prev_hash=0)def construct_block(self, proof_no, prev_hash):block = Block(index=len(self.chain),proof_no=proof_no,prev_hash=prev_hash,data=self.current_data)self.current_data = []self.chain.append(block)return block
c、构建新的区块
用 Python 创建你自己的加密货币(附源码)相关推荐
- 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- srs可以用java开发吗,为SRS流媒体服务器添加HLS加密功能(附源码)
#为SRS流媒体服务器添加HLS加密功能(附源码)# 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的 ...
- 20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放
20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放 文章目录 202205 ...
- Python毕设-【人脸签到系统】附源码/Python练手项目/Python毕业设计
本人承诺只做技术分享,永不收费. V----------------->:专栏详情 文章目录 本人承诺只做技术分享,永不收费. V----------------->:专栏详情 一.背景 ...
- PHP加密技术 附源码
点击上方" 码农编程进阶笔记 ",选择"置顶或者星标" 文末有干货,每天定时与您相约! PHP 加密后的代码能运行在 PHP 5+ 以上版本. 跨平台,Wind ...
- 用Python自动刷新抢12306火车票(附源码)
專 欄 ❈ 作者:marvin,互联网从业者,现居上海张江 ❈ 一年一度的春运又来了,今年我自己写了个抢票脚本.使用Python+Splinter自动刷新抢票,可以成功抢到.(依赖自己的网络环境太厉害 ...
- 用 Python 写一个天天酷跑 | 内附源码
写出来的效果图就是这样了: 相关文件 小伙伴们可以关注小编的Python源码.问题解答&学习交流群:733089476 有很多的资源可以白嫖的哈,需要源码的小伙伴可以在+君羊领取 下面就更新一 ...
- 【Python游戏】基于化学方程式的基础上,用Python实现一个消灭泡泡小游戏 | 附源码
前言 halo,包子们下午好 今天实现的这个小游戏呀,说实话化学不太好的小伙伴可能看起来会有点懵逼 不过不用担心,咱们今天不是来学化学的,我们是来学习Python的 所以呀,不要太担心啦,大家先好好看 ...
- 一口气用Python写了13个小游戏 (附源码)
大家好,今天给大家分享13个游戏源码,可以自己复现玩玩,研究下里面的编程逻辑,对学习编程(特别是初学者)应该会有很大帮助. 由于文章较长,大家记得滑到文末点个赞哈- 1.吃金币 源码分享: impor ...
- Python + Django开发在线考试管理系统(附源码)
本文最终实现一个Web在线考试管理系统,可作为Python Web,Django的练手项目,也可以作为计算机毕业设计参考项目. 文章目录 系统功能需求分析 系统设计及实现思路 源码分享&系统实 ...
最新文章
- 谷歌、苹果等大佬亲自戳穿自动驾驶完美童话,技术、场景、安全牢笼实难突围!...
- Shell练习-统计出每个IP的访问量有多少?
- 成功解决schedule.ScheduleValueError: Invalid time format
- java算法提高求最大值_藍橋杯 算法提高 求最大值
- phpcms上线步骤,无法生成缓存,页面空白原因
- 右键菜单,用VSCode打开文件和文件夹
- 两种曲线下面积AUC(Area Under the ROC Curve):ROC-AUC、PR-AUC(性能度量)
- auto.ja 部落冲突01 找图并点击
- 无刷电机控制基础(1)——结构和驱动电路
- linux 进程hang,GoldenGate Extract进程hang问题解决一例
- 将多个文件夹下内容合并到一个文件夹下
- 苹果笔记本怎么查看计算机基本信息,如何查询苹果电脑型号_查询苹果电脑型号的方法...
- App Inventor 2能编译出苹果iOS版App吗?
- 机器学习入门:入手sklearn框架+线性回归+案例(基金数据的预测)
- H264/H265码流类型
- 手机维修基础 常见故障分析㈢
- 【计算机网络】定义、作用、特点计算机网络
- [置顶] 常用小片段指令集锦
- Python气象绘图教程——Cartopy
- 直观理解-梯度下降及MIT自适应控制律