블록체인(BlockChain)은 java만으로 쉽게 구현할 수 있습니다.

블록체인 논리: 필요한 정보에 따라 블록을 생성한 다음 정의된 해시 값 계산 방법을 사용하여 원하는 결과가 달성될 때까지 계속 계산한 다음 계층별 검증을 통과하고 블록체인에 추가합니다.

1. 구성원 속성 설정

​
    //区块链
    List<Block> blockchain = new ArrayList<>();
    //哈希值,判断挖矿成功与否
    private String hash;
    //前块哈希值,便于之后验证成功与否
    private String previousHash;
    //所需存储数据
    private String data;
    //时间戳
    private long timeStamp;
    //用于判断”挖矿“成功的密码学数字
    private int nonce;
    //构析方法,得到所需信息
    public Block(String data,String previousHash,long timeStamp){
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = timeStamp;
        this.hash = calculateBlockHash();
    }

2. 해시 값 계산 방법("마이닝" 방법)

소위 마이닝은 "마이닝"까지 연속 계산을 수행하는 것이며 해시 알고리즘을 사용하여 이 알고리즘을 완성합니다.

    //得到对应hash字符串
    //hash算法优势:输出格式一致,而且对数的变化十分敏感,对于之后验证挖矿成功与否作用巨大!
    public String calculateBlockHash(){
        //生成独属的字符串,方便之后转换
        String dataToHash = previousHash + Long.toString(timeStamp)
        + Integer.toString(nonce) + data;
        MessageDigest digest = null;
        byte[] bytes = null;
        try {
            //创建一个提供信息摘要算法的对象,初始化为SHA-256算法对象
            digest = MessageDigest.getInstance("SHA-256");
            //用对象调用,信息摘要计算方法,计算后获得字节数组
            //dataToHash.getBytes(UTF_8),将字符串转换为字节数组
            bytes = digest.digest(dataToHash.getBytes(UTF_8));
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        //用缓存字符串
        StringBuffer buffer = new StringBuffer();
        for (byte b : bytes) {
            //延伸字符串
            //String.format("%02x", b),以十六进制输出,2为指定的输出字段的宽度.如果位数小于2,则左端补0
            buffer.append(String.format("%02x", b));
        }
        //返回字符串
        return buffer.toString();
    }

3. 성공적인 마이닝을 위한 조건 설정

솔직히 말해서 "채굴" 자체의 문제는 이미 매우 추상적이지만 "채굴"의 상황을 고려하려면 여전히 이 경로를 따라야 합니다. 우리의 "채굴"이 실제로 블록의 해시 값을 계산하는 경우, 우리의 아이디어는 4개의 0으로 시작하는 해시 값을 찾는 것입니다.

    //定义了一个前缀4,这实际上意味着我们希望哈希以4个零开始。
   
    int prefix = 4;
    String prefixString = new String(new char[prefix]).replace('\0', '0');

4. "파기" 방법

이는 해시 알고리즘의 값을 반영한 것으로, nonce++를 주는 것만으로도 해시 값이 크게 변경되어 접두사가 "0000"에 도달할 수 있습니다.

그리고 nonce 값만이 아무런 정보를 제공하지 않기 때문에 할당하는 데 문제가 없습니다.

    //开挖
    public String mineBlock(int prefix){
        //创建一个有perfix个的“0”的字符串
        String prefixString = new String(new char[prefix]).replace('\0','0');
        //找到开头有perfix多个0的字符串
        //substring方法是,从字符串几位读到几位
        while(!hash.substring(0,prefix).equals(prefixString)){
            //决定那个块
            nonce++;
            //通过nonce变化,更新hash值
            hash = calculateBlockHash();
        }
        //找到了
        return hash;
    }

5. 블록 추가

    //在区块链里添加一个块
    public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
        //建立一个区块
        Block newBlock = new Block(
                "The is a New Block.",
                blockchain.get(blockchain.size() - 1).getHash(),
                new Date().getTime());
        //找到四个0的区块
        newBlock.mineBlock(prefix);
        //再次检验是否正确
        assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));
        //添加一个区块
        blockchain.add(newBlock);
    }

6. 블록체인 검증

블록의 신뢰성을 보장하기 위해 우리는 블록이 절대적으로 올바른지 확인하기 위해 여러 검증을 수행했습니다.

검증: 추가된 블록의 해시값이 해시 알고리즘 결과와 동일한지 여부 -->

추가된 블록의 이전 블록의 해시값이 이전 블록의 값과 동일한지 여부 -->

추가된 블록의 해시 값이 "0000"으로 시작하는지 여부

    //区块链验证
    public void givenBlockchain_whenValidated_thenSuccess() {
        boolean flag = true;
        for (int i = 0; i < blockchain.size(); i++) {
            //得到前区块的hash值
            String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash();
            //进行真伪判断
            //原理:判断hash是否等于计算的hash//判断储存的前区块hash是否等于真正的hash//判断是否满足“挖矿”成功的条件
            flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())
                    && previousHash.equals(blockchain.get(i).getPreviousHash())
                    && blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);
            //一次不行就直接跳出
            if (!flag) break;
        }
        //进行正确性检验
        assertTrue(flag);
    }

이제 완료되었으므로 우리만의 블록체인을 만들고 다른 사람이 알 수 없도록 개인 정보를 추가해 봅시다!

추천

출처blog.csdn.net/AkinanCZ/article/details/126491849