主页 > imtoken官方网址 > 什么是区块链和比特币?这篇文章给你答案

什么是区块链和比特币?这篇文章给你答案

imtoken官方网址 2023-02-12 06:49:14

前言:

目前市面上大部分是国外大神对java区块链的两篇教程的生硬翻译。这很容易导致一个问题,就是你明明跑了他的代码,却不知道到底是哪个block。什么是链,比如如何实现去中心化?如何使不可篡改,以及为什么比特币被开采得越来越少,仍然没有得到很好的解释。在本文中,仍然使用该教程的源代码。除了英文注释,我会除了手动翻译成中文,其他变量名都不会改。毕竟人家的想法是对的什么是比特币啊,没必要重新发明轮子。如果你改了一个变量,说代码是我自己写的,那我就和网上的人一起复制转载。人们也不例外。本文不是作者原论文的机械翻译,只是借用了相关代码。希望大家看完之后,对区块链是一种什么样的技术,我们为什么需要区块链等有一个大概的了解。

什么是区块链:

区块链(英文:blockchain或blockchain)是一种点对点的网络系统,通过密码学和共识机制等技术创建和存储巨大的交易数据区块链。——维基百科

什么是区块链,区块链就是爱

明天是小敏和小红在一起的100天。小敏明天想给小红一个大大的惊喜,那就是把他辛辛苦苦研发出来的机器人送给小红。他可以想象小红看到机器人会兴奋,他觉得这太他妈的浪漫了。

但是那天发生了意外。

小黑:你们不能在一起。其实,小红是我的女朋友。

小敏:我是不是绿了,@(#(*#(@.

什么是比特币啊

小黑:不不不,小红其实是我女朋友。

重点来了:注意。

小敏:去你妈的

img

是的,我们交往的第一天,我给了小红一个鼠标,第二天,我给了她一个键盘,第三天,我给了她一个屏幕,第四天……一百天中的第一天,我给了她一个我努力开发的机器人。这些就是证据!

小黑:啊啊啊,我输了,小红是你女朋友。

因为小黑故意篡改小红是小敏女朋友的事实,他被列入黑名单,从此再也没有找到女朋友。

在这个例子中,小红、小敏、小黑是区块链中的链条,在小红和小红相识、相恋之前,每个故事都会形成一个区块。而小民和小红之间的所有故事,都会以直播的形式被区块链上的所有链家​​知晓(太狠了),所以小黑自然不可能说小红是他的女朋友。是的,因为整个区块链上的所有链都见证了小敏和小红是恋人的事实。如果小黑想要篡改小红是他女朋友的事实,那么他需要修改整个区块链中的所有链。对于小敏和小红这对夫妇的记忆,这几乎是不可能的。

什么是比特币啊

这就是区块链的不变性。

同时,如果有一天小敏不爱小红而爱上了小璐,他会删除手机里所有与小红有关的东西,并告诉小璐小璐是他的初恋,小敏只爱小璐。一个人。它有效吗?没用,因为整个区块链中的链都看过小敏和小红的直播,记录小敏和小红在一起的证据。

这是区块链中的不变性。

认真想一想,如果把区块链应用到金融上呢?

以前,我们所有的钱都存放在银行的账户管理系统中。如果有人黑进了银行的账户管理系统,他只需要更改代表他账户余额的一串数字,就可以确定他有多少钱。在链上,每个人都是银行,每个人都是账户管理系统。如果需要修改自己账户的余额,则需要修改全网所有节点的信息。这几乎是不可能实现的什么是比特币啊,因此得到了很大的改进。安全。更不用说其他领域了。然后让我们向您展示如何实现一个简单的区块链。

用java实现一个简单的区块链:

public class Block {
    /**
     * 当前区块的 hash
     */
    public String hash;
    /**
     * 前一个区块的 hash, 本例中,靠这个实现链的
     */
    public String previousHash;
    /**
     * 当前区块的数据,比如交易信息啊等等,在谈恋爱例子中代表小红和小民具体发生的事件
     */
    private String data;
    /**
     * 时间戳
     */
    private long timeStamp;
    private int nonce;
    public Block(String hash, String previousHash, String data) {
        this.hash = hash;
        this.previousHash = previousHash;
        this.data = data;
    }
    public Block(String data, String previousHash) {
        this.previousHash = previousHash;
        this.data = data;
        this.timeStamp = new Date().getTime();
        this.hash = calculateHash();}
    public String calculateHash() {
        String calculatedhash = StringUtil.applySha256(
                previousHash +
                        Long.toString(timeStamp) +
                        Integer.toString(nonce) +
                        data);
        return calculatedhash;
    }
    public void mineBlock(int difficulty) {
        //Create a string with difficulty * "0"
        String target = new String(new char[difficulty]).replace('\0', '0'); 
        while(!hash.substring( 0, difficulty).equals(target)) {
            nonce ++;
            hash = calculateHash();}
    }
}

变量解释:

什么是比特币啊

在这个类中,你可能需要了解 mineBlock() 和 calculateHash() 这两个方法,nonce 是关键变量。

在mineBlock()方法中,会不断的进行hash运算,直到计算出符合条件的区块,nonce就是改变区块所需的次数。在calculateHash()中,我们加上nonce次数,就可以让child计算这个hash了。

让我们看一下 calculateHash() 方法。当我们进行哈希计算时,我们使用前一个区块的哈希作为参数。一旦前一个区块的hash是伪造的或者被篡改了,那么无论怎么计算,calculateHash()方法返回的hash值几乎不可能和区块本身的hash值一样,所以很容易发现该块已被篡改。

至于加密算法,笔者选择了SHA-256,这也是比特币使用的加密算法,被公认为最安全、最先进的算法之一。

StringUtil 类的代码如下所示。由于这和我们今天要讲的话题关系不大,我就不过多阐述了。

public class StringUtil {public static String applySha256(String input) {
        try {MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(input.getBytes("UTF-8"));
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < hash.length; i++) {String hex = Integer.toHexString(0xff & hash[i]);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();} catch (Exception e) {throw new RuntimeException(e);
        }
    }   
}

JsonUtil的代码如下:(使用这个包的时候记得导入JAR包)

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class JsonUtil {public static String toJson(Object object){GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setPrettyPrinting();
        Gson gson = gsonBuilder.create();
        return gson.toJson(object);
    }
}

什么是比特币啊

现在最基本的块已经写好了,我们来简单测试一下,看看我们是否真的能挖到地雷。

创建三个新的 Block 块并将 mineBlock() 方法的参数设置为 5.

测试类代码如下:

public class BlockChainTest {public static void main(String[] args) {
        // 第 1 个区块
        Block firstBlock = new Block(" 我是第 1 个区块 ", "0");
        firstBlock.mineBlock(5);
        System.out.println(" 第 1 个区块 hash: " + firstBlock.hash);
        // 第 2 个区块
        Block secondBlock = new Block(" 我是第 2 个区块 ", firstBlock.hash);
        secondBlock.mineBlock(5);
        System.out.println(" 第 2 个区块 hash: " + secondBlock.hash);
        // 第 3 个区块
        Block thirdBlock = new Block(" 我是第 3 个区块 ", secondBlock.hash);
        thirdBlock.mineBlock(5);
        System.out.println(" 第 3 个区块 hash: " + thirdBlock.hash);
    }
}

结果如下:

第 1 个区块 hash: 00000a6787b74a7ca69f3fb905f17bb09503ff26a736793b582fef13f503247f
第 2 个区块 hash: 00000f5aacb3d9c5d1eeb466472949e6a22aa83c3a5ea4b576661a6895fb26b4
第 3 个区块 hash: 0000007ef526d4a4bbeb33b7a9077e74d3e2b32c4bc4c9c0678e26e430044bd4

你有什么发现吗?也就是我们挖的三个区块,前五个数字都是0,很神奇。

0000052659276b

什么是比特币啊

因此,挖矿的本质其实就是通过哈希计算得到一个合格哈希的过程。

所以知道为什么比特币的开采越来越少。

因为在所有的计算结果中,符合条件的哈希是有限的,计算越多越少。刚开始计算时,因为合格的hash太多,需要的算力比较小,很容易被计算出来,越往后,没有计算出来的合格hash值越少,而且计算所需的算力越大,当只剩下一个合格的哈希值时,那就真的是大海捞针了。这可能是为什么 10 年前,任何一台计算机都可以轻松挖出比特币,但现在需要一个拥有数千台矿机的矿场才能开采它。

这个时候,可能有人会问。我怎么知道你的封锁是否合法?它看起来像这样。如果是非法的,我不知道。不知道有没有改过。不要惊慌,我们会慢慢来的。

public class BlockChainListTest {
    // 这玩意就是我们的区块链,存储我们所有的区块信息。(简陋版)
    public static ArrayList blockChain = new ArrayList();
    // 挖矿的难度,就是计算出来的 hash 前几个字符是 0 才是合法的。
    public static int difficulty = 5;
    public static void main(String[] args) {blockChain.add(new Block(" 我是第 1 个区块 ", "0"));
        blockChain.get(0).mineBlock(difficulty);
        blockChain.add(new Block(" 我是第 2 个区块 ", blockChain.get(blockChain.size() - 1).hash));
        blockChain.get(1).mineBlock(difficulty);
        blockChain.add(new Block(" 我是第 3 个区块 ", blockChain.get(blockChain.size() - 1).hash));
        blockChain.get(2).mineBlock(difficulty);
        System.out.println(" 区块链是否合法: " + isChainValid());
        System.out.println(JsonUtil.toJson(blockChain));
    }
    
    public static Boolean isChainValid(){
        Block currentBlock;
        Block previousBlock;
        boolean flag = true;
        String hashTarget = new String(new char[difficulty]).replace('\0', '0');
        // 循环遍历列表检验 hash
        for(int i=1;i

感谢关注和喜欢

来源:链接:

 提取码:4am8