别人写的python版本

python版本源码地址:

https://github.com/dvf/blockchain#installation


环境准备

我使用的是ubuntu 16.04,其它linux版本也可以。

需要安装python3.6+(步骤省略)

安装pipenv

$ pip install pipenv 

创建虚拟执行环境(类似docker一样)

root@pony-virtual-machine:~# pipenv --python=python3.6
Creating a virtualenv for this project…
Using /usr/bin/python3.6 to create virtualenv…
⠋Running virtualenv with interpreter /usr/bin/python3.6
Using base prefix '/usr'
New python executable in /root/.local/share/virtualenvs/root-BuDEOXnJ/bin/python3.6
Also creating executable in /root/.local/share/virtualenvs/root-BuDEOXnJ/bin/python
Installing setuptools, pip, wheel...done.Virtualenv location: /root/.local/share/virtualenvs/root-BuDEOXnJ
Creating a Pipfile for this project…

随便找一个目录下载源码

git clone https://github.com/dvf/blockchain.git

切换到源码目录

root@pony-virtual-machine:/usr/local# pipenv install
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (711973)!
Installing dependencies from Pipfile.lock (711973)…��   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run the following:$ pipenv shell

源码分析

源码不分析了,太过简单,自己看吧。不过能看懂源码的前提是你对区块链(尤其是比特币上的区块链)的一些机制原来有一定的了解,比如工作量证明,共识机制等。

源码中有一处错误我已经在github提交了issue反馈。


访问测试

因为条件有限,我在一台主机里启动三个不同端口的服务,模拟三个网络中的节点。分别是:

A节点

root@pony-virtual-machine:/home/pony/python/projects/blockchain# pipenv run python blockchain.py* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

B节点

root@pony-virtual-machine:/home/pony/python/projects/blockchain# pipenv run python blockchain.py -p 5001* Running on http://0.0.0.0:5001/ (Press CTRL+C to quit)

C节点

root@pony-virtual-machine:/home/pony/python/projects/blockchain# pipenv run python blockchain.py --port 5002* Running on http://0.0.0.0:5002/ (Press CTRL+C to quit)

这里要注意下,因为三个节点并没有实现分布式协议,所以节点之前不会同步数据,所以下面的测试其实还是不完善


测试的流程如下:

首先我要把三个节点都注册到测试区块链的网络里,我通过A节点的接口把B节点和C节点加入进来。

http://localhost:5000/nodes/registerjson data:{"nodes": ["http://127.0.0.1:5001","http://127.0.0.1:5002"]
}响应{"message": "New nodes have been added","total_nodes": ["127.0.0.1:5001","127.0.0.1:5002"]
}

在A节点上新增两笔交易

http://localhost:5000/transactions/newjson data:
{"sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa","recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55","amount": 102
}响应
{"message": "Transaction will be added to Block 2"
}
http://localhost:5000/transactions/newjson data:
{"sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa","recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55","amount": 103
}响应
{"message": "Transaction will be added to Block 2"
}

两笔交易会存在节点A的内存中(current_transactions变量)。

下面在节点A上执行“挖矿”的动作,

http://localhost:5000/mine响应
{"index": 2,"message": "New Block Forged","previous_hash": "1","proof": 35293,"transactions": [{"amount": 102,"recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55","sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"},{"amount": 103,"recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55","sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"},{"amount": 1,"recipient": "e5fad4f985494c52ae71c31a0d958fde","sender": "0"}]
}

可以看到挖矿产生的新区块已经包含了我们刚才添加的两笔交易。另外还有一笔金额是1的交易,这个是用来奖励矿工的。

挖矿的结果除了把新的交易加入一个新的区块,还在区块上产生一个工作量证明的值(block的proof字段)。

这个时候新的区块就加入到了链上,我们可以获取整条链看看:

http://localhost:5000/chain响应
{"chain": [{"index": 1,"previous_hash": "1","proof": 100,"timestamp": 1508836211.1095436,"transactions": []},{"index": 2,"previous_hash": "1","proof": 35293,"timestamp": 1508836541.9152732,"transactions": [{"amount": 102,"recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55","sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"},{"amount": 103,"recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55","sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"},{"amount": 1,"recipient": "e5fad4f985494c52ae71c31a0d958fde","sender": "0"}]}],"length": 2
}
http://localhost:5000/nodes/resolve

用docker来搭建环境

上面我们用的是pipenv来作为执行环境,关于什么是pipenv,可以看下这篇文章:

怎么使用pipenv管理你的python项目

总之就是了类似docker一样的虚拟环境,但是是针对python的.

用docker的好处有很多,首先一个就是不依赖任何语言。其次docker运行多个实例可以使用同一个端口,更接近真实的场景。

切换到项目目录下执行

docker build -t blockchain .

命令会根据目录下的dockerfile文件创建一个docker容器, 执行成功后,用docker images可以查到该容器。

blockchain                     latest              aa4dbddbd6e0        3 minutes ago       143MB

启动容器, 我们这里还是启动三个节点。

docker run --rm -p 81:5000 blockchain
docker run --rm -p 82:5000 blockchain
docker run --rm -p 83:5000 blockchain

测试的http地址和上面一样,只不过端口地址改成了81, 82, 83

写一个go版本

我仿照这个思路写了一个go语言实现的版本。

地址:

https://github.com/pony-maggie/blockchain

一个简易的区块链demo相关推荐

  1. Java实现一个简易的区块链(三)

    继前两篇文章主要完成对区块链总体框架结构的设计.引入hash值验证前后节点数据是否被篡改等等,这里引入数字签名,进一步对交易进行合法性验证.在数字签名的部分没有使用secp256k1的数字签名算法,而 ...

  2. Java实现一个简易的区块链(二)

    学习目标: 实现二中主要对交易数据类型进行修改,包括交易数据链由String类型到对象数组类型:链的结构也进行了调整,除此之外,新增了交易的对象,目前项目已经实现总体数据结构,可以将几笔交易加入到交易 ...

  3. Java实现一个简易的区块链(一)

    - 下面是获得sha256加密后的64位16进制哈希值的类及方法,这里需要先导入一个通用的编码解码包commons-codec依赖,并下载好该资源. <!-- https://mvnreposi ...

  4. 用Go语言建立一个简单的区块链part6(2):交易(2)

    交易(2) 引言 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库& ...

  5. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  6. 用Go语言建立一个简单的区块链part7:网络

    Part 7: 网络 目录 引言 区块链网络 节点角色 网络简化 实现 场景 版本 getblocks inv getdata block 和 tx 结果 NODE 3000 NODE 3001 NO ...

  7. 用Go语言建立一个简单的区块链part1:基本原型

    基本原型 引言 区块链是 21 世纪最具革命性的技术之一,它仍然处于不断成长的阶段,而且还有很多潜力尚未显现. 本质上,区块链只是一个分布式数据库而已. 不过,使它独一无二的是,区块链是一个公开的数据 ...

  8. 用200行Go代码写一个自己的区块链!

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...

  9. 一个无边界区块链世界DIOT平行链数字物联网致力打造跨境电商 跨境支付 跨境地产

    区块链自21世纪初期发展起来,是目前全世界认为最有潜力.最具想象力的一种技术革新.区块链是去中心化.去信任化的网络,可以实现点对点价值交换,被人们称之为价值互联网. DIOT致力于打造一个无边界的区块 ...

最新文章

  1. 微软修复20多年的老漏洞:Win95时就存在了
  2. oracle 恢复 跳过 表空间,Oracle表空间恢复
  3. NeurIPS 2021有哪些值得读的NLP论文?
  4. CCCC L1-002. 打印沙漏【图形打印】
  5. 诺基亚 XGS-PON FTTP 系统在科威特完成测试
  6. Sqlite锁与事务
  7. Java Socket设置timeout几种常用方式总结
  8. 触动精灵 alilib
  9. android 虚拟按键root,(免root)虚拟按键手动修改方法
  10. 五子棋-完美解决闪屏问题版-新增悔棋功能(C++实现)
  11. Michaelの烦恼系列漫画第二季 | 神秘的小黑屋
  12. 给SwipeRefreshLayout添加上拉加载更多功能
  13. 发布制品到 Jfrog Artifactory
  14. 超参数调整的方法介绍
  15. 一个印度人写的VC串口类CSerialCom(有串口基础介绍)
  16. 小白学习图像处理3——图像旋转原理
  17. Python 搭建量化交易系统
  18. vue中使用echarts和百度地图实现飞机迁徙图
  19. 核磁共振测试谱图解析(一)
  20. CVE-2016-7124漏洞复现

热门文章

  1. 计算机课作业在线管理,数学与计算机学院课程作业规范化管理办法
  2. 优秀的产品经理的准则
  3. stm32f051 TIM15、16、17 无法出PWM
  4. Intel研究院院长吴甘沙演讲全文:大数据分析师的卓越之道(32PPT)
  5. 优酷爱奇艺等已叫停引进海外剧:英美剧日本动漫皆受影响
  6. Mybatis实现自定义TypeHandler
  7. 卡西欧手表 型号 解析【整理】
  8. 高效代码审查的八条准则和十个经验
  9. 电脑分区提示要格式化怎么办?能恢复数据吗?
  10. TAQS.IM Solo v1.2.11 WiN 中东方韵律合成器