区块链学习—从零开始创建自己的区块链应用

本文适合区块链初学者和开发者,通过创建一个区块链成语接龙应用,介绍区块链基础知识,如区块、链、工作量证明、共识算法等。文章详细讲述了如何用Java实现区块链类和区块类,包括工作量证明算法的实现。此外,还讨论了区块链项目启动、节点创建、数据一致性(共识算法)等问题,并提出了一些实际挑战,如数据同步速度和共识算法的公平性。
摘要由CSDN通过智能技术生成

阅读对象

本文阅读对象,主要是希望和即将从事区块链开发的项目架构师,开发工程师,项目设计或产品设计师。要求阅读者具备一定的“区块链”基础知识、概念和以及相关的技术知识。

如果你只需要对区块链应用做一个更深更直观的了解,通过本文的例子更清晰了解区块链是怎么回事,大概是怎么开发出来的,怎么使用,那么知道一些区块链相关知识即可。

如果你是一个想从事这方面工作的人,尤其是从事开发和架构的技术人员,那么需要的技术知识就相当的多了,无法一一列举,大概一个高级网络开发工程师和中级以上的架构师水平,是需要的。

 

前言

很多新的概念,人们在刚接触的时候,会让人感到非常困惑,学了好多次都稀里糊涂,并不仅仅是技术,很多地方都是如此。对于比较难理解的概念,用什么办法去学习最高效呢?我一直认为,就是找一个例子,或者写一个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 生成后,就可以简单调用函数创建一个新块了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三翔馆主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值