Блокчейн (сеть блоков) это даже из названий = сеть блоков, между которыми есть связь.

Блок содержит больше информации:

— сами данные

— ваша собственная подпись

— предыдущая подпись блока

Как видите, каждый блок содержит подпись предыдущего. Причем собственная подпись рассчитывается с учетом предыдущей подписи.

Предположим, у нас есть сеть из 10 блоков, и мы меняем данные в пятом блоке. Изменяя данные, подпись этого блока также изменяется, поэтому шестой блок будет иметь другую предыдущую подпись. Более того, поскольку подпись шестого блока рассчитывается на основе подписи пятого блока, он будет другим. Таким образом, предыдущая подпись блока семь будет отличаться, и поэтому вся сеть от пятого блока до десятого будет иметь измененные подписи.

Это означает, что если мы изменим данные в любом блоке, все блоки после будут иметь другую подпись. Которая может быть легко проверена. И таким образом, изменение обнаружено = сеть разорвана!!!



Важно! Подпись = hash

Далее мы используем Java для создания сеть блоков.

Мы создадим класс = Блок, содержащий всю необходимую информацию в данный момент:

public class Block {

    private String hash; //подпись блока 
    private String previousHash; //предыдущая подпись блока
    private String data; //данные, содержащиеся в блоке (сообщение)
    private long timestamp; //дата и время создания блока
}

Добавьте методы установки и получения:

public class Block {

    private String hash; //подпись блока 
    private String previousHash; //предыдущая подпись блока
    private String data; //данные, содержащиеся в блоке (сообщение) (mesajul)
    private long timestamp; //дата и время создания блока

    public String getHash() {
        return hash;
    }

    public void setHash(String hash) {
        this.hash = hash;
    }

    public String getPreviousHash() {
        return previousHash;
    }

    public void setPreviousHash(String previousHash) {
        this.previousHash = previousHash;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }
}

Мы добавим конструктор — каждый блок будет создан на основе подпись предыдущего блока и данных, которые мы хотим содержать:

    //Constructor
    public Block(String data, String previousHash) {
        this.data = data;
        this.previousHash = previousHash;
        this.timestamp = new Date().getTime();
    }

 

Наш блок должен содержать собственную подпись. Но мы должны рассчитывать ее на основе имеющейся у нас информации. Для этого примера мы будем использовать алгоритм SHA256. Очевидно, можно использовать любой другой.

Ledger Nano S - The secure hardware wallet В новом классе — назовем его Utile, мы добавим все функции, которые нам понадобятся при создании и операций с блоками. Первая необходимая функция заключается в том, что, начиная со строки, генерирует подпись (hash), применяя алгоритм SHA256.

  
import java.security.MessageDigest;

public class Utile {

    //Применяем Sha256 к строке и возвращаем подпись в результате. 
    private static String applySha256(String input) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            //Applies sha256 to our input, 
            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);
        }
    }
}

Теперь мы можем применить эту функцию для расчета подписи нашего блока. Но что мы должны использовать? Обязательна предыдущая подпись (prevoiusHash) и данные, содержащиеся в нашем блоке (data). Мы также добавим метку времени. В том же классе Utile мы также используем функцию:

 
    public static String calculateHash(Block block) {
        String calculatedhash = applySha256(
                block.getPreviousHash()
                + Long.toString(block.getTimestamp())
                + block.getData()
        );
        return calculatedhash;
    }

Мы будем применять этот метод даже в конструкторе классов блоков для вычисления подписи блока. Класс блок теперь будет выглядеть так:

import java.util.Date;

public class Block {

    private String hash; //подпись блока 
    private String previousHash; //предыдущая подпись блока
    private String data; //данные, содержащиеся в блоке (сообщение)
    private long timestamp; //дата и время создания блока

    //Constructor
    public Block(String data, String previousHash) {
        this.data = data;
        this.previousHash = previousHash;
        this.timestamp = new Date().getTime();
        hash = Utile.calculateHash(this);
    }

    public String getHash() {
        return hash;
    }

    public void setHash(String hash) {
        this.hash = hash;
    }

    public String getPreviousHash() {
        return previousHash;
    }

    public void setPreviousHash(String previousHash) {
        this.previousHash = previousHash;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }
}

Пришло время посмотреть, что мы сделали до сих пор. Мы будем использовать функцию печати в Utile:

    public static void printBlock(Block block) {
        System.out.println("**********START BLOCK***********");
        System.out.println("date= " + block.getData());
        System.out.println("дата создания= " + sdf.format(new Date(block.getTimestamp())));
        System.out.println("подпись= " + block.getHash());
        System.out.println("предыдущая подпись= " + block.getPreviousHash());
        System.out.println("**********END BLOCK***********");
    }

где sdf — SimpleDateFormat, например:

   private static final SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss");

Наконец, добавьте 3 основных блока и просмотрите их. У нас возникнет небольшая проблема — у первого блока нет предшественника! — в результате мы выберем предыдущую подпись фиксированной формы — например, «0»:

      public static void main(String[] args) {
        Block block1 = new Block("первое сообщение", "0");
        Utile.printBlock(block1);
        Block block2 = new Block("второе сообщение", block1.getHash());
        Utile.printBlock(block2);
        Block block3 = new Block("третье сообщение", block2.getHash());
        Utile.printBlock(block3);
    }

После запуска вы должны получить что-то вроде:

**********START BLOCK***********

дата = первое сообщение

дата создания= 08.05.2018 10:39:18

подпись= cee7dbfb21a176a70e422c53ce83fd4dfe9b58f64e1b933c8647469a66edcf7c

предыдущая подпись= 0

**********END BLOCK***********

**********START BLOCK***********

дата = второе сообщение

дата создания = 08.05.2018 10:39:18

подпись = 55cee0d1570e1ef032fe4162a4d1d8b5196a143bc691701d6145408e7eb415ed

предыдущая подпись = cee7dbfb21a176a70e422c53ce83fd4dfe9b58f64e1b933c8647469a66edcf7c

**********END BLOCK***********

**********START BLOCK***********

дата = третье сообщение

дата создания = 08.05.2018 10:39:18

подпись = 5a0d2a7b1952a50d89da896021fc65d4d5251d05e3f98bfa228eed1c3ad42c3e

предыдущая подпись = 55cee0d1570e1ef032fe4162a4d1d8b5196a143bc691701d6145408e7eb415ed

**********END BLOCK***********

Кроме того, мы должны быть в состоянии проверить, является ли сеть действительной или нет. Чтоб чтение небыло угнетающим мы распределили всю инструкцию в несколько частей.

Проверка целостности

Майнинг

telegram-bitcoinrush

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here