1. 程式人生 > >一個簡易的區塊鏈demo

一個簡易的區塊鏈demo

別人寫的python版本

python版本原始碼地址:

環境準備

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

需要安裝python3.6+(步驟省略)

安裝pipenv

$ pip install pipenv 

建立虛擬執行環境(類似docker一樣)

[email protected]:~# 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

切換到原始碼目錄

[email protected]:/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

原始碼分析

原始碼不分析了,太過簡單,自己看吧。不過能看懂原始碼的前提是你對區塊鏈(尤其是比特幣上的區塊鏈)的一些機制原來有一定的瞭解,比如工作量證明,共識機制等。

原始碼中有一處錯誤我已經在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/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"
  ]
}

在A節點上新增兩筆交易

http://localhost:5000/transactions/new

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

響應
{
  "message": "Transaction will be added to Block 2"
}
http://localhost:5000/transactions/new

json 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,可以看下這篇文章:

總之就是了類似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語言實現的版本。

地址:

相關推薦

一個簡易區塊demo

別人寫的python版本 python版本原始碼地址: 環境準備 我使用的是ubuntu 16.04,其它linux版本也可以。 需要安裝python3.6+(步驟省略) 安裝pipenv $ pip install pipenv 建

從0到1簡易區塊開發手冊V0.2-創建錢包

alt 不存在 引導 shadow ado 校驗 圖片 vat tps 1.概念 創建錢包其實就是創建比特幣地址,在比特幣世界中,沒有賬戶概念,不需要也不會在任何地方存儲個人數據(比如姓名,×××件號碼等)。但是,我們總要有某種途徑識別出你是交易輸出的所有者(也就是說,你擁

從0到1簡易區塊開發手冊V0.5-實現余額查詢

def nba getaddr 查詢 key dex ani puts += 七. 查詢余額 其實這個章節的一些知識點在轉賬交易那一章節均有所涉及,所以,查詢余額這個功能相對而言比較簡單,只要熟悉了UTXO模型,加上對交易流程的了解之後,對查詢余額基本上已經有了思路。 1.

從0到1簡易區塊開發手冊V0.4-實現轉賬交易的思路分析

序列 場景 tran color value lastb ali 區塊 創建 六.轉賬交易 創世區塊創建完畢之後,按照我們的正常思路,是繼續創建新的區塊,並加入至區塊鏈中,沒錯,這確實是學習路線,但是我們首先來了解一個區塊是如何生成的,轉賬交易 ===>打包交易 =

從0到1簡易區塊開發手冊V0.6-實現打印區塊

操作 error 8 8 size ima 鎖定 圖片 src 。。 八. 打印區塊 以上的轉賬交易中,我們共計創建了四個區塊,其中一個區塊為創世區塊,另外三個區塊都是對我們的交易進行打包後產生的新區塊,本文將介紹如何將區塊信息打印出來。 1.命令行代碼 func (cli

簡易區塊的python實現

import hashlib import datetime class TTBlockCoin: def __init__(self, index, # 索引 timeStamp, # 時間戳

【提醒】家譜GCS,又一個區塊概念包裝的傳銷幣!

比特幣及各種山寨幣經過2017年瘋狂的暴漲,數字貨幣動輒幾十倍上百倍的暴富效應,吸引了大量普通人開始關注數字貨幣和區塊鏈,市場上於是出現了各種區塊鏈、數字貨幣、虛擬貨幣投資為名,行非法集資或網路傳銷之實的案例。 家譜鏈GCS,又一個以區塊鏈概念包裝的傳銷幣! 一、專案方相關成員造假 官網顯示,“京東集團

NodeJS區塊實踐(1)Nodejs搭建簡易區塊

區塊鏈的目的之一是讓我們所需要的“有價值”的資訊得以儲存且不可更改,這些資訊都儲存在一個叫做“區塊(block)”的結構中。以比特幣為例,被認為是有價值的資訊是“交易”,所有的交易儲存在區塊中,通過區塊的hash、時間戳等實現資訊的可追溯以及不可更改性。 我們這裡首先實現的

BTA | 張犁 :為什麼需要一個通用區塊資產平臺?

在張犁看來,區塊鏈被認為是一個傳遞資產價值的網路,但直到目前為止,區塊鏈的主要方向還是加密貨幣,

通過寫一個python區塊原型程式學習區塊

通過寫一個區塊鏈原型程式學習區塊鏈網上看到一篇翻譯文章:學習一門技術最好的方法就是自己做一個,水平有限,手敲了一遍這個程式碼,邊敲邊學,在這個過程中對區塊鏈有了更加全面的認識,同時也學習了一些python知識。區塊鏈基本概念區塊鏈是一個分散式賬本,每個參與挖礦的節點共同儲存全

從Go語言編碼角度解釋實現簡易區塊——實現交易

在公鏈基礎上實現區塊鏈交易 區塊鏈的目的,是能夠安全可靠的儲存交易,比如我們常見的比特幣的交易,這裡我們會以比特幣為例實現區塊鏈上的通用交易。上一節用簡單的資料結構完成了區塊鏈的公鏈,本節在此基礎上對區塊鏈的交易部分進行實現。實現公鏈 交易機制 在區塊鏈中,交易一旦被建立,就沒有任何人能夠再去修改或是刪除它,

用 Python 擼一個區塊

條件 ask 接收 掌握 color resolve iou value 使用 本文翻譯自 Daniel van Flymen 的文章 Learn Blockchains by Building One 略有刪改。原文地址:https://hackernoon.com/le

邏輯燒腦:python 區塊簡易實現

jpg bsp png eight src 區塊鏈 testin box 這一 區塊鏈技術因為比特幣的火爆而廣受關註,我們這裏用 python 代碼來聊一下區塊鏈技術: 區塊鏈實現原理的簡易描述 區塊鏈技術做為一種數字記賬技術,其核心是將保存了交易數據的區塊,以加密的方

蔡文勝和美圖布局區塊,能有一個好未來嗎?

智能 時間 停止 有一個 服務商 log 康斯坦丁 企業 顯示 2月22日,美圖公司公告公司董事變更,羅寶文於今日辭去公司獨立非執行董事、提名委員會及薪酬委員會成員職務,以投入更多時間專註於她的其他工作承諾。同時,公司任命張首晟教授為獨立非執行董事、提名委員會及薪酬委員會成

只用200行Go代碼寫一個自己的區塊

itl OS qpi master method 最長 png log 得出 區塊鏈是目前最熱門的話題,廣大讀者都聽說過比特幣,或許還有智能合約,相信大家都非常想了解這一切是如何工作的。這篇文章就是幫助你使用 Go 語言來實現一個簡單的區塊鏈,用不到 200 行代碼來揭示

區塊能為教育帶來什麽? 構建一個信息認證管理數據庫

rpd .html ref pbd question blog hdp iso clas o2qss0蒙輾夜史銜魏http://wenda.cngold.org/question743374.htmnpjfz7研運某顆馗陌http://wenda.cngold.org/qu

一個區塊小白的自傳

區塊鏈一個區塊鏈小白的自傳 作者:山石 我是一個小白,一個區塊鏈方面的小白,在我之前的生活中從來沒聽說過區塊鏈這個概念。直到有一天我朋友跟我介紹這個東西,但是當時的我對區塊鏈並不感興趣,即使朋友介紹之後還是不知道區塊鏈是做什麽的。後來抱著嘗試的心理

300行ABAP代碼實現一個最簡單的區塊原型

指向 repo 方法調用 輸入參數 transacti ui控件 挖礦 太多的 work 不知從什麽時候起,區塊鏈在網上一下子就火了。 這裏Jerry就不班門弄斧了,網上有太多的區塊鏈介紹文章。我的這篇文章沒有任何高大上的術語,就是300行ABAP代碼,實現一個最簡單的區

區塊很難嗎? 40行python開發一個區塊

Python 區塊鏈 金融 盡管有人認為區塊鏈目前還是個不成熟的解決方案,但它無疑稱得上是計算機發展歷史上的一個奇跡。但是,到底區塊鏈是什麽呢? 我們將通過動手實現一個迷你的區塊鏈來幫你真正理解區塊鏈技術的核心原理。python源代碼保存在Github。區塊鏈區塊鏈是一個公開的數字賬本,它按時間順

用 Python 構建一個極小的區塊

計算機 特定 使用 lock 為我 並且 沒有 python學習 為什麽 雖然有些人認為區塊鏈是一個早晚會出現問題的解決方案,但是毫無疑問,這個創新技術是一個計算機技術上的奇跡。那麽,究竟什麽是區塊鏈呢? 區塊鏈 以比特幣(Bitcoin)或其它加密