一个简易的区块链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,如需转载请联系原作者。

目录
相关文章
|
12月前
|
存储 区块链 数据安全/隐私保护
区块链会员系统开发功能搭建源码demo
以下是一个简单的区块链会员系统开发源码demo,包括区块链钱包、区块链溯源系统和智能合约:
|
12月前
|
Go 区块链
区块链金融风控系统开发解决方案(源码demo示例)
区块链金融风控系统是一种利用区块链技术建立的金融风控系统,旨在通过多种手段来保证金融交易的安全性和可信性。区块链技术具有去中心化、开放性、自治性和匿名性等特点,这些特性使得它能够保证数据的安全性和隐私性,并使得交易记录能够被全部追溯。同时,区块链技术还能够实现可编程性,从而使得金融交易能够按照事先设定的规则自动执行。
|
存储 安全 算法
区块链游戏DAO模式开发步骤详情 |(源码demo实例分析)
区块链游戏的 DAO 模式开发是指利用 DAO 模式进行游戏开发和管理,其中 DAO 代表着“抵抗者”的意思。这种开发模式颠覆了传统游戏开发中的中心化管理方式,通过去除中介和减少不必要的成本来降低游戏开发的成本。
|
存储 安全 算法
区块链链游项目系统开发(逻辑Demo)‐元宇宙链游系统开发需求方案设计
区块链链游项目系统开发(逻辑Demo)‐元宇宙链游系统开发需求方案设计
183 0
|
9月前
|
存储 安全 区块链
区块链游戏系统开发(开发详细)/案例开发/设计功能/逻辑方案/源码平台
  区块链游戏系统开发是一个复杂而精密的过程。首先,需要进行需求分析和规划,确定游戏系统的功能和特性。然后,进行技术选型和架构设计,选择适合的区块链平台和开发工具。接下来,进行系统的搭建和编码,实现游戏逻辑和用户交互功能。最后,进行测试和优化,确保系统的稳定性和性能。
|
9月前
|
安全 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.
|
9月前
|
存储 JavaScript 前端开发
区块链代币支付钱包(trx/trc20代币/usdt)对接开发
区块链代币支付钱包(trx/trc20代币/usdt)对接开发
|
10月前
|
存储 机器人 大数据
量化交易机器人系统开发(开发策略)及案例丨数字货币区块链交易所系统开发详细项目/方案设计/开发逻辑/源码版
  区块链的核心技术之一就是公开且透明的交易信息。一般情况下,在区块链内产生、流转和存储的信息是对所有节点用户开放的,其高度的透明化也使得区块内的所有人都能够查看数据的所有相关信息同时使用其应用。因此,区块链技术在信息共享与数据交换领域具有一定的优势。
|
10月前
|
存储 安全 区块链
区块链智能合约DAPP开发|DAPP合约代币项目开发(案例说明)
区块链技术使用了分布式网络来实现去中心化
|
10月前
|
存储 开发框架 IDE
区块链dapp开发搭建
区块链DApp开发(去中心化应用开发)是构建基于区块链技术的应用程序的过程。DApp是Decentralized Application的缩写,即去中心化应用。DApp与传统的应用程序类似,但它们是完全去中心化的,不依赖于任何中心化的服务器,而是由区块链网络的节点来运作。