Рубрики
Без рубрики

Мое путешествие через Tech: FullStack Blockchain Курс Раздел 2

В последнем посте здесь нам удалось создать объект блока с функциональностью хеширования. Мы также идентифицированы … Теги с узлом, JavaScript, Blockchain.

В последнем посте здесь нам удалось создать объект блока с функциональностью хеширования. Мы также определили тесты, которые должны быть переданы для действительных блоков. Сегодня мы добавляем blockchain.test.js и blockchain.js как таковые:

Добавление блокчан .test.js:

const (‘./blockchain’); const (‘./блок’);

Опишите («блокчан», () => {const blockchain ();

ii('contains a `chain` Array instance', () => {
    expect(blockchain.chain instanceof Array).toBe(true);

});
it('starts with the genesis block', () =>{
    expect(blockchain.chain[0]).toEqual(Block.genesis());
});
it('adds a new block to the chain', () =>{
    const newData = 'foo-bar';
    blockchain.addBlock({data : newData });

    expect(blockchain.chain[blockchain.chain.length-1].data).toEqual(newData);

});

})

В этом тесте мы импортируем файлы boybachain.js и book.js для программы. Далее в нашем описании для теста мы ожидаем начать значения объектов с блоком Genesis в качестве первого элемента в массиве. Тогда ищет поиск метода AddBlock в файле BlockChain в качестве экземпляра самого блока, и вызывает объект «{data: newdata}», использует это как аргументы для функции AddBlock. Затем, наконец, мы ожидаем, что последнее значение является последним элементом в цепочке.

Добавить BlockChain.js:

const (‘./блок’); класс Blockchain {Constructor () {this.chein = [Block.genesis ()]; }

addBlock({ data }){
    const newBlock = Block.mineBlock({
        lastBlock: this.chain[this.chain.length-1],
        data
    });

    this.chain.push(newBlock);
}

}

module.exports;

Здесь мы создали класс BlockChain, импортируя файл BOCK.JS. В конструкторе мы объявили блок Genesis – первый элемент в массиве. Затем мы создали метод AddBlock, который принимает объект данных в качестве аргумента. Вы вспоминаете, что метод MineBlock имеет данные, поскольку он является собственным аргументом из файла BOCK.JS при создании экземпляра. Затем он ищет последний элемент в массиве и толкает его в массив блокчан в качестве значения данных. Наконец, чтобы увидеть тесты, мы экспортируем это на локальном уровне.

Заполнение тестов валидации цепи

Чтобы завершить наш файл BlockChain. Тестес, мы сейчас ревертируем его как шоу:

const (‘./blockchain’); const (‘./блок’);

Опишите («блокчан», () => {пусть блокчан;

beforeEach( () => {
    blockchain = new Blockchain();
});

it('contains a `chain` Array instance', () => {
    expect(blockchain.chain instanceof Array).toBe(true);

});
it('starts with the genesis block', () =>{
    expect(blockchain.chain[0]).toEqual(Block.genesis());
});
it('adds a new block to the chain', () =>{
    const newData = 'foo-bar';
    blockchain.addBlock({data : newData });

    expect(blockchain.chain[blockchain.chain.length-1].data).toEqual(newData);

});

describe('isValidChain()', () => {
    describe('when the chain does not start with a genesis block', () =>{
        it('returns false', () => {
            blockchain.chain[0] = { data: 'fake-genesis'};

            expect(Blockchain.isValidChain(blockchain.chain)).toBe(false);
        });

    });

        describe('when the chain starts with the genesis block and has multiple blocks', () => {
            beforeEach( () => {
                blockchain.addBlock({ data: 'Bears'});
                blockchain.addBlock({data: 'Beets'});
                blockchain.addBlock({data: 'Battlestar Galactica' });

            });
            describe('and lastHash reference has changed', () =>{
                it('returns false', () => {


                    blockchain.chain[2].lastHash = 'broken-lastHash';

                    expect(blockchain.isValidChain(blockchain.chain)).toBe(false);
                });
            });

            describe('when the chain starts with the genesis block and has multiple blocks', () => {
                describe('and a lastHash reference has changed', () => {
                    it('returns false', () => {});
                });

                describe('and the chain contains a block with an invalid field', () => {
                    it('returns false', () => {

                        blockchain.chain[2].data = 'some-bad-and-evil-data';

                        expect(blockchain.isValidChain(blockchain.chain)).toBe(false);
                    });
                });

                describe('and the chain does not contain any invalid blocks', () => {
                    it('returns true', () => {

                        expect(blockchain.isValidChain(blockchain.chain)).toBe(true);

                    });
                });
            });

        });
    });
}); 

});

Сразу в первом описании блок, мы изменяем его так, чтобы каждый раз сформирован новый блок, используя функцию Rebedeafee. Затем мы добавили тест проверки, чтобы увидеть, соответствует ли данным, которые будут соответствовать аргументам, прежде чем добавить новый блок в цепочку. Опять же, мы также использовали Debresseach в рамках нескольких блок-тестов с фиктивными данными.

Код валидации цепи//BlockChain.js

Статический ISVALDCHAIN (цепь) {if (json.stringify (цепь [0]). Stringify (Block.genesis ())) {

    return false;
    };

    for (let i=1; i

Здесь мы завершили допустимую цепную функцию. Поскольку экземпляр блочного объекта можно вызвать в тесте BlockChain, мы используем метод JSON.Strifify, чтобы данные внутри блока можно прочитать для тестирования. Мы повторяем данные экземпляра блока, который подталкивается в массив. Он проверяет хеш последнего блока действителен до продолжения замены цепи.

Тесты на замену цепи:

describe('replaceChain()', () => {
    describe('when the new chain is not longer', () => {
        it('does not replace the chain', () => {
            newChain.chain[0] = { new : 'chain' };

            blockchain.replaceChain(newChain.chain);

            expect(blockchain.chain).toEqual(originalChain);
        });

        describe('when the chain is longer', () => {
            beforeEach(() => {
                newChain.addBlock({ data: 'Bears'});
                newChain.addBlock({data: 'Beets'});
                newChain.addBlock({data: 'Battlestar Galactica' });
            });

            describe('and the chain is invalid', () => {});
                it('does not replace the chain', () => {
                    newChain.chain[2].hash = 'some-fake-hash';

                    blockchain.replaceChain(newChain.chain);

                    expect(blockchain.chain).toEqual(originalChain);

                });
            describe('and the chain is valid', () => {
                it('replaces the chain', () => {
                    blockchain.replaceChain(newChain.chain);

                    expect(blockchain.chain).toEqual(newChain.chain);
                });
            });
        });
    });
})

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

Функция замены цепи

Заменить цепь (цепь) {из (цепочка. Длина .Chain.length) {return; } Если (! boedchain.isvalid цепь (цепь)) {return; } ; } Наконец-то мы добавляем функциональность заменить цепочку и пройденные наши тесты.

Личные размышления: это потребовалось немного дольше, чтобы завершить этот раздел. Пока я вружею раздел в неделю, и я, вероятно, собираюсь придерживаться этого графика. Я также на третьей неделе программы IT-аналитики, и я намного хорошо, на пути к прочитанию для экзамена Comptia Core 1 через 3 недели. Написание тестового описания было немного запутанным, но в конечном итоге имел смысл с практикой. Все, что сейчас осталось, это добавить заглушки для проверки ошибок, и я могу перейти к следующему разделу.

Спасибо за чтение и калаку, конструктивную критику всегда пожалуйста

Оригинал: “https://dev.to/jonathanmkpt/my-journey-through-tech-fullstack-blockchain-course-section-2-202l”