最终内容请以原文为准:https://wangwei.one/posts/df1...

引言

区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式。了解和掌握区块链相关知识和技术,是我们每位开发人员必须要去做的事情,这样我们才能把握住这波时代趋势的红利。

本文将基于Java语言构建简化版的blockchain,来实现数字货币。

创建区块

区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。以比特币为例,每个区块主要包含如下信息字段:

  • 区块大小:用字节表示的区块数据大小
  • 区块头:组成区块头的几个字段

    • 区块头hash值
    • 父区块头hash值
    • 时间戳:区块产生的近似时间
    • Merkle根:该区块中交易的merkle树根的哈希值
    • 难度目标:该区块工作量证明算法的难度目标
    • Nonce:用于工作量证明算法的计数器
  • 交易计数器:交易的数量
  • 交易:记录在区块里的交易信息

详见:《精通比特币》(第二版)第9章——区块链

区块数据结构

在这里,我们主要是为了实现最简单的区块链结构,仅仅包含以下几个信息字段:

/*** 区块** @author wangwei* @date 2018/02/02*/
@Data
public class Block {/*** 区块hash值*/private String hash;/*** 前一个区块的hash值*/private String previousHash;/*** 区块数据*/private String data;/*** 区块创建时间(单位:秒)*/private long timeStamp;public Block() {}public Block(String hash, String previousHash, String data, long timeStamp) {this();this.hash = hash;this.previousHash = previousHash;this.data = data;this.timeStamp = timeStamp;}
}
区块Hash值计算

加密Hash值,一个通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。Hash值用于确保blockchain的安全。Hash计算是计算敏感的操作,即使在高性能电脑也需要花费一段时间来完成计算(这也就是为什么人们购买高性能GPU进行比特币挖矿的原因)。blockchain架构设计有意使Hash计算变得困难,这样做是为了加大新增一个block的难度,进而防止block在增加后被随意修改。

/*** <p> 创建新区块 </p>** @param previousHash* @param data* @return*/
public static Block newBlock(String previousHash, String data) {Block block = new Block("", previousHash, data.getBytes(),     Instant.now().getEpochSecond());block.setHash();return block;
}/*** 计算区块Hash* <p>* 注意:在准备区块数据时,一定要从原始数据类型转化为byte[],不能直接从字符串进行转换** @return*/
private void setHash() {byte[] prevBlockHashBytes = {};if (StringUtils.isNoneBlank(this.getPrevBlockHash())) {prevBlockHashBytes = new BigInteger(this.getPrevBlockHash(), 16).toByteArray();}byte[] headers = ByteUtils.merge(prevBlockHashBytes,this.getData().getBytes(),ByteUtils.toBytes(this.getTimeStamp()));this.setHash(DigestUtils.sha256Hex(headers));
}

创建区块链

区块链本质上是一种有序反向链接链表的数据结构。这意味着,block按照插入的顺序存放,同时每个block都保存指向上一个block的链接。这种结构保证可以快速获取最新插入的block同时获取它的hash值。这种结构保证可以快速获取最新插入的block同时(高效地)获取它的hash值。

区块链数据结构
/*** <p> 区块链 </p>** @author wangwei* @date 2018/02/02*/
public class Blockchain {@Getterprivate List<Block> blockList;public Blockchain(List<Block> blockList) {this.blockList = blockList;}
}    
添加区块

新增一个添加区块链的方法

/*** <p> 添加区块  </p>** @param data 数据*/
public void addBlock(String data) {Block previousBlock = blockList.get(blockList.size() - 1);this.addBlock(Block.newBlock(previousBlock.getHash(), data));
}/*** <p> 添加区块  </p>** @param block 区块*/
public void addBlock(Block block) {this.blockList.add(block);
}
创世区块

在添加区块之前,区块链必须有个创世区块,在Block中新增创世区块方法:

/*** <p> 创建创世区块 </p>** @return*/
public static Block newGenesisBlock() {return Block.newBlock("", "Genesis Block");
}
创建区块链

再在Blockchain中新增创建区块链的方法:

/*** <p> 创建区块链 </p>** @return*/
public static Blockchain newBlockchain() {List<Block> blocks = new LinkedList<>();blocks.add(Block.newGenesisBlock());return new Blockchain(blocks);
}

测试运行

/*** 测试** @author wangwei* @date 2018/02/05*/
public class BlockchainTest {public static void main(String[] args) {Blockchain blockchain = Blockchain.newBlockchain();blockchain.addBlock("Send 1 BTC to Ivan");blockchain.addBlock("Send 2 more BTC to Ivan");for (Block block : blockchain.getBlockList()) {System.out.println("Prev. hash: " + block.getPreviousHash());System.out.println("Data: " + block.getData());System.out.println("Hash: " + block.getHash());System.out.println();}}
}/*** 输出如下信息:*/
Prev. hash:
Data: Genesis Block
Hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4Prev. hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4
Data: Send 1 BTC to Ivan
Hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04Prev. hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04
Data: Send 2 more BTC to Ivan
Hash: 42f78d6a86f88aa9b5b10e468494dfd1b3f558a9fb74a01eb348c2cbfc5d000a

总结

我们构建了一个非常简单的区块链原型:它只是一个块的数组,每个块都与前一个块有连接。 实际的区块链要复杂得多。

  • 缺少交易信息:我们的区块链还没有任何交易信息。
  • 缺少工作量证明:我们的生产区块非常简单快捷,实际的区块链中,生产一个区块需要进行大量的计算。
  • 缺少共识机制:区块链是一个非单一决策者的分布式数据库。 因此,一个新的区块必须得到网络的其他参与者的确认和批

在以后的文章中,我们将介绍这些功能。

资料

  • 源代码:https://github.com/wangweiX/b...
  • https://jeiwan.cc/posts/build...
  • 《精通比特币(第二版)》

基于Java语言构建区块链(一)—— 基本原型相关推荐

  1. 基于Java语言构建区块链(四)—— 交易(UTXO)

    基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...

  2. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  3. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  4. 区块链java语言,基于Java语言构建区块链(一)—— 基本原型

    引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式.了解和掌握区块链相关知识和技术,是我们每位开 ...

  5. 基于Go语言构建区块链:part5

    Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战.本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链. 1.引言 本文 ...

  6. 基于Java的Android区块链开发之生成助记词(位数可选)

    基于Java的Android区块链开发之生成助记词 位数可选 具体实现代码 这里使用bitcoinj库,来实现生成bip39的12个助记词,引用库 implementation 'org.bitcoi ...

  7. java语言分析区块链钱包生成的原理

    java语言分析区块链钱包生成的原理: 一.区块链钱包实现的技术原理用大概就是: 钱包助记词生成了种子,种子发芽结果,果实就是私钥,私钥推导出了公钥,公钥数据的节选部分成了钱包地址.同时钱包提供了Ke ...

  8. 基于Java的Android区块链钱包开发(ETH篇)

    基于Java的Android区块链钱包开发-ETH篇 引言 使用的库 具体代码如下 生成公私钥.地址 查余额.签名转账 引言 首先要生成12个助记词,区块链开发之生成12个助记词 使用的库 imple ...

  9. 如何在JAVA中构建区块链?

    区块链炒作继续困扰着技术世界.与此同时,许多银行和软件公司也意识到了这一点,并试图将相应的产品投放市场.然而,任何对区块链技术有更深理解和了解的人都会意识到它的缺点.尽管被认为是一种破坏性技术,但它可 ...

最新文章

  1. AndroidManifest.xml
  2. 服务器怎么查看性能,查看服务器进程性能查看
  3. php 使用压缩css文件,PHP-使用GZIP压缩静态CSS文件
  4. CSS3中的透明属性opacity的用法实例
  5. TypeError: HashUpdate fail
  6. 云适配签约比亚迪 构建统一工作平台
  7. 补CEGUIFont_xmlHandler.cpp
  8. 获取salve设备地址_商机 | 优选设备,让废金属加工更高效!
  9. 关于高校房产管理系统中主要管理模块都有哪些
  10. 安全HCIP之eSight
  11. xtu 1403 菱形 思路清晰
  12. 联想笔记本重装系统小结
  13. array方法常用记载
  14. 【征集反馈】工作中让你印象最深刻、最想吐槽的一件事是什么?
  15. 用python的pandas打开csv文件_python读写数据读写csv文件(pandas用法)
  16. stm32f103HC05蓝牙串口程序和自制手机APP
  17. 世界首个拥有肌肉骨骼机器人问世(组图)
  18. bzoj1933: [Shoi2007]Bookcase 书柜的尺寸
  19. HTML中引入CSS文件的几种方法
  20. 浅析云计算领域的专业名词

热门文章

  1. VMWARE 之 ESXI 主机标准安装
  2. 搭建百度unit2.0测试代码(Java)
  3. 电信运营商 IT 系统介绍
  4. Android Studio(十二):打包多个发布渠道的apk文件
  5. Java Web整合开发(14) -- Struts 1.x 概述
  6. ADODB类库操作查询数据表
  7. 自定义用户验证控件CustomValidator
  8. android无法实例化服务,Android:无法实例化类:没有空的构造函数
  9. 水晶报表位置公式_高频、实用函数公式,提升您的工作效率!
  10. 设计模式 — 行为型模式 — 解释器模式