Пожалуйста, обратитесь к исходному тексту для окончательного содержания: 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
Суммировать
Мы создали очень простой прототип блокчейна: это просто массив блоков, каждый из которых связан с предыдущим блоком. Фактический блокчейн намного сложнее.
- Отсутствует информация о транзакции: в нашем блокчейне пока нет информации о транзакции.
- Отсутствие рабочей нагрузки доказывает: наш производственный блок очень прост и быстр, в реальной цепочке блоков производство блока требует большого количества вычислений.
- Отсутствие механизма консенсуса: блокчейн представляет собой распределенную базу данных, в которой нет единого лица, принимающего решения. Поэтому грант нового блока должен быть признан и другими участниками сети.
В следующих статьях мы рассмотрим эти функции.
материал
-
Исходный код: https://github.com/wangweiX/blockchain-java/tree/part1-Basic_Prototype
-
https://jeiwan.cc/posts/building-blockchain-in-go-part-1/