区块链入门_1

引言

区块链可以看做是一种数据的分布式存储方法。每一个节点所存储的数据都是完整的(即每一个节点的数据都是一个备份),且不可修改。目前区块链主要应用于金融领域,希望有朝一日该技术能在其他地方展露锋芒。

区块链起源

区块链技术起源于2008年中本聪《比特币:一种点对点电子现金系统》,区块链诞生自中本聪的比特币,目前区块链最经典的应用就是比特币,当然现在也出现了一些如:以太坊这样的新应用

区块链基础结构(bitcoin)

bitcoin中的区块链结构
图中各参数(在实际情况中,参数可能会更多)
Time:该区块建立的时间,有特殊的作用,见参考资料[4]
Nonce:一个随机数。因为要获得一个区块的打包权,需要使得该给定区块的随机散列值的前缀出现多个0(0的数量是有一定要求的),这通常要进行大量的计算(bitcoin的工作量证明(POW)就是如此)。因为同样的输入数据在经过哈希算法加工后所得的结果是一样的,故现在要引入一个变量(实际情况可能由多个变量控制)来改变这种结果以求得符合要求的随机散列值。

如:bitcoin中第558781个区块的随机散列值:0000000000000000000fbb90ac16fce1fa83d6908005548781a91c840fa10f17

    public static void main(String[] args) {
        int nonce = 0;
        String result = null;
        String data = "Dylan";
        do {
            result = HashCalculator.hashResult(data + nonce);
            nonce++;
        }while (!result.startsWith("0000"));
        System.out.println("nonce: " + nonce);
        System.out.println(result);
    }
    /*
    代码中所调用方法在下文
    如我们要获取随机散列值是由0000起始时,则nonce的值为604
    上述代码输出结果:
    nonce: 604
    000093a262d2529e30f182ad843ef07a556ce00af1adfe35d3700a326ba0808f
    */

在bitcoin中谁先求出这种符合要求的结果,谁就有把交易(数据)打包成区块的所有权并获取相应的奖励。这种奖励也是bitcoin的区块链长度以及价值能够进行到如今这种规模的原因之一(本文写作时bitcoin的价格已经涨到每个比特币:$39,197.57)。
Prevhash:前一个区块的随机散列值。每个区块通过此随机散列值链接(计算哈希值的过程可以看做给一个函数赋值x,则输出一个y,此时的x与y是一对一的关系且不可由y推出x)。而且这个参数的加入,赋予了区块链不可修改的特性,这在后文会简单介绍。
<Transactions>:图中指的是交易数据,其实我们可以广义化;如放一些可以公布但又不可修改的数据。

网络

共识算法

在生活当中,共识指的就是对某件事达成一致的看法。在计算机中,就本文来说,共识就是网络中各个节点之间对区块链上的数据达成一致。
如bitcoin上的共识大致过程:

1.新的交易(数据)向全网进行广播;
2.每一个节点都将收到的交易信息纳入一个区块中;
3.每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明(找起始为特定个数0的随机散列值,即POW);
4.当一个节点找到了一个工作量证明,它就向全网进行广播;
5.当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
6.其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区块的随机散列值。

节点始终都将最长的链条视为正确的链条,并持续工作和延长它。如果有两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。当此情形,他们将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。该僵局的打破要等到下一个工作量证明(POW)被发现,而其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。 所谓“新的交易要广播”,实际上不需要抵达全部的节点。只要交易信息能够抵达足够多的节点,那么他们将很快被整合进一个区块中。而区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出自己下载该区块的请求。

特点

去中心化

现在落地的大多数应用,都是中心化、第三方平台搭建的,而区块链最重要的一个特点就是去中心化。中心化往往会带来一些不必要的第三方资源消耗,而且容易遭受攻击。像bitcoin这样的去中心化应用,则不用为第三方耗费资源(只有一个打包费,也可以不交费,但后果就是你的交易可能不能被及时打包成区块),而且也不容易遭受攻击,这主要是因为全网的节点都是一个数据备份点,其中任何一个节点被攻击,对整个bitcoin网络来说,起不到任何威胁作用,如果要想攻击全网所有节点的话,目前来说几乎不可能(未来的量子计算机可能行吧)。

去中心化图解
上图描述的只是去中心化应用的一小部分优点(也就是p2p交易)。

不可修改性

区块链是不可修改,开放的。这主要由计算随机散列值的算法决定的,因为输入数据的一个微小改变都会造成输出的随机散列值发生大的变化。
在这里插入图片描述

//这是一段使用SHA-256算法的代码
public static String hashResult(String data) {
        StringBuilder result = new StringBuilder();
        MessageDigest object = null;
        byte[] encrypted = new byte[0];

        try {
            object = MessageDigest.getInstance("SHA-256");
            encrypted = object.digest(data.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        for (byte b : encrypted) {
            result.append(String.format("%02x", b));//16进制输出
        }
        return result.toString();
    }

当输入的data有一个微小改变时,输出的result发生了大的改变
如输入数据分别为:

System.out.println(HashCalculator.hashResult(“Dylan123”));
运行结果:0e66e671e182bae61d8e1b3d93134927cbbe574cd35f50b78cdc22fb8b278c5b
System.out.println(HashCalculator.hashResult(“Dylan123.”));
运行结果:85b8ce6ee069be094ec8405a327cb41faaeb05861e70f22bd46499d74b79ad8d
可见输入数据的微小改变,输出结果有多么千差万别。

所以当区块把前一个区块的随机散列值,加入到该区块中并进行哈希计算,得出的随机散列值再放入到下一区块中进行计算,周而复始。当你修改前面的区块的一个数据,哪怕只是一个标点符号,那么后面的所有区块的随机散列值都要重新计算,在bitcoin中这种计算量是相当大的,如果非要去修改它,那么这个过程所花费的代价是得不偿失的。所以这就赋予了区块链的不可修改性。

参考资料

[1] 比特币白皮书
[2] 以太坊白皮书
[3] 区块链起源介绍
[4] 时间戳简单理解
[5]七个步骤入门区块链
[6] 简单入门区块链

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值