- Оригинальный адрес:Creating Your First Blockchain with Java. Part 1
- Оригинальный автор:Kass
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:NeoyeElf
- Корректор:yankwan
Создайте свой первый блокчейн на Java, часть первая.
Эта серия статей призвана помочь вам понять, как использовать и развивать технологию блокчейн.
В этой статье речь пойдет о:
- Создайте свой первый (десять)Базовый «блокчейн».
- реализовать простойПроверяемость(горная) система.
- Чудеса возможны.
(В этой статье предполагается, что выОбъектно-ориентированное программированиеуже есть базовые знания)
Стоит отметить, что то, что упоминается в этой статье, не является полнофункциональной блокчейн-системой, которую можно запустить онлайн. Скорее, это просто проверка концепции, которая поможет вам понять, что такое блокчейн, для чтения будущих руководств.
Вы можете поддержать эту статью и будущие руководства по :)
btc: 17svYzRv4XJ1Sfi1TSThp3NBFnh7Xsi6fu
Готов к работе.
В этой статье предполагается использовать Java в качестве языка разработки, но вы должны быть в состоянии использовать любойобъектно-ориентированныйязык учить вместе. Я бы использовал Eclipse, но вы можете использовать любой другой редактор, который вам нравится (хотя вы упустите множество полезных функций).
тебе надо:
- Установите Java и JDK.
- Eclipse (или другой IDE/редактор).
Ваш интерфейс eclipse может отличаться от моего, но это нормально, потому что я использую темную тему.
вы можете установитьGSON library by google (Что это ???), конечно, это необязательно. Это позволяет нам конвертировать объект в Json \o/. Это очень полезная библиотека, и позже мы будем использовать ее в peer2peer, но вы всегда можете заменить ее аналогичным методом.
Создайте проект Java в Eclipse (файл > новый >). Я назвал свой проект "noobchain", затем создайте новый с тем же именемClass(NoobChain).
Не пытайтесь сразу скопировать название моего проекта ( ͠° ͟ ͜ʖ ͡°)
Мы хорошо начали и можем двигаться дальше :)
создать блокчейн
Блокчейн — это просто ссылка/список блоков. Каждый блок в цепочке блоков будет иметь свою собственную цифровую подпись, цифровую подпись предыдущего блока и некоторые данные (например, некоторые данные транзакции).
Надеюсь, Сатоши Накамото никогда этого не увидит.
Hash = Digital Signature.
Каждый блок содержит не только хеш-значение предыдущего блока, но и собственное хеш-значение, часть которого вычисляется на основе хеш-значения предыдущего блока.. Если данные предыдущего блока изменятся, хеш-значение предыдущего блока тоже изменится (потому что часть его вычисляется на основе данных блока), и повлияет на хеш-значения всех блоков по очереди.Вычисляя и сравнивая значение хеш-функции, мы можем судить о том, является ли блокчейн законным.
Что это значит? Изменение любых данных в цепочке изменит цифровую подпись, и, таким образом,уничтожить весь блокчейн.
Итак, сначала давайте создадим компоненты, из которых состоит блокчейн.Blockсвоего рода:
import java.util.Date;
public class Block {
public String hash;
public String previousHash;
private String data; //我们的数据是一条简单的消息
private long timeStamp; //从 1/1/1970 起至现在的总毫秒数.
//Block 类的构造方法.
public Block(String data,String previousHash ) {
this.data = data;
this.previousHash = previousHash;
this.timeStamp = new Date().getTime();
}
}
Как видите, наш фондBlockкласс содержитString hash
, что означает цифровую подпись.previousHash
Переменная представляет собой хеш-значение предыдущего блока, которое совпадает сString data
Данные, составляющие этот блок.
Затем нам нужен способ генерации цифровой подписи,
Существует множество алгоритмов шифрования, из которых мы можем выбирать, и, конечно же, алгоритм SHA256 как раз подходит для нашего примера. мы можем пройтиimport java.security.MessageDigest;
использовать алгоритм SHA256.
мы вStringUtil'инструмент'своего родаСоздан удобный метод для использования алгоритма SHA256 следующим образом:
import java.security.MessageDigest;
public class StringUtil {
//使用 Sha256 算法加密一个字符串,返回计算结果
public static String applySha256(String input){
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
//对输入使用 sha256 算法
byte[] hash = digest.digest(input.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer(); // 它会包含16进制的 hash 值
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);
}
}
}
Вышеприведенное в основном является копией метода в этом посте.Эй, поставь Al Lington Inni.com / 啥-256-Harbin City...
Не беспокойтесь, если вы не понимаете содержание этого вспомогательного метода. Вам просто нужно знать, что он принимает строку в качестве входных данных, использует для нее алгоритм SHA256 и, наконец, принимает возвращенную строку в качестве цифровой подписи.
Давайте сейчасBlock classиспользуется в новом методе вapplySha256Вспомогательный метод для вычисления хеш-значения. Мы должны вычислить хеш-значение на основе данных в блоке, которые мы не хотим подделывать. Для блоков в этой статье мы включимpreviousHash
,data
иtimeStamp
.
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
data
);
return calculatedhash;
}
Добавим этот метод вBlock Метод строительстваиди в...
public Block(String data,String previousHash ) {
this.data = data;
this.previousHash = previousHash;
this.timeStamp = new Date().getTime();
this.hash = calculateHash(); //Making sure we do this after we set the other values.
}
Пора провести тест...
Давайте сделаем это в основном классеNoobChainСоздайте несколько блочных объектов и выведите их хэш-значения на экран, чтобы убедиться, что все работает правильно и в порядке.
начать тестирование...
Первый блок называется начальным блоком, и, поскольку перед ним нет блока, мы используем «0» в качестве хеш-значения его предыдущего блока.
public class NoobChain {
public static void main(String[] args) {
Block genesisBlock = new Block("Hi im the first block", "0");
System.out.println("Hash for block 1 : " + genesisBlock.hash);
Block secondBlock = new Block("Yo im the second block",genesisBlock.hash);
System.out.println("Hash for block 2 : " + secondBlock.hash);
Block thirdBlock = new Block("Hey im the third block",secondBlock.hash);
System.out.println("Hash for block 3 : " + thirdBlock.hash);
}
}
Вывод этой программы должен выглядеть так:
Поскольку временная метка не одинакова, мы с вами должны иметь разное значение хеш-функции.
Теперь у каждого блока должна быть своя цифровая подпись, рассчитанная на основе данных блока и подписи предыдущего блока.
В настоящее время это не блокцепь, поэтому давайте сохраним блок вArrayListin и импортируйте библиотеку gson, чтобы вывести ее в виде строки Json.(Нажмите здесь, чтобы узнать, как импортировать библиотеку gson)
import java.util.ArrayList;
import com.google.gson.GsonBuilder;
public class NoobChain {
public static ArrayList<Block> blockchain = new ArrayList<Block>();
public static void main(String[] args) {
//将我们的区块加入到区块链 ArrayList 中:
blockchain.add(new Block("Hi im the first block", "0"));
blockchain.add(new Block("Yo im the second block",blockchain.get(blockchain.size()-1).hash));
blockchain.add(new Block("Hey im the third block",blockchain.get(blockchain.size()-1).hash));
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(blockchainJson);
}
}
Теперь мы ближе к нашему желаемому выводу должны выглядеть как цепь блоков.
Теперь нам нужен способ проверить полную легитимность блокчейна.
впусти насNoobChain своего родаСоздайте новое возвращаемое значение вBooleanизisChainValid()метод, который перебирает все блоки в цепочке и сравнивает их хэши. Этот метод должен иметь возможность проверять, равно ли значение хеш-функции текущего блока рассчитанному значению хеш-функции и равно ли хэш-значение предыдущего блока значению, хранящемуся в текущем блоке.previousHashценность.
public static Boolean isChainValid() {
Block currentBlock;
Block previousBlock;
//循环区块链并检查 hash 值:
for(int i=1; i < blockchain.size(); i++) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
//比较当前区块存储的 hash 值和计算出来的 hash 值:
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println("Current Hashes not equal");
return false;
}
//比较前一个区块存储的 hash 值和当前区块存储的 previousHash 值:
if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
System.out.println("Previous Hashes not equal");
return false;
}
}
return true;
}
Любые изменения блоков в цепочке приведут к тому, что этот метод вернет false.
В сети Биткойн блокчейн используется всеми узлами, и принимается самая длинная действующая цепочка. Так что же может помешать кому-то подделать данные в старом блоке, а затем создать совершенно новый более длинный блокчейн и поделиться им в сети?Ответ — рабочая нагрузка по проверке легальности блокчейна..hashcashРабота по проверке означает, что компьютерам требуется много времени и вычислительной мощности для создания новых блоков. Следовательно, злоумышленнику необходимо иметь большую вычислительную мощность, чем другим пирам.
hashcash, который требует много работы.
Начать добычу! ! !
мы просимminersвыполнить проверочную работу,Пробуя разные значения параметров в блоке до тех пор, пока его хеш-значение не будет начинаться с нескольких нулей.
Давайте добавимintТипnonceпеременную и использовать ее дляcalculateHash()метод и очень важныйmineBlock()В методе:
import java.util.Date;
public class Block {
public String hash;
public String previousHash;
private String data; //我们的数据是一条简单的消息
private long timeStamp; //从 1/1/1970 起至现在的总毫秒数.
private int nonce;
//Block 类构造方法.
public Block(String data,String previousHash ) {
this.data = data;
this.previousHash = previousHash;
this.timeStamp = new Date().getTime();
this.hash = calculateHash(); //Making sure we do this after we set the other values.
}
//根据区块内容计算其新 hash 值
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
Integer.toString(nonce) +
data
);
return calculatedhash;
}
public void mineBlock(int difficulty) {
String target = new String(new char[difficulty]).replace('\0', '0'); //创建一个用 difficulty * "0" 组成的字符串
while(!hash.substring( 0, difficulty).equals(target)) {
nonce ++;
hash = calculateHash();
}
System.out.println("Block Mined!!! : " + hash);
}
}
По сути, каждый майнер выполняет итерацию со случайной точки. Некоторые майнеры даже пытаются использовать nonce как nonce. Стоит отметить, что более сложные решения могут вычислять значения, превышающие целочисленное максимальное значение, и в этот момент майнеры могут попытаться изменить метку времени.
mineBlock()Метод принимает параметр сложности типа int, который представляет собой количество нулей, которое программа должна вычислить. С низким значением сложности, например, 1 или 2, возможно, компьютер сможет решить это. Поэтому я рекомендую установить значение сложности 4-6 для тестирования. Сейчас значение сложности майнинга Litecoin составляет около 442 592.
Давайте добавим статическую переменную в класс NoobChain:
public static int difficulty = 5;
мы должны обновитьNoobChain своего родазапускать каждый новый блокmineBlock() метод. возвращениеЛогическое значениеизisChainValid()Также следует проверить, что хэш, рассчитанный для каждого блока (путем майнинга), является законным.
import java.util.ArrayList;
import com.google.gson.GsonBuilder;
public class NoobChain {
public static ArrayList<Block> blockchain = new ArrayList<Block>();
public static int difficulty = 5;
public static void main(String[] args) {
//将我们的区块添加至区块链 ArrayList 中:
blockchain.add(new Block("Hi im the first block", "0"));
System.out.println("Trying to Mine block 1... ");
blockchain.get(0).mineBlock(difficulty);
blockchain.add(new Block("Yo im the second block",blockchain.get(blockchain.size()-1).hash));
System.out.println("Trying to Mine block 2... ");
blockchain.get(1).mineBlock(difficulty);
blockchain.add(new Block("Hey im the third block",blockchain.get(blockchain.size()-1).hash));
System.out.println("Trying to Mine block 3... ");
blockchain.get(2).mineBlock(difficulty);
System.out.println("\nBlockchain is Valid: " + isChainValid());
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println("\nThe block chain: ");
System.out.println(blockchainJson);
}
public static Boolean isChainValid() {
Block currentBlock;
Block previousBlock;
String hashTarget = new String(new char[difficulty]).replace('\0', '0');
//循环区块链来检查 hash 值的合法性:
for(int i=1; i < blockchain.size(); i++) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i-1);
//比较当前区块存储的 hash 值和计算出来的 hash 值:
if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){
System.out.println("Current Hashes not equal");
return false;
}
//比较前一个区块存储的 hash 值和当前区块存储的 previousHash 值:
if(!previousBlock.hash.equals(currentBlock.previousHash) ) {
System.out.println("Previous Hashes not equal");
return false;
}
//检查 hash 值是否已经存在
if(!currentBlock.hash.substring( 0, difficulty).equals(hashTarget)) {
System.out.println("This block hasn't been mined");
return false;
}
}
return true;
}
}
Мы также проверилиisChainValidзначение и распечатать его.
Результат работы этой программы должен выглядеть следующим образом:
Вычисление каждого блока занимает некоторое время! (около 3 секунд) Вы должны внимательно изучить значение сложности, чтобы увидеть, как оно влияет на время вычисления каждого блока :)
если кто-то попытается пойтивмешиваться😒 Данные блокчейна в вашей системе:
- Их блокчейн станет нелегитимным.
- Они не смогут создать более длинный блокчейн.
- Законный блокчейн в сети будет иметь временное преимущество в длине цепи.
Подделанная блокчан не может быть как законным, так и длинным одновременно.*
* Разве что их вычисления намного быстрее, чем все остальные узлы в сети вместе взятые. Например, есть будущий квантовый компьютер или тому подобное.
Поздравляем, вы внедрили собственный базовый блокчейн!
Похлопайте себя по плечу.
ваш блокчейн:
> состоит из блоков, в которых хранятся данные.
> Иметь цифровую подпись, которая объединяет все ваши блоки.
> Для вновь добавленных блоков требуется серия работ по разработке добычи добычи для проверки их легитимности.
> Можно проверить, являются ли данные законными и не были ли они подделаны.
ты сможешьGithubСкачать проект по этой статье.
Ты сможешьПодписывайтесь на меня, чтобы вы могли получать уведомления, когда будет опубликовано следующее руководство и другие статьи по разработке блокчейна. Любая обратная связь очень приветствуется. благодаря.
Creating Your First Blockchain with Java. Part 2:
Содержание следующего руководства будет покрывать блокчанторговля,подписатьикошелек.
Контакт: kasscrypto@gmail.com
задавать вопросы:discord.gg/ZsyQqyk(Мой клуб разработчиков блокчейнов в разногласиях).
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.