昨晚听大佬小课堂,给我普及一晚上区块链相关各种知识,深深感觉到自己宛如一个智障,我不配说自己是学计算机的啊……
膜拜之余,转载大佬的文章,像大佬学习!

  • 文章出处:Py区块链源码笔记 (1)挖矿

也欢迎看到人的去访问他博客~~~

Py区块链源码笔记 (1)挖矿

怎么学习区块链知识呢? 各种的资料看的头大,还是晕晕乎乎。所以那不如自己实现一个吧??

说是自己实现,实际上想先对源码进行解读。这里给出的源码,是一个基于Python实现的一个功能较为健全的区块链。下面给出项目地址

项目地址

挖矿(mine)

什么是挖矿

当然进入币圈或者链圈的人当然对挖矿这个词不会陌生。区块链的核心问题就是解决了拜占庭将军问题,实现了全网的可信。在比特币网络里面,每十分钟产生的数据成为一个block。这个块被所有的矿工一起进行计算。其中有一个nonce的值。一旦有一个矿工挖到了这个特定值。那么就挖到了这个block。可以得到coinbase的奖励。

拜占庭将军问题

源码的实现
Web端

这里是使用了python的Flask模块作为一个web的服务端。

app = Flask(__name__)# 这里的@说明是函数修饰符,后面有说明
@app.route('/mine', methods=['GET'])
def mine():...return jsonify(response), 200app.run(host='0.0.0.0', port=5000)

这里就可以实现后端的对前端的GET请求的响应,执行挖矿操作后,返回Json的信息。

Python的函数修饰符

这里的 @app.route(‘/mine’, methods=[‘GET’])是一个对函数的修饰符,和solidity里面的modifier差不多。其意在执行完了修饰符的函数之后,才会继续执行下面修释的函数

def test(f):
print “before …”
f() # 这里指代的就是所修饰函数
print “after …”

@test
def func():
print "func was called"  # 直接运行,输出结果:before ...
func was called
after ...  # 所以这里可以看出上述代码等价于test(func)    # func 是个pointer
Miner

这里是miner的代码,这里实现了一个简单的挖矿过程,虽然和实际的挖矿过程还是有些差距,不过也正是简单易读,所以我们好理解。

miner的请求处理

@app.route('/mine', methods=['GET'])
def mine():# 这里使用POS共识机制。# 这里的返回了一个ARRAY的tail其定义是 chain = []last_block = blockchain.last_block            # 这里使用POS,代码后面展开proof = blockchain.proof_of_work(last_block)    # We must receive a reward for finding the proof.# The sender is "0" to signify that this node has mined a new coin.# 翻译过来,这个就是区块奖励,也就是CoinBase,# 作为一个区块的第一笔交易,所以发送者是零地址。blockchain.new_transaction(sender="0",recipient=node_identifier,amount=1,)# 把这个    区块加到链尾,实现了到主链的融合previous_hash = blockchain.hash(last_block)block = blockchain.new_block(proof, previous_hash)# 这里把新的区块数据反馈到前端response = {'message': "New Block Forged",'index': block['index'],'transactions': block['transactions'],'proof': block['proof'],'previous_hash': block['previous_hash'],}return jsonify(response), 200
PoS的实现代码
def proof_of_work(self, last_block):
"""
一段简单的工作量证明的算法:"""last_proof = last_block['proof']
last_hash = self.hash(last_block)proof = 0
while self.valid_proof(last_proof, proof, last_hash) is False:proof += 1return proof

上述代码的实际上的工作原理: 先使得 proof的值为零,之后慢慢的递增。直到找到

找到一个数字P,使得Hash(P,P’)的哈希值是前面包含了4个0的,这里的`P’是上一个区块的P值

实际上我们的挖矿的过程和这个差不多,这个P在实际上是一个nonce(number once)的值。这里一样的进行了大量的简化

valid_proof
# point : 这里是py的特性F-strings,分别计算花括号的值,并且进行拼接
guess = f'{last_proof}{proof}{last_hash}'.encode()    guess_hash =    hashlib.sha256(guess).hexdigest()
print(guess_hash)
return guess_hash[:4] == "0000"

这里就是对我们的Proof的值的合法性判断,

  • 先把上一个的proof,本次的proof,和上一个区块的hash进行一个拼接(F-string)之后进行编码。
  • 对其进行sha256的hash。得到hash值。
  • 之后判断该hash的值是否是以四个0结尾
    返回是否找到合法的proof值,如果找到,返回True
  • 返回上层函数PoS的过程结束

这里是部分的打印结果:挖出第一个块的打印(第0块,是创世区块,设置的proof是100)

f49bd479bb433aa37bcb01b36cc6e4f3f8881ae4cdfeecfc3fc84a2a69a29951
d71f73e0d52ad34fbc8848d85890a0951773fafc6c7214fe94794cc9c2dca904
312cc1a85835727e29b7d85ae0a781a35ab57376ae56e29f8e6a70e1f76eb139
0000b1964e2a279761ab62cf0d52272f540867aee83bb22ffc6eb2e9bf63f3b1
100 16623 ac018635f614a44ab203ef49fcb7887b36de048fd5d5a286a06c9b32666bd618

我们可以看见,最后一行,我们的last_proof是100,这次我们尝试了 16623 次,得到了proof,使得他们的hash是以四个0开头的
0000b1964e2a279761ab62cf0d52272f540867aee83bb22ffc6eb2e9bf63f3b1

同样的下面是第二块

42d9c8f25d3b438157c2e4cd06fff288600eb78ef9536aeec60dea13c46fb41d
00006b342191c828ecfeeb21ad3cfe3320ded31d4a0bc64fcf5c103c5a8806cb
16623 187207 58f183fc794d087ccce036e25ca039099af9738d7cdf5c23564def4254eb1281
小结

可见这里的代码很简单的实现了一个pos的模型,proof可以类比于我们寻找的 nonce 的这个值,实际上,关于BTC的难度系数的动态调整,就是和这得到的hash的零的个数,和后面数值的有效的大小的要求而确定的。

这里我们在BTC的区块链浏览器可以直接看到我们的区块数据。

BTC里面的随便一个区块

  • 高度 512,589
  • 确认数 2
  • 大小 1,096,630 Bytes
  • Nonce 0x185d9c75
  • 时间 2018-03-08 22:05:10
  • 块哈希
  • 000000000000000000474697c175dadd12b11f9736c10e2a632aa52d7a555a0f
  • 前一个块
  • 00000000000000000000021c043e439b5f4b632389b0062306bf2d4e0b657c7c
  • 后一个块
  • 000000000000000000434de347737700f50cacde89f956e08ed4a39dddd23bf0

可以看到,其实,差不多2333.

后面的话

打算潜心学习,不能浮躁,慢慢的学习这些底层的原理和实现,后面应该会有关于交易(加密签名),组网(P2P)网络的内容

Py区块链源码笔记 (1)挖矿相关推荐

  1. 如何用php农场项目,2020全新亲测php农场游戏源码-金币菇种植理财区块链源码 带商城系统...

    2020全新亲测php农场游戏源码-金币菇种植理财区块链源码 带商城系统+抽奖系统+独家搭建教程 金币菇一款复利理财游戏,在这里大家可以更轻松.愉快的进行理财投资!本源码是一套理财游戏盘系统,蘑菇只是 ...

  2. 最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频

    最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频教程 [亲测修复版]10月最新5G时代投资风口投资 区块链 源码全修复版订制UI完美版本+对接免签 支付 +搭建视频教程 现在5G是个热词,这 ...

  3. 带你读源码:四大视角多维走读区块链源码

    作者 | 李辉忠 来源 | FISCO BCOS开源社区 封图 | CSDN下载自视觉中国 区块链作为「新基建」的重要组成部分,越来越受技术爱好者关注.区块链极客信奉"code is law ...

  4. php区块链源码带语音播报|区块链理财|区块链游戏l抽奖功能|自动分红

    介绍: php区块链源码带语音播报|区块链理财|区块链游戏|抽奖功能|自动分红: 亲测搭建完美运行,搭建方式如下 测试环境:Apache 2.4.46或 Linux+nginx1.15.10 数据库: ...

  5. 区块链源码,已布局能源领域

    能源区块链的优点: 促进多方间安全.去中心化的交易:增强安全性与互信,减少欺诈:促进多方交易中的透明度和效率--都适用于能源领域.相比于金融等其他领域,能源领域不仅涉及到价值的转移,物理产品本身(例如 ...

  6. 区块链源码分析-flag

    如何建立测试环境 各种公钥和密钥格式 交易 区块 挖矿 P2P网络

  7. 一.以太坊和比特别pow区块链源码实现

    http://blog.51cto.com/11821908/2059711    转载

  8. bitcoin区块链源码分析(一)网络发现

    bitcoin节点在接收peer发过来的块的处理流程 //所有全局变量 //CConnman 的一个关键属性m_msgproc: 如果本地没有peer.dat,  由第一线程CConnman::Thr ...

  9. 牧场养牛区块链源码+带积分商城/抽奖/会员特权

    正文: 服务器系统:Linux + Centos7.x + 宝塔 亲测环境:Nginx 1.18.0 + PHP5.6 + Mysql5.5 数据库配置文件:/Public/config.php 其他 ...

最新文章

  1. python 有效的括号
  2. 微服务组件记事本:本地搭建Skywalking
  3. 开源路由软件zebra的命令存储原理及使用方法
  4. Page object设计模式
  5. 微信小程序四种父子相互传值方式
  6. 无人驾驶汽车遭遇AI路障
  7. 20155327结对编程练习
  8. 求合作开发伙伴 .NET 中高级工程师 1-2名
  9. 高性能计算服务器计算费价格,高性能计算云服务器价格表
  10. 怎么调节台式计算机字体大小,电脑上怎么调整字体大小
  11. Python:索引总结
  12. java猜数字1到100_Java实现简单猜数字小游戏
  13. Python版的BS期权定价模型和希腊值分析
  14. 你的CRM系统为什么用不起来?
  15. 微信活码系统程序源码
  16. Python中四舍五入的讲解
  17. 计算机类课题项目申报书,国家社科基金一般项目书分享
  18. 动态规划——状态压缩dp
  19. Android股票K线图
  20. 小程序全局配置文件以及常用配置项

热门文章

  1. 2023苹果商务管理模式分发app完全指南
  2. 前端学习(面试收集)
  3. Go 全套学习路线图
  4. [CF677E] Vanya and Balloons
  5. 计算机更新电源,升级了显卡千万别忘记也要把电源升级
  6. Codemirror提示关键词/自动提示
  7. 2022年氟化工艺考试模拟100题及在线模拟考试
  8. nginx长连接与短连接性能对比
  9. mtcnn人脸检测(python)
  10. 李宏毅机器学习-CNN