一个简易的区块链demo

简介:

别人写的python版本

python版本源码地址:

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


环境准备

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

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

安装pipenv

$ pip install pipenv 
  • 1

创建虚拟执行环境(类似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…


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

随便找一个目录下载源码

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

切换到源码目录

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/000:00:00
To activate this project's virtualenv, run the following:
 $ pipenv shell

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

源码分析

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

源码中有一处错误我已经在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)

  • 1
  • 2
  • 3

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)

  • 1
  • 2
  • 3

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)
  • 1
  • 2

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


测试的流程如下:

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

http://localhost:5000/nodes/register

json 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"
  ]
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在A节点上新增两笔交易

http://localhost:5000/transactions/new

json data:
{
    "sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55",
    "amount": 102
}

响应
{
  "message": "Transaction will be added to Block 2"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
http://localhost:5000/transactions/new

json data:
{
    "sender": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "recipient": "1Ez69SnzzmePmZX3WpEzMKTrcBF2gpNQ55",
    "amount": 103
}

响应
{
  "message": "Transaction will be added to Block 2"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

两笔交易会存在节点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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

可以看到挖矿产生的新区块已经包含了我们刚才添加的两笔交易。另外还有一笔金额是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
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
http://localhost:5000/nodes/resolve
  • 1

用docker来搭建环境

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

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

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

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

切换到项目目录下执行

docker build -t blockchain .
  • 1

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

blockchain                     latest              aa4dbddbd6e0        3 minutes ago       143MB
  • 1

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

docker run --rm -p 81:5000 blockchain
docker run --rm -p 82:5000 blockchain
docker run --rm -p 83:5000 blockchain
  • 1
  • 2
  • 3

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



原文发布时间为:2017年10月30日
本文作者:Pony小马
本文来源:CSDN,如需转载请联系原作者。

目录
相关文章
|
Go 区块链
区块链金融风控系统开发解决方案(源码demo示例)
区块链金融风控系统是一种利用区块链技术建立的金融风控系统,旨在通过多种手段来保证金融交易的安全性和可信性。区块链技术具有去中心化、开放性、自治性和匿名性等特点,这些特性使得它能够保证数据的安全性和隐私性,并使得交易记录能够被全部追溯。同时,区块链技术还能够实现可编程性,从而使得金融交易能够按照事先设定的规则自动执行。
|
存储 区块链 数据安全/隐私保护
区块链会员系统开发功能搭建源码demo
以下是一个简单的区块链会员系统开发源码demo,包括区块链钱包、区块链溯源系统和智能合约:
|
存储 安全 算法
区块链游戏DAO模式开发步骤详情 |(源码demo实例分析)
区块链游戏的 DAO 模式开发是指利用 DAO 模式进行游戏开发和管理,其中 DAO 代表着“抵抗者”的意思。这种开发模式颠覆了传统游戏开发中的中心化管理方式,通过去除中介和减少不必要的成本来降低游戏开发的成本。
|
存储 安全 算法
区块链链游项目系统开发(逻辑Demo)‐元宇宙链游系统开发需求方案设计
区块链链游项目系统开发(逻辑Demo)‐元宇宙链游系统开发需求方案设计
210 0
|
存储 前端开发 安全
DAPP区块链商城系统开发(方案逻辑)丨区块链DAPP商城系统开发(案例设计)/开发项目/源码部署
 区块链(Blockchain)是一种由多方共同维护,使用密码学保证传输和访问安全,能够实现数据一致存储、难以篡改、防止抵赖的记账技术,也称为分布式账本技术(Distributed Ledger Technology)。从本质上看,区块链是通过去中心化和去信任化,集体维护、分布式存储的可靠数据库。
|
开发框架 安全 前端开发
区块链财务管理平台如何开发?区块链财务管理平台开发源码规则解析
开发一个区块链财务管理平台需要多个方面的技术和知识,以下是一些可能的步骤和考虑因素:
|
存储 安全 区块链
区块链游戏系统开发(开发详细)/案例开发/设计功能/逻辑方案/源码平台
  区块链游戏系统开发是一个复杂而精密的过程。首先,需要进行需求分析和规划,确定游戏系统的功能和特性。然后,进行技术选型和架构设计,选择适合的区块链平台和开发工具。接下来,进行系统的搭建和编码,实现游戏逻辑和用户交互功能。最后,进行测试和优化,确保系统的稳定性和性能。
|
安全 Go 区块链
区块链游戏链游系统开发功能详情丨方案逻辑丨开发项目丨案例分析丨源码规则
 In recent years, with the continuous development of blockchain technology, NFTs (non homogeneous tokens) and DAPPs (decentralized applications) have emerged in the gaming industry.
|
新零售 人工智能 算法
农场养成种树游戏系统开发(案例项目)丨区块链DAPP种树游戏系统开发(开发案例)及源码方案
  即企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
存储 JavaScript 前端开发
区块链代币支付钱包(trx/trc20代币/usdt)对接开发
区块链代币支付钱包(trx/trc20代币/usdt)对接开发