Создание блокчейна на основе языка Java (1) — базовый прототип

Java биткойн блокчейн

Пожалуйста, обратитесь к исходному тексту для окончательного содержания: https://wangwei.one/posts/df195d9.html

введение

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

В этой статье будет создана упрощенная версия блокчейна на основе языка Java для реализации цифровой валюты.

создать блок

Блокчейн — это структура данных, в которой блоки, содержащие информацию о транзакциях, связаны в порядке от конца к началу. Блоки последовательно связаны в этой цепочке сзади к началу, причем каждый блок указывает на предыдущий блок. Взяв в качестве примера биткойн, каждый блок в основном содержит следующие информационные поля:

  • Размер блока: размер данных блока в байтах
  • Заголовок блока: несколько полей, которые составляют заголовок блока
    • хеш-значение заголовка блока
    • Хэш-значение заголовка родительского блока
    • Отметка времени: приблизительное время создания блока.
    • Корень Merkle: Хэш корня Merkle транзакции в этом блоке.
    • Целевая сложность: целевая сложность алгоритма проверки работоспособности для этого блока.
    • Nonce: алгоритмы для рабочей нагрузки доказать счетчик
  • Торговый счетчик: количество транзакций
  • Транзакция: информация о транзакции, записанная в блоке

См.: Освоение биткойнов (второе издание), глава 9 — Блокчейн.

блочная структура данных

Здесь мы в основном стремимся достичь простейшей структуры блокчейна, которая содержит только следующие информационные поля:

/**
 * 区块
 *
 * @author wangwei
 * @date 2018/02/02
 */
@Data
public class Block {

    /**
     * 区块hash值
     */
    private String hash;
    /**
     * 前一个区块的hash值
     */
    private String previousHash;
    /**
     * 区块数据
     */
    private String data;
    /**
     * 区块创建时间(单位:秒)
     */
    private long timeStamp;

    public Block() {
    }

    public Block(String hash, String previousHash, String data, long timeStamp) {
        this();
        this.hash = hash;
        this.previousHash = previousHash;
        this.data = data;
        this.timeStamp = timeStamp;
    }
}
Вычисление хеш-значения блока

Значение хэша зашифровано, расчет хеша и вторичные цифровые отпечатки пальцев, полученные алгоритмом области заголовка SHA256. Значения хеш используются для обеспечения безопасности блокчана. Hash Computing - это чувствительные операции, даже занять некоторое время для завершения расчета (поэтому люди покупают высокопроизводительные графические процессоры по причинам добычи биткойнов) в высокопроизводительном компьютере. Архитектура Hash Blockchain Hash Chashment намеренно трудно сделать это, чтобы увеличить добавленную сложность блока, тем самым предотвращая его свободно изменение блока после увеличения.

/**
 * <p> 创建新区块 </p>
 *
 * @param previousHash
 * @param data
 * @return
 */
public static Block newBlock(String previousHash, String data) {
        Block block = new Block("", previousHash, data.getBytes(),     Instant.now().getEpochSecond());
        block.setHash();
        return block;
}

/**
 * 计算区块Hash
 * <p>
 * 注意:在准备区块数据时,一定要从原始数据类型转化为byte[],不能直接从字符串进行转换
 *
 * @return
 */
private void setHash() {
    byte[] prevBlockHashBytes = {};
    if (StringUtils.isNoneBlank(this.getPrevBlockHash())) {
        prevBlockHashBytes = new BigInteger(this.getPrevBlockHash(), 16).toByteArray();
    }

    byte[] headers = ByteUtils.merge(
           prevBlockHashBytes,
           this.getData().getBytes(),
           ByteUtils.toBytes(this.getTimeStamp()));

    this.setHash(DigestUtils.sha256Hex(headers));
}

Создайте цепочку блоков

Блокчейн по сути являетсяаккуратный,список обратных ссылокструктура данных. Это означает, что блоки хранятся в том порядке, в котором они были вставлены, и каждый блок содержит ссылку на предыдущий блок. Эта структура гарантирует, что вновь вставленный блок может быть быстро извлечен, и его хэш-значение может быть получено одновременно. Эта структура гарантирует, что вновь вставленный блок может быть быстро извлечен, а его хэш-значение может быть извлечено (эффективно).

структура данных блокчейна
/**
 * <p> 区块链 </p>
 *
 * @author wangwei
 * @date 2018/02/02
 */
public class Blockchain {
    
    @Getter
    private List<Block> blockList;

    public Blockchain(List<Block> blockList) {
        this.blockList = blockList;
    }
}    
Добавить блок

Добавлен метод добавления блокчейна

/**
 * <p> 添加区块  </p>
 *
 * @param data 数据
 */
public void addBlock(String data) {
   Block previousBlock = blockList.get(blockList.size() - 1);
   this.addBlock(Block.newBlock(previousBlock.getHash(), data));
}

/**
 * <p> 添加区块  </p>
 *
 * @param block 区块
 */
public void addBlock(Block block) {
   this.blockList.add(block);
}
Генезис Блок

Перед добавлением блоков блокчейн должен иметь创世区块,существуетBlockНовый метод блока генезиса в:

/**
  * <p> 创建创世区块 </p>
  *
  * @return
  */
public static Block newGenesisBlock() {
   return Block.newBlock("", "Genesis Block");
}
Создать блокчейн

сноваBlockchainДобавлены методы для создания блокчейна в:

/**
 * <p> 创建区块链 </p>
 *
 * @return
 */
public static Blockchain newBlockchain() {
    List<Block> blocks = new LinkedList<>();
    blocks.add(Block.newGenesisBlock());
    return new Blockchain(blocks);
}

тестовый забег

/**
 * 测试
 *
 * @author wangwei
 * @date 2018/02/05
 */
public class BlockchainTest {

    public static void main(String[] args) {

        Blockchain blockchain = Blockchain.newBlockchain();
        blockchain.addBlock("Send 1 BTC to Ivan");
        blockchain.addBlock("Send 2 more BTC to Ivan");

        for (Block block : blockchain.getBlockList()) {
            System.out.println("Prev. hash: " + block.getPreviousHash());
            System.out.println("Data: " + block.getData());
            System.out.println("Hash: " + block.getHash());
            System.out.println();
        }
    }
}

/**
 * 输出如下信息:
 */
Prev. hash: 
Data: Genesis Block
Hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4

Prev. hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4
Data: Send 1 BTC to Ivan
Hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04

Prev. hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04
Data: Send 2 more BTC to Ivan
Hash: 42f78d6a86f88aa9b5b10e468494dfd1b3f558a9fb74a01eb348c2cbfc5d000a

Суммировать

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

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

В следующих статьях мы рассмотрим эти функции.

материал