Страницы

Поиск по вопросам

Показаны сообщения с ярлыком blockchain. Показать все сообщения
Показаны сообщения с ярлыком blockchain. Показать все сообщения

воскресенье, 1 марта 2020 г.

Easy Blockchain

#java #blockchain


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

    int numberOfBlocks = 5;

    for(int i = 1; i <= numberOfBlocks; i++) {

        String endOfNumber = "";

        if (i == 1)
            blockchain.add(new Block(i + "st block", "0"));
        else {
            switch(i) {
                case 2:
                    endOfNumber = "nd";
                    break;
                case 3:
                    endOfNumber = "rd";
                    break;
                default:
                    endOfNumber = "th";
                    break;
            }
        }

        blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash));
        System.out.println("Try to mine block " + i);   
        blockchain.get(i-1).mineBlock(difficulty);
        System.out.println("Blockchain is Valid: " + isChainValid());
    }

    String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
    System.out.println("The blockchain:\n" + blockchainJson);

    


Ответы

Ответ 1



Тебе нужно занести сохранение блока в ветку else после операции switch, вот код: int numberOfBlocks = 5; for(int i = 1; i <= numberOfBlocks; i++) { String endOfNumber = ""; if (i == 1) blockchain.add(new Block(i + "st block", "0")); else { switch(i) { case 2: endOfNumber = "nd"; break; case 3: endOfNumber = "rd"; break; default: endOfNumber = "th"; break; } blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash)); } System.out.println("Try to mine block " + i); blockchain.get(i-1).mineBlock(difficulty); System.out.println("Blockchain is Valid: " + isChainValid()); } String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("The blockchain:\n" + blockchainJson); В твоем примере, происходит следующее : ты создаешь 1 блок, потом завершается оператор if и ты исполняешь новое сохранение блока, из-за чего вся цепочка перестает быть валидной.

понедельник, 23 декабря 2019 г.

Деревья Меркле. Проверка “листьев” в ее составе

#алгоритм #хеширование #дерево #blockchain


Читаю интернет и не до конца понимаю одну вещь. Есть Дерево Меркля (или Меркле).
Допустим оно имеет N-количество отсортированных "листьев", представляющими блоки данных.
Как проверяется, что конкретный "блок" не находится в дереве?


    


Ответы

Ответ 1



Проверка принадлежности происходит очень просто - считается хеш блока, а потом просто проверка с хешом во всех листьях. Если есть совпадение, дальше проверяется валидность самого дерева, проходом от этого листа до корня дерева. Например, если это L2 на вашем рисунке, тогда проверяется Hash(Hash(0-0), Hash(0-1)), и дальше корневой хеш: Hash(Hash(0), Hash(1)) Свойства криптографических хеш-функций гарантируют, что произведя всего несколько простых вычислений хеша над небольшими объемами данных, мы гарантируем, что этот блок данных действительно входит в хеш в корне дерева. Можете представить себе, если бы весь блок данных занимал несколько гигабайт, а вам нужно проверить принадлежность небольшой части, допустим 1 мб. Еще хочу добавить, что операция проверки блока в дереве, это не то, ради чего используют дерево Меркля в blockchain-технологиях. Основное преимущество, это очень быстрый пересчет хеша при поступлении новых данных. А так же быстрый пересчет хеша, при удалении блока данных. Пример с биткоин. Майнер непрерывно изменяет несколько байт в блоке, и считает хеш, что бы получить хеш начинающийся с множества нулей. В это время приходят новые транзакции, и нужно быстро пересчитать хеш в корне дерева (который является частью блока). Для этого понадобится всего O(log n) операций пересчета хеша. Если майнер решил выкинуть транзакцию с блока, и включить другую (с большей комиссией), все так же нужно O(log n) пересчетов.

пятница, 17 мая 2019 г.

Easy Blockchain

Всем привет. Помогите найти ошибку. Создаю элементарную блокчейн из 5 элементов. Остальной код работает, проверяла без цикла. Я новичек в джаве. Получается, что сохраняется только два хеша первых элементов.
int numberOfBlocks = 5;
for(int i = 1; i <= numberOfBlocks; i++) {
String endOfNumber = "";
if (i == 1) blockchain.add(new Block(i + "st block", "0")); else { switch(i) { case 2: endOfNumber = "nd"; break; case 3: endOfNumber = "rd"; break; default: endOfNumber = "th"; break; } }
blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash)); System.out.println("Try to mine block " + i); blockchain.get(i-1).mineBlock(difficulty); System.out.println("Blockchain is Valid: " + isChainValid()); }
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("The blockchain:
" + blockchainJson);


Ответ

Тебе нужно занести сохранение блока в ветку else после операции switch, вот код:
int numberOfBlocks = 5;
for(int i = 1; i <= numberOfBlocks; i++) {
String endOfNumber = "";
if (i == 1) blockchain.add(new Block(i + "st block", "0")); else { switch(i) { case 2: endOfNumber = "nd"; break; case 3: endOfNumber = "rd"; break; default: endOfNumber = "th"; break; }
blockchain.add(new Block(i + endOfNumber + " block", blockchain.get(blockchain.size()-1).hash)); }
System.out.println("Try to mine block " + i); blockchain.get(i-1).mineBlock(difficulty); System.out.println("Blockchain is Valid: " + isChainValid()); } String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("The blockchain:
" + blockchainJson);
В твоем примере, происходит следующее : ты создаешь 1 блок, потом завершается оператор if и ты исполняешь новое сохранение блока, из-за чего вся цепочка перестает быть валидной.

понедельник, 18 февраля 2019 г.

Деревья Меркле. Проверка “листьев” в ее составе

Читаю интернет и не до конца понимаю одну вещь. Есть Дерево Меркля (или Меркле). Допустим оно имеет N-количество отсортированных "листьев", представляющими блоки данных. Как проверяется, что конкретный "блок" не находится в дереве?


Ответ

Проверка принадлежности происходит очень просто - считается хеш блока, а потом просто проверка с хешом во всех листьях. Если есть совпадение, дальше проверяется валидность самого дерева, проходом от этого листа до корня дерева. Например, если это L2 на вашем рисунке, тогда проверяется Hash(Hash(0-0), Hash(0-1)), и дальше корневой хеш: Hash(Hash(0), Hash(1))
Свойства криптографических хеш-функций гарантируют, что произведя всего несколько простых вычислений хеша над небольшими объемами данных, мы гарантируем, что этот блок данных действительно входит в хеш в корне дерева.
Можете представить себе, если бы весь блок данных занимал несколько гигабайт, а вам нужно проверить принадлежность небольшой части, допустим 1 мб.
Еще хочу добавить, что операция проверки блока в дереве, это не то, ради чего используют дерево Меркля в blockchain-технологиях. Основное преимущество, это очень быстрый пересчет хеша при поступлении новых данных. А так же быстрый пересчет хеша, при удалении блока данных.
Пример с биткоин. Майнер непрерывно изменяет несколько байт в блоке, и считает хеш, что бы получить хеш начинающийся с множества нулей. В это время приходят новые транзакции, и нужно быстро пересчитать хеш в корне дерева (который является частью блока). Для этого понадобится всего O(log n) операций пересчета хеша. Если майнер решил выкинуть транзакцию с блока, и включить другую (с большей комиссией), все так же нужно O(log n) пересчетов.