编程小白模拟简易比特币系统(一)

项目概述

相信大家在听到区块链的时候跟我一样,一脸发懵,不清楚这是什么东西,是一门技术?还是一种数据结构?再听到比特币的时候,感觉深不可测,可能会联想到手里攥着的一摞硬币QAQ。那么请你放心往下看,本项目就是小白入门练手的项目,旨在简单了解区块链系统的工作流程,所以与比特币的真正复杂底层实现差距很大,只是简易模拟

这个项目呢,是我在图灵学院诸葛老师的课程上看到的,并非原创,也并非广告,只不过在自己的理解上,加了点改动,是基于maven的,需要有一点点java的基础,后端框架选用的是Spring boot,数据结构那方面只需要知道哈希算法是什么就好,我使用的IDE是idea。由于初学Spirng boot,尝试着尽量使用B/S架构开发整个项目,但是整个系统暂时不涉及到数据库的操作(后边优化中会提到),目前还是缺少了传统三层架构中的持久层开发,整个项目大概就是这个样子(请大家忽略帅气的佳航哥壁纸)。

blockChain

刚刚接触后端开发,才知道Spring boot这个框架,还在学习当中,对于它另外一些强大的功能还有待深入研究。这个项目也可以当作Spring boot的练习项目吧,对于它剩余强大的功能暂不介绍,也不涉及到数据库的操作,只先实现前后端的交互,没学过的不要慌,跟着我慢慢来。

相关概念

首先,让我们来开始明确一下相关的概念。

专业的概念以及历史渊源这里不再赘述,有兴趣的小伙伴可以自行百度,在这里,仅基于我的理解说一下,不足之处还请多多指正。

为了以示区分,免得大家混淆,我们这套系统就叫做球球币吧。好了,正式开始!

什么是区块链?

区块链,顾名思义,是一条由区块链接成的链条。那么区块保存一些信息,在这些信息中其中有一条信息与上一个区块有关,因此就像是数据结构中链表的指针一样,把区块连接到了一起。

blockChain

它还有一个名字就叫做分布式记账系统。区块链就类似于一个大账本一样,记录着所有人的交易,每一个区块都是账本中的一页账单。之所以叫做分布式记账系统,就是因为每一个参与的人都会拥有这份账本。不像现实生活中,大家无法知晓其他人的交易,银行保存了所有人的交易记录,相当于一个中心化的系统,因此说区块链是去中心化的

比特币就是基于区块链这个分布式记账系统的。

什么是区块?

区块相当于一个数据的集合,类似于C中的结构体,记录着许多信息,有区块的编号(id)、时间戳(一个时间的标记)、交易的集合、指向前一个区块的指针(其实是区块hash)、还有当前区块的hash。

block

区块的hash怎么得到的呢?

我们规定:

区块的哈希值 = 上一个区块的哈希值 + 交易信息 + 随机数

由于哈希算法的不确定性,随机数的变化趋势(增大减小)对于哈希值的改变我们根本无法判断。所以对于这个随机数的选择,我们设计从1开始无限增大,直到哈希值满足要求为止。

那么总是依靠上一个区块的哈希值,第一个区块怎么办呢?

因此,第一个区块我们称为创世区块,是我们在这个系统规定的区块。

代码实现

对照上面的概念,我们可以新建一个Block.java代表区块,所以,传说中的区块链就可以理解为一个List<Block>,怎么样,是不是很简单?

public class Block {
    /**
     * 区块索引
     */
    private int index;
    /**
     * 时间戳
     */
    private long timeStamp;
    /**
     * 当前区块的交易集合
     */
    private List<Transaction> transactions;
    /**
     * 工作量证明,计算正确hash的次数
     * 随机数
     */
    private int nonce;
    /**
     * 前一个区块的hash值
     */
    private String previousHash;
    /**
     * 当前区块hash值
     */
    private String hash;
}

那么第一个区块我们就简单的设置为下面这样,这里使用了idea中Lombok插件的Builder注解,为了大家看起来更直观一点,就是最基础的构造函数,看代码大家应该也懂。

Block firstBlock = Block.builder()
        .index(1)
        .timeStamp(System.currentTimeMillis())
        .transactions(new ArrayList<Transaction>())
        .nonce(1)
        .hash("1")
        .previousHash("1")
        .build();

Lombok的pom配置

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

那么在这个区块中,工作量证明是什么呢?

第二个区块又是怎么来的呢?

欢迎去看下一篇文章:编程小白模拟简易比特币系统(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章