Предисловие:
На самом деле, я обдумывал, не писать ли эту статью раньше, потому что в Интернете слишком много подобных статей, и пока вы внимательно прочитаете несколько из них, вы обнаружите, что многие статьи удивительно похожи по содержанию, большинство из них это тупой перевод двух туториалов про java блокчейн от зарубежных великих богов, что может легко привести к проблеме, то есть вы явно запускаете его код, но в итоге не знаете что такое блокчейн. Например, как добиться децентрализации? Как сделать невозможным вмешательство и почему биткойны добываются все меньше и меньше, до сих пор толком не объяснено.В этой статье по-прежнему используется исходный код этого руководства.За исключением комментариев на английском языке, я буду Китайцы,другие имена переменных менять не будем.Ведь мысли людей правильные,не надо изобретать велосипед.Если вы меняете переменную и говорите что код написан мной,то я скопирую и перепечатаю его с те, кто в интернете, ничем не отличаются. Эта статья не является механическим переводом оригинальной статьи автора, а просто заимствована соответствующий код.Я надеюсь, что после ее прочтения у вас будет общее представление о том, что же такое технология блокчейн, зачем нам нужен блокчейн и так далее.
Не говори чепухи, сначала собери вещи.
Что такое блокчейн:
Блокчейн — это новый режим применения компьютерных технологий, таких как распределенное хранение данных, двухточечная передача, механизм консенсуса и алгоритм шифрования. "Блокчейн" является важной концепцией Биткойн. По сути, это децентрализованная база данных. В то же время, как базовая технология Биткойн, это серия блоков данных, связанных с криптографическими методами. В каждом блоке данных содержится информация о пакете. транзакций в сети Биткойн, используемых для проверки достоверности информации (защита от подделок) и генерации следующего блока — энциклопедия Baidu.
? ? ? Если вы не понимаете, унесите следующий.
Что такое блокчейн,Блокчейн — это любовь
Я все еще не понимаю, давайте посмотрим на следующий короткий рассказ.Из-за ограниченного места я не буду писать ничего фантастического.
Завтра исполняется 100 лет совместной жизни Сяомин и Сяохун.Сяомин хочет преподнести Сяохун большой сюрприз, то есть подарить ей робота, над созданием которого она так усердно работала последние три месяца.Вспоминая о том, как Сяохун танцует, когда она получает подарок, Сяомин, я просто подумал, что это чертовски романтично.
Когда на следующий день Сяо Мин передал приготовленный подарок Сяохуну, произошел несчастный случай.
小黑
: На самом деле вы не можете быть вместе, Сяохун...
小明
: Блин, Сяохун моя сестра? Что это за дерьмо?
小黑
: Нет, я хочу сказать, что Сяохун на самом деле моя девушка.
小明
: Какого черта? Почему ты говоришь, что Сяохун твоя девушка?
小黑
: Тогда почему ты говоришь, что Сяохун твоя девушка, я говорю, что мое, то мое.
Близится точка, точка знаний, друзья, помните:
小明:
В первый день наших отношений я подарил Сяохун мышку, на второй — клавиатуру, на третий — экран, на четвертый день… 100-й день — подарил ей робот, над созданием которого я так усердно работал, вот доказательства!
小黑:
Ааааа, я проиграл, ну, Сяохун твоя девушка.
Поскольку Сяо Хей намеренно подделал тот факт, что Сяо Хун была девушкой Сяо Мина, он был занесен в черный список и с тех пор так и не нашел себе девушку.
В этом примере小红
,小明
,и小黑
это цепочка в блокчейне, а до小明
и小红
От знакомства к знакомству и к любви каждая история образует блок.И все истории между Сяомином и Сяохуном будут известны всем цепочкам в блокчейне в виде прямой трансляции.(Слишком безжалостно), поэтому для Сяохэя, естественно, невозможно сказать, что Сяохун - его девушка, потому что все цепочки во всей цепочке блоков засвидетельствовали тот факт, что Сяомин и Сяохун - пара, если Сяохэй - пара, чтобы вмешаться в факт что Сяохун — его девушка, то для него почти невозможно изменить воспоминания о Сяомине и Сяохун во всех цепочках во всей цепочке блоков.
Это как будто весь мир знает, что Трамп - действующий президент США. Вы говорите, что Трамп не президент США, а президентом США является Чуань Цзяньго. Когда вы так говорите, посторонние узнают что оно ложно.Если вы хотите превратить его в Реальность, ему просто нужно изменить память всех в мире, кто знает об этом.
это блокчейнНеизменный.
В то же время, если однажды Сяо Мин больше не любит Сяохун, но влюбляется в Сяолу, он удаляет все, что связано с Сяохун на своем мобильном телефоне, и говорит Сяолу, что Сяолу - его первая любовь и что Сяолу любит только Сяолу один. Это работает? Это бесполезно, потому что цепочка во всей цепочке блоков следила за прямой трансляцией Сяомина и Сяохуна, записывая доказательства того, что Сяомин и Сяохун были вместе.
Это то, что есть в блокчейненеизменность.
Подумайте об этом серьезно, а что, если блокчейн применить к финансам?
Раньше наши деньги хранились в системе управления счетами банка, и если кто-то взломал систему управления счетами банка, ему нужно было всего лишь изменить строку чисел, представляющую баланс на его счете, чтобы определить, сколько у него денег.В блокчейне каждый является банком, и каждый является системой управления учетными записями.Если вам нужно изменить баланс своей учетной записи, вам необходимо изменить информацию обо всех узлах во всей сети., чего практически невозможно добиться, поэтому значительно повышает безопасность. Не говоря уже о других областях.
Биткойн — важное применение блокчейна в области резки лука-порея.
Реализуйте простую цепочку блоков в java:
Узнав, что такое блокчейн, давайте вернемся к сердцу разработчика и кратко рассмотрим, как реализован блокчейн с технической точки зрения.
Блокчейн, блокчейн, прежде всего у нас должен быть класс блока, и этот класс должен иметь одну из самых важных характеристик, которая может формировать цепочку. (?? Логика Бога)
Мы создаем новый класс Block со следующим кодом:
public class Block {
/**
* 当前区块的hash
*/
public String hash;
/**
* 前一个区块的hash,本例中,靠这个实现链的
*/
public String previousHash;
/**
* 当前区块的数据,比如交易信息啊等等,在谈恋爱例子中代表小红和小明具体发生的事件
*/
private String data;
/**
* 时间戳
*/
private long timeStamp;
private int nonce;
public Block(String hash, String previousHash, String data) {
this.hash = hash;
this.previousHash = previousHash;
this.data = data;
}
public Block(String data, String previousHash) {
this.previousHash = previousHash;
this.data = data;
this.timeStamp = new Date().getTime();
this.hash = calculateHash();
}
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
Integer.toString(nonce) +
data);
return calculatedhash;
}
public void mineBlock(int difficulty) {
//Create a string with difficulty * "0"
String target = new String(new char[difficulty]).replace('\0', '0');
while(!hash.substring( 0, difficulty).equals(target)) {
nonce ++;
hash = calculateHash();
}
}
}
Объяснение переменной:
- hash : хеш-значение текущего блока
- предыдущийHash: значение хеш-функции предыдущего блока основано на этом, чтобы реализовать цепочку, как это немного похоже на связанный список (shh)
- данные: информация, хранящаяся в текущем блоке, например, Сяомин покупает помаду для Сяохун.
- timeStamp: Отметка времени, например информация о времени, когда Сяомин купил помаду для Сяохун.
- nonce: обычная переменная системы счисления.
То, что нам нужно понять в этом классе, может бытьmineBlock ()
иcalculateHash()
эти два метода иnonce
этоключевая переменная.
существуетmineBlock()
В методе операция хеширования будет выполняться непрерывно, пока не будет рассчитан блок, удовлетворяющий условиям, иnonce
Он заключается в подсчете количества раз, необходимого для смены блока, вcalculateHash()
, мы добавляемnonce
раз, вы можете вычислить это сразуhash
.
И посмотри на этоcalculateHash()
Этот метод, когда мы выполняем вычисление хэша, представляет собой блок вышеhash
для параметров, как только предыдущий блокhash
подделка или подделка, то как ни подсчитывай,calculateHash()
Хэш-значение, возвращаемое методом, практически невозможно совместить с хеш-значением самого блока, и легко обнаружить, что блок был подделан.
Что касается алгоритма шифрования, автор выбрал SHA-256, который также является алгоритмом шифрования, используемым Биткойном, и признан одним из самых безопасных и передовых алгоритмов.
StringUtil
Код класса показан ниже, поскольку он имеет мало общего с темой, о которой мы сегодня поговорим, я не буду подробно останавливаться на нем.
public class StringUtil {
public static String applySha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
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);
}
}
}
JsonUtil
Код класса выглядит следующим образом:
public class JsonUtil {
public static String toJson(Object object){
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setPrettyPrinting();
Gson gson = gsonBuilder.create();
return gson.toJson(object);
}
}
Теперь, когда самые основные блоки написаны, давайте просто проверим, сможем ли мы добывать мины.
Создайте три новых блока, поместитеmineBlock()
Параметр метода установлен на 5.
Код тестового класса выглядит следующим образом:
public class BlockChainTest {
public static void main(String[] args) {
//第1个区块
Block firstBlock = new Block("我是第1个区块", "0");
firstBlock.mineBlock(5);
System.out.println("第1个区块hash: " + firstBlock.hash);
//第2个区块
Block secondBlock = new Block("我是第2个区块", firstBlock.hash);
secondBlock.mineBlock(5);
System.out.println("第2个区块hash: " + secondBlock.hash);
//第3个区块
Block thirdBlock = new Block("我是第3个区块", secondBlock.hash);
thirdBlock.mineBlock(5);
System.out.println("第3个区块hash: " + thirdBlock.hash);
}
}
Результат запуска следующий:
第1个区块hash: 0000052659276be66678fd482825b20bd0819a800246d23d171da6270e92589c
第2个区块hash: 000000d1f338b2dc6b02cca8ec158ca7acafa9cbf699ca97fc1ed7b260a65652
第3个区块hash: 0000072381c11b9a160b1b1d93b75cb477c286db63bb541fcede7ab163ac696c
Вы нашли что-нибудь? То есть для трех выкопанных нами блоков первые пять чисел равны 0. Это потрясающе.
00000
52659276b
Поэтому суть майнинга на самом деле заключается в процессе получения квалифицированных хэшей путем вычисления хешрейта.
Итак, знайте, почему Биткойн добывается все меньше и меньше.
Потому что среди всех результатов расчета квалифицированные хэши ограничены, и чем больше расчет, тем меньше.В начале расчета, из-за слишком большого количества квалифицированных хэшей, требуемая вычислительная мощность относительно невелика, и ее легко Он вычисляется, и чем дальше назад, тем меньше квалифицированных значений хэша, которые не были вычислены, и тем больше вычислительная мощность требуется для расчета, когда в конце остается только один квалифицированный хеш, тогда это действительно похоже на поиск иголка в стоге сена. Это может быть причиной того, что 10 лет назад любой компьютер мог легко добывать биткойны, но теперь для их майнинга требуется майнинг-ферма из тысяч майнинговых машин.
То есть вначале в пустыне было пять миллионов сокровищ, и люди по всему миру искали их, вначале было много сокровищ, и каждый находил сокровище, сделав один шаг. Было найдено несколько сокровищ.Такая большая пустыня, Чтобы выкопать клад, нужно было послать больше людей, чтобы найти его.
В это время некоторые люди могут задавать вопросы.Как я узнаю, является ли ваш блок законным?Выглядит это так.Если он незаконен,я не знаю. Не знаю, меняли ли. Не паникуйте, мы не торопимся.
public class BlockChainListTest {
//这玩意就是我们的区块链,存储我们所有的区块信息。(简陋版)
public static ArrayList<Block> blockChain = new ArrayList();
//挖矿的难度,就是计算出来的hash前几个字符是0才是合法的。
public static int difficulty = 5;
public static void main(String[] args) {
blockChain.add(new Block("我是第1个区块", "0"));
blockChain.get(0).mineBlock(difficulty);
blockChain.add(new Block("我是第2个区块", blockChain.get(blockChain.size() - 1).hash));
blockChain.get(1).mineBlock(difficulty);
blockChain.add(new Block("我是第3个区块", blockChain.get(blockChain.size() - 1).hash));
blockChain.get(2).mineBlock(difficulty);
System.out.println("区块链是否合法: " + isChainValid());
System.out.println(JsonUtil.toJson(blockChain));
}
public static Boolean isChainValid(){
Block currentBlock;
Block previousBlock;
boolean flag = true;
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("当前hash不相等");
flag=false;
}
//比较当前的前一个hash与注册的前一个hash
if(!previousBlock.hash.equals(currentBlock.previousHash)){
System.out.println("前一个hash不相等");
flag=false;
}
//检查该区块是不是已经被算出来过了。
if(!currentBlock.hash.substring( 0, difficulty).equals(hashTarget)) {
System.out.println("这个区块还没有被开采,也就是你这个区块他不是合格的");
flag=false;
}
}
return flag;
}
}
Результат после выполнения следующий:
区块链是否合法: true
[
{
"hash": "00000dd5f9b665c79f454adb1491af1042883f43818938191a8337202929cdeb",
"previousHash": "0",
"data": "我是第1个区块",
"timeStamp": 1574822479084,
"nonce": 614266
},
{
"hash": "0000063312c3a5832a8990ad064e962c98e8ef9ffca969cc0c049cfd84773fdc",
"previousHash": "00000dd5f9b665c79f454adb1491af1042883f43818938191a8337202929cdeb",
"data": "我是第2个区块",
"timeStamp": 1574822480646,
"nonce": 429710
},
{
"hash": "00000304ecc09cca5eac2aed4875c2097a34efcab3518f4f886708a133c513db",
"previousHash": "0000063312c3a5832a8990ad064e962c98e8ef9ffca969cc0c049cfd84773fdc",
"data": "我是第3个区块",
"timeStamp": 1574822481635,
"nonce": 262515
}
]
isChainValid()
Это наш способ проверить, является ли блокчейн законным.
Начнем техническое резюме:
В сегодняшней статье мы потратим много места на то, как понять концепцию блокчейна.Сначала мы должны знать, что это за штука и что она может делать.В процессе обучения идеи будут намного яснее.Что же дальше статьи?, если их больше (может быть, больше классов), все равно следуйте идеям иностранных воротил для реализации блокчейна, которым можно торговать.Конечно, код все еще не в центре внимания следующей статьи, учитывая, что большинство людей Я просто расширяю свои знания, чтобы понять технологию блокчейна, и у меня нет планов менять карьеру и заниматься блокчейном, поэтому следующая статья будет посвященаUTXO (выводы неизрасходованных транзакций)Чтобы понять основную концепцию Биткойна, вывод неизрасходованных транзакций, давайте кратко разберемся, как блокчейн децентрализует транзакции.
Наконец, мы перенесем нашу программу в Интернет, чтобы реализовать блокчейн-продукт с перекрестным поколением.не форсируйте монеты
Соответствующий код был загружен на мой github. должен заказатьstarах ах ах ах ах
Тысячи рек и гор - это всегда любовь, можешь подарить мне звезду?
Добро пожаловать лайк, следуйте за мной,ешь привет фрукты(смешной)