1. 程式人生 > >區塊鏈學習—從零開始建立自己的區塊鏈應用

區塊鏈學習—從零開始建立自己的區塊鏈應用

閱讀物件

本文閱讀物件,主要是希望和即將從事區塊鏈開發的專案架構師,開發工程師,專案設計或產品設計師。要求閱讀者具備一定的“區塊鏈”基礎知識、概念和以及相關的技術知識。

如果你只需要對區塊鏈應用做一個更深更直觀的瞭解,通過本文的例子更清晰瞭解區塊鏈是怎麼回事,大概是怎麼開發出來的,怎麼使用,那麼知道一些區塊鏈相關知識即可。

如果你是一個想從事這方面工作的人,尤其是從事開發和架構的技術人員,那麼需要的技術知識就相當的多了,無法一一列舉,大概一個高階網路開發工程師和中級以上的架構師水平,是需要的。

 

前言

很多新的概念,人們在剛接觸的時候,會讓人感到非常困惑,學了好多次都稀裡糊塗,並不僅僅是技術,很多地方都是如此。對於比較難理解的概念,用什麼辦法去學習最高效呢?我一直認為,就是找一個例子,或者寫一個

Demo,世上無難事,for一個example即可。。。

 

最近一段時間,AI人工智慧方興未艾,區塊鏈技術又迎面走來,對數字貨幣的崛起感到新奇的我們,估計很想知道其背後的技術--區塊鏈是怎樣的一個東西。但是完全搞懂區塊鏈並非易事,在實踐中學習方為上策。

 

我喜歡把程式當成詩歌來寫,理所當然要通過寫程式碼來實現並執行一個例子,來理解並學習這門技術。這裡,就通過用JAVA語言實現和構建一個區塊鏈來探討對區塊鏈的理解。

 

本文,我們要用區塊鏈來實現這麼一個例子,名字叫“區塊鏈成語接龍”。使用者通過這個例子,可以不斷的接龍前面一個使用者的成語,規則和普通遊戲一樣,前面一個使用者的成語的最後一個字,作為後面一個成語的第一個字。

 

單單作為一個應用,這個很簡單吶,問題是,我們要用區塊鏈的原理和相關技術實現它。

 

OKlet’s go… …

 

準備工作

這個時候其實我很想大喊一聲:“區塊鏈”其實不是某一種單純的技術,而是基於某一種思想的多種技術的結合。

需要的技術包括分散式儲存,分散式計算,P2P資料同步,加密解密,安全傳輸,一些語言,一些開發工具。。。還有一些新型的概念 – 分散式節點,工作量證明,共識演算法。。。等等

基於哪一種思想呢,大家都說是“去中心化”,我覺得就是“反壟斷”“反。。。”,敏感話題,不展開了。但是我事實上是一個喜歡民主的人,所以區塊鏈的“去中心化”對我吸引力頗大。。。all men are created equal…

J

 

本文裡面涉及到的一些例子,來源是網上,有些是Python版本,有些是Java版本,C版本,考慮到JAVA更為通用和易讀寫(其實我是認為JAVA語言更像詩歌了),就把他們改成了JAVA版,所以要求讀者對詩歌..哦,不是,是對JAVA非常瞭解,能讀寫基本的語法框架和邏輯,並且因為這個DEMO的特殊性,需要對網路框架和HTTP請求有基本的瞭解。

 

我們知道區塊鏈是資料塊和鏈的儲存方式的組合,是由N多個數據區塊按照鏈的組織和記錄構成的不可變、有序的鏈結構,記錄可以是交易、檔案或任何你想要的資料,同時它們是通過雜湊值(hashes)連結起來的。所以,在閱讀本文之前,一定要閱讀幾篇關於區塊鏈的文章,瞭解裡面塊,鏈,資料,工作量證明等等概念,最好也瞭解一些相關技術比如Hash,分散式儲存等等的概念。如果你還不是很瞭解這些,請找度娘。

        

         如果在瞭解這些概念的過程中,一不小心接觸到了比特幣,請一定要明白,比特幣只是區塊鏈技術的一個產品實現。如果還接觸到其它一些諸如乙太網等等的名詞,那麼需要知道,這些都是區塊鏈技術下實現的一些框架和產品。

 

 

環境準備

理論上來說,可以用任何一種語言來建立任何一種技術的例子,包括區塊鏈的例子,我們這裡選用了JAVA,所以要在自己的電腦上,準備JAVA的相關開發環境。

 

確保你的電腦上已經安裝了較新版本的JDKTomcat和某一種你熟悉的最好能整合TomcatJAVA IDE,本例用的是EclipseTomcat在我們這個例子中間,是一個WEB工具,因為我們的專案,需要基於WEB  HTTP 釋出和執行。

 

如何安裝Java和各種工具,包括如何用Eclipse建立Dynamic web專案併發布到Tomcat等等步驟,既然你已經如此熟悉JAVA了,這裡就不再多講。

 

 

開始建立區塊鏈

 

區塊或稱資料塊Block

區塊鏈中每個區塊包含以下基本內容:索引(index),Unix時間戳(timestamp),資料塊(data)(包括交易,文字,申明,獎勵等任何和合適的內容),證明或工作量證明(proof稍後解釋)以及前一個區塊的Hash值,Hash 用來連結資料塊,同時確保資料塊不被非法修改。

以下是一個區塊的結構:

public class Block {

 

   int iIndex;              //索引

   String sProof;           //工作量證明,在這個例子裡面,其實就是一個經過驗證的正確的成語

   String sPreviousHash;    //前一個區塊的Hash

   Timestamp tsCreateTime;  //區塊建立時間戳

  

  

   /*資料塊

    *

    * 使用者每接上一個成語,會得到系統10元錢的獎勵,同時會贏得前面一個使用者的2元錢

    * 資料區同時需要記錄自己的使用者名稱和回答出上一個成語的使用者名稱

    *

    * */

   String sSender;           //回答出上一個成語的使用者名稱

   String sRecipient;        //回答出當前這個成語的使用者名稱

   final int iMoneyAward=10; //系統獎勵,數額固定

   final int iMoneyWin=2;    //贏取獎勵,數額固定

  

  

   public Block(){

     

   }

  

  

}

 

 

區塊鏈實現Blockchain

 

import java.util.*;

import blockchain.Block;

 

public class BlockChain {

   //用來儲存區塊

private List<Block> lBlockchain=new ArrayList<>[];   

        

  

   public BlockChain(){

     

   }

  

  

   //建立新塊

   public Block NewBlock(){

      Block bRet=null;

     

      //在這裡建立一個新塊

     

      return bRet;

   }

  

   //Hash 一個塊

   public String Hash(Block block){

      String sHash=null;

     

      //在這裡Hash 一個塊

     

      return sHash;

   }

  

   //其他方法

   //....

}

 

 

 

Blockchain類用來管理鏈條,它能儲存和更新鏈資料,加入新塊等等,下面我們來進一步增加和完善裡面的一些方法

 

建立新塊和創世塊

 

當一個使用者按照成語接龍的規則,對上上一個成語,並且系統驗證這成語正確(工作量被證明)。這個時候我們就可以建立一個新塊,並且加到鏈裡面。

 

一旦工作量證明確認,並且上一個塊hash 生成後,就可以簡單呼叫函式建立一個新塊了。

 

建立新塊方法如下:

 

 

   //建立新塊

   public Block NewBlock(int i,String proof,String hash,Timestamp c,String sender,String recipient){

      Block bRet=null;

     

      //在這裡建立一個新塊

      bRet = new Block(i,proof,hash,c,sender,recipient);

     

      return bRet;

   }

 

 

這裡,我們需要提一下創世塊的概念,創世塊是區塊鏈的第一個區塊,它是沒有前區塊的。邏輯上只在第一個使用者第一次啟動系統的時候,才需要建立創世塊,後面的都是通過同步獲得。創世塊索引是0,同樣需要給它加上一個工作量證明,我們這裡就是初始成語“海闊天空”,因為沒有前面的塊,所以hash=””,同時給一個固定的建立時間。方法如下:

 

   //創始塊的建立,創世塊是一個塊,必須是固定的資訊

   //邏輯上來說,只有在區塊鏈產品的第一個使用者第一次啟動的時候,才會需要建立創世塊

   public Block CreateFirstBlock(){

      try{

         Timestamp t=new Timestamp((new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse("2018-01-01 01:01:01").getTime());

         return NewBlock(0,"海闊天空","",t,"","");

      }catch(Exception e){

         return null;

      }

   }

 

 

 

這裡順便貼上生成塊的Hash字串的方法:

   //Hash 一個塊

   public static String Hash(Block block){

      String sHash=null;

     

      //在這裡Hash 一個塊

      String s=block.sPreviousHash+block.sProof+block.sRecipient+block.sSender+block.tsCreateTime.toString();

     

      sHash = MD5(s);

      

      return sHash;

   }

  

   public static String MD5(String key) {

        char hexDigits[] = {

                '0''1''2''3''4''5''6''7''8''9''A''B''C','D''E''F'

        };

        try {

            byte[] btInput = key.getBytes();

            // 獲得MD5摘要演算法的 MessageDigest 物件

            java.security.MessageDigest mdInst = java.security.MessageDigest.getInstance("MD5");

            // 使用指定的位元組更新摘要

            mdInst.update(btInput);

            // 獲得密文

            byte[] md = mdInst.digest();

            // 把密文轉換成十六進位制的字串形式

            int j = md.length;

            char str[] = new char[j * 2];

            int k = 0;

            for (int i = 0; i < j; i++) {

                byte byte0 = md[i];

                str[k++] = hexDigits[byte0 >>> 4 & 0xf];

                str[k++] = hexDigits[byte0 & 0xf];

            }

            return new String(str);

相關推薦

區塊學習開始建立自己區塊應用

閱讀物件 本文閱讀物件,主要是希望和即將從事區塊鏈開發的專案架構師,開發工程師,專案設計或產品設計師。要求閱讀者具備一定的“區塊鏈”基礎知識、概念和以及相關的技術知識。 如果你只需要對區塊鏈應用做一個更深更直觀的瞭解,通過本文的例子更清晰瞭解區塊鏈是怎麼回事,大概是怎麼開發出來的,怎麼使用,那麼

開始建立自己區塊應用(JAVA版)

本文閱讀物件,主要是希望和即將從事區塊鏈開發的專案架構師,開發工程師,專案設計或產品設計師。要求閱讀者具備一定的“區塊鏈”基礎知識、概念和以及相關的技術知識。如果你只需要對區塊鏈應用做一個更深更直觀的瞭解,通過本文的例子更清晰瞭解區塊鏈是怎麼回事,大概是怎麼開發出來的,怎麼使

區塊開始寫一個區塊遊戲--水果機

機器環境 win10 nodev8.9.4 npm install -g truffle npm install -g ganache-cli Github地址 效果 初始化專

帶你挖礦之旅!Python開始建立區塊!提供原始碼哦!月薪十萬

環境準備 確保已經安裝Python3.6+, pip , Flask, requests,安裝方法: pip install Flask==0.12.2 requests==2.18.4 同時還需要一個HTTP客戶端,比如Postman,cURL或其它客戶端。參考

用spring boot 2開始建立區塊

一、區塊鏈物件模型的基礎屬性(BlockChain) @ApiModelProperty(value = "當前交易列表", dataType = "List<Transaction>") @JSONField(serialize = false) @Js

用Python開始建立區塊

本文主要內容翻譯自Learn Blockchains by Building One 本文原始連結,轉載請註明出處。 作者認為最快的學習區塊鏈的方式是自己建立一個,本文就跟隨作者用Python來建立一個區塊鏈。 對數字貨幣的崛起感到新奇的我們,並且想知道其背後的技術——區塊鏈是怎樣實現的。 但是完全搞懂區塊鏈

看完此文再不懂區塊算我輸,用Python開始建立區塊

如果你還沒有聽說過 3 點鐘區塊鏈群,說明你還不是鏈圈的人;如果你還沒有加入 3 點鐘區塊鏈群,

Python 開始構建自己的比特幣區塊系統

本文轉自PythonCaff作者SummerHappy Coding.你是否會和我一樣,對加密數字貨幣底層的區塊鏈技術非常感興趣,特別想了解他們的執行機制。但是學習區塊鏈技術並非一帆風順,我看多了大量的視訊教程還有各種課程,最終的感覺就是真正可用的實戰課程太少。我喜歡在實踐中

用 Python 開始建立區塊

本文主要內容翻譯自 Learn Blockchains by Building One 本文原始連結 , 轉

【程式設計師必看】如何用Python0開始建立一個區塊

在數字貨幣盛行的檔口,比特幣,這幣那幣到底值不值得信賴呢?也許你像很多人一樣感到新奇,想接近它,但只因背後的區塊鏈技術,阻斷了向新領域嘗試的步伐。不過,對於程式設計師來說,想真正搞懂比特幣,搞懂區塊鏈,可不是難題,因為他們能邊玩邊學,通過一行行pyhton

深度學習R(1):開始建立完全連線的神經網路

作者:PENG ZHAO 我要感謝Feiwen, Neil和所有其他的技術評論家和讀者,他們為本文提出了寶貴的意見和建議。 背景 深度神經網路(DNN)近年來取得了在影象識別、自然語言處理和自動駕駛領域取得了巨大成就,如圖1所示,從2012至2015

開始搭建自己的VueJS2.0+ElementUI單頁面網站(一、環境搭建)

如圖所示 增刪改 type default sdn orm rain exp 名稱 原網址:https://blog.csdn.net/u012907049/article/details/72764151 前言 VueJS可以說是近些年來最火的前端框架之一,越來越多的

開始搭建自己的.NET Core Api框架】(二)搭建項目的整體架構

config 七層 數據 TP 暫時 整體架構 比較 架構 其他 本來打算將搭建項目架構和集成SqlSugar放在一起講的,但是感覺東西有點多,還是分成兩章吧~ 這一章講搭建項目的整體架構,這裏先把搭建完成後的最終效果放出來,然後再逐個解釋每層的作用。 可以看到這裏一

開始搭建自己的.NET Core Api框架】(三)集成輕量級ORM——SqlSugar:3.3 自動生成實體類

i++ 點運算 自己的 yui content project style ref 數據庫表 系列目錄 一. 創建項目並集成swagger   1.1 創建   1.2 完善 二. 搭建項目整體架構 三. 集成輕量級ORM框架——SqlSugar   3.1 搭建環境  

開始搭建自己的.NET Core Api框架】(六)泛型倉儲的作用

tar write ges 分享圖片 () dex 抽象 .sql cut 系列目錄 一. 創建項目並集成swagger   1.1 創建   1.2 完善 二. 搭建項目整體架構 三. 集成輕量級ORM框架——SqlSugar   3.1 搭建環境   3.2 實戰篇:

開始-打造自己的虛擬實驗室-3

兩臺 分享圖片 本地 roc 綁定 cto ffffff ado 技術 虛擬交換機:用於虛擬機之間的網絡通訊 專用:本地虛擬機和虛擬機之間的通訊 在虛擬機的虛擬網卡中可以選擇虛擬交換機的連接 外部:用於虛擬機和外部網絡進行通

開始-打造自己的虛擬實驗室

rtu 封裝 快速 confirm 系統 硬件要求 download size 教育 實驗的計算機硬件要求CPU和主板:i5以上、VT虛擬化,SLA二級緩存優化、主板的BIOS中啟用VT虛擬化技術 內存:16GB以上 磁盤:專

開始建立一個屬於你個人的Hexo博客

bash 網頁 服務器 引擎 branch -s add npm inux 從零開始建立一個屬於你個人的Hexo博客 Hexo 是一個快速、簡約且高效的博客框架。Hexo 使用 Markdown(或其他襯著引擎)解析文章,在幾秒內,便可使用靚麗的正題生成動態網頁。 相形癡肥

開始自己的PHP框架系列教程(二)[App.php]

porting col config exce tro efault fig 默認 clas 從這一個文件開始以後加載的均以類加載,請註意命名空間和所在文件的路徑 APP.php的這個類所在路徑:根目錄\framework\App.php 直接上代碼 namespace

開始建立一個 PHP 擴充套件

建立一個擴充套件的基本步驟都有哪些。示例中,我們將實現如下功能: <?phpecho say();?> 輸出內容: $ php ./test.php$ hello word 在擴充套件中實現一個say方法,呼叫say方法後,輸出 hello word。 第一步:生成程式碼 PHP為我們