区块链需要学javascript吗(javascript编写区块链)

技术如何用JS构建你自己的区块链如何用JS构建你自己的区块链,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言区块链太复杂,那我们就讲点简单的。用JS来

如何用JS打造自己的区块链?针对这个问题,本文详细介绍了相应的分析和解答,希望能帮助更多想要解决这个问题的小伙伴找到更简单易行的方法。

00-1010区块链太复杂了,我们简单说一下。用JS搭建自己的区块链系统,几行代码就可以说明区块链的底层数据结构、POW挖掘思想和交易流程等。当然,真实的场景远比这复杂。边肖的目的只是让你对区块链有一个初步的了解。

前言

Blockchain,顾名思义就是由块组成的链,所以最基本的数据结构就是块。每个块包含时间戳、数据、哈希、先前哈希和其他信息。数据用于存储数据,previousHash是前一个块的哈希值。示意图如下:

如何用JS构建你自己的区块链

哈希是块信息的汇总存储。hash的优点是任何长度的信息都可以通过hash映射成固定长度的字符串。例如,sha256:

calculateshash(){ 0

returns sha 256(this . previoushash this . timestamp JSON . stringify(this . data))。toString();

}

认识区块链

区块的基本数据结构如下:

classBlock{

构造函数(时间戳,数据,previousHash=' '){ 0

this.timestamp=时间戳;

this.data=数据;

this . previousHash=previousHash;

//哈希的计算必须放在最后,确保所有数据在计算前都被正确赋值。

this . hash=this . calculateshash();

}

calculateshash(){ 0

returns sha 256(this . previoushash this . timestamp JSON . stringify(this . data))。toString();

}

}

Block的数据结构

区块链由多个块链接,这些块显然可以用数组或链表来表示,例如:

classBlockChain{

构造函数(){ 0

this . chain=[];

}

}

BlockChain的数据结构

俗话说,万事开头难。区块链的第一个块总是需要手动创建,并且这个块的前一个哈希是空的,例如:

creategenesissblock(){ 0

return new block(' 2018-11-1100:00:00 ',' Genesisblockofsimplechain ',');

}区块链的施工方法也应改为:

classBlockChain{

构造函数(){ 0

这个.链=[这个. cre

ateGenesisBlock()];
    }
}

添加区块

每新加一个区块,必须保证与原有区块链连接起来,即:

class BlockChain {
    getLatestBlock() {
        return this.chain[this.chain.length - 1];
    }
    
    addBlock(newBlock) {
        //新区块的前一个hash值是现有区块链的最后一个区块的hash值;
        newBlock.previousHash = this.getLatestBlock().hash;
        //重新计算新区块的hash值(因为指定了previousHash);
        newBlock.hash = newBlock.calculateHash(); 
        //把新区块加入到链中;
        this.chain.push(newBlock); 
    }
    ...
}

校验区块链

区块链数据结构的核心是保证前后链接、无法篡改,但是如果有人真的篡改了某个区块,我们该如何校验发现呢?最笨也是最自然是想法就是遍历所有情况,逐一校验,如:

isChainValid() {
    //遍历所有区块
    for (let i = 1; i < this.chain.length; i++) {
        const currentBlock = this.chain[i];
        const previousBlock = this.chain[i - 1];
        //重新计算当前区块的hash值,若发现hash值对不上,说明该区块有数据被篡改,hash值未重新计算
        if (currentBlock.hash !== currentBlock.calculateHash()) {
            console.error("hash not equal: " + JSON.stringify(currentBlock));
            return false;
        }
        //判断当前区块的previousHash是否真的等于前一个区块的hash,若不等,说明前一个区块被篡改,虽然hash值被重新计算正确,但是后续区块的hash值并未重新计算,导致整个链断裂
        if (currentBlock.previousHash !== previousBlock.calculateHash) {
            console.error("previous hash not right: " + JSON.stringify(currentBlock));
            return false;
        }
    }
    return true;
}

Just run it

跑起来看看,即:

let simpleChain = new BlockChain();
simpleChain.addBlock(new Block("2018-11-11 00:00:01", {amount: 10}));
simpleChain.addBlock(new Block("2018-11-11 00:00:02", {amount: 20}));


console.log(JSON.stringify(simpleChain, null, 4));

console.log("is the chain valid? " + simpleChain.isChainValid());

结果如下:

ali-186590cc4a7f:simple-chain shanyao$ node main_1.js 
{
    "chain": [
        {
            "timestamp": "2018-11-11 00:00:00",
            "data": "Genesis block of simple chain",
            "previousHash": "",
            "hash": "fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89"
        },
        {
            "timestamp": "2018-11-11 00:00:01",
            "data": {
                "amount": 10
            },
            "previousHash": "fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89",
            "hash": "150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529"
        },
        {
            "timestamp": "2018-11-11 00:00:02",
            "data": {
                "amount": 20
            },
            "previousHash": "150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529",
            "hash": "274a7a13ed20118e8cb745654934a7e24a4d59333ba17dfbf5d4cfe0fa8a6e34"
        }
    ]
}
is the chain valid? true

注意看其中的previousHash与hash,确实是当前区块的previousHash指向前一个区块的hash。

篡改下试试

都说区块链不可篡改,是真的吗?让我们篡改第2个区块试试,如:

let simpleChain = new BlockChain();
simpleChain.addBlock(new Block("2018-11-11 00:00:01", {amount: 10}));
simpleChain.addBlock(new Block("2018-11-11 00:00:02", {amount: 20}));

console.log("is the chain valid? " + simpleChain.isChainValid());

//将第2个区块的数据,由10改为15
simpleChain.chain[1].data = {amount: 15};

console.log("is the chain still valid? " + simpleChain.isChainValid());
console.log(JSON.stringify(simpleChain, null, 4));

结果如下:

ali-186590cc4a7f:simple-chain shanyao$ node main_1.js 
is the chain valid? true
hash not equal: {"timestamp":"2018-11-11 00:00:01","data":{"amount":15},"previousHash":"fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89","hash":"150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529"}
is the chain still valid? false
{
    "chain": [
        {
            "timestamp": "2018-11-11 00:00:00",
            "data": "Genesis block of simple chain",
            "previousHash": "",
            "hash": "fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89"
        },
        {
            "timestamp": "2018-11-11 00:00:01",
            "data": {
                "amount": 15
            },
            "previousHash": "fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89",
            "hash": "150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529"
        },
        {
            "timestamp": "2018-11-11 00:00:02",
            "data": {
                "amount": 20
            },
            "previousHash": "150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529",
            "hash": "274a7a13ed20118e8cb745654934a7e24a4d59333ba17dfbf5d4cfe0fa8a6e34"
        }
    ]
}

显然,篡改了数据之后,hash值并未重新计算,导致该区块的hash值对不上。

再篡改下试试

那么,如果我们聪明点,篡改后把hash值也重新计算会如何?

let simpleChain = new BlockChain();
simpleChain.addBlock(new Block("2018-11-11 00:00:01", {amount: 10}));
simpleChain.addBlock(new Block("2018-11-11 00:00:02", {amount: 20}));

console.log("is the chain valid? " + simpleChain.isChainValid());
//篡改后重新计算hash值
simpleChain.chain[1].data = {amount: 15};
simpleChain.chain[1].hash = simpleChain.chain[1].calculateHash();
console.log("is the chain still valid? " + simpleChain.isChainValid());
console.log(JSON.stringify(simpleChain, null, 4));

结果如下:

ali-186590cc4a7f:simple-chain shanyao$ node main_1.js 
is the chain valid? true
previous hash not right: {"timestamp":"2018-11-11 00:00:02","data":{"amount":20},"previousHash":"150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529","hash":"274a7a13ed20118e8cb745654934a7e24a4d59333ba17dfbf5d4cfe0fa8a6e34"}
is the chain still valid? false
{
    "chain": [
        {
            "timestamp": "2018-11-11 00:00:00",
            "data": "Genesis block of simple chain",
            "previousHash": "",
            "hash": "fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89"
        },
        {
            "timestamp": "2018-11-11 00:00:01",
            "data": {
                "amount": 15
            },
            "previousHash": "fd56967ff621a4090ff71ce88fdd456547d1c92d2e93766b7e8791f7a5f91f89",
            "hash": "74d139274fb692495b7c805dd5822faa0c5b5e6058b6beef96e87e18ab83a6b1"
        },
        {
            "timestamp": "2018-11-11 00:00:02",
            "data": {
                "amount": 20
            },
            "previousHash": "150b196268a0152e9f0e719ac131a722472a809f49bd507965029a78c7400529",
            "hash": "274a7a13ed20118e8cb745654934a7e24a4d59333ba17dfbf5d4cfe0fa8a6e34"
        }
    ]
}

显然,第3个区块的previousHash并未指向第2个区块的hash。

是真的无法篡改吗

其实并不是,如果我们再聪明一点,把后续区块的hash值也重新计算一下,不就OK了吗? 确实如此,如:

let simpleChain = new BlockChain();
simpleChain.addBlock(new Block("2018-11-11 00:00:01", {amount: 10}));
simpleChain.addBlock(new Block("2018-11-11 00:00:02", {amount: 20}));

console.log("is the chain valid? " + simpleChain.isChainValid());
//篡改第2个区块
simpleChain.chain[1].data = {amount: 15};
simpleChain.chain[1].hash = simpleChain.chain[1].calculateHash();
//并把第3个区块也重新计算
simpleChain.chain[2].previousHash = simpleChain.chain[1].hash;
simpleChain.chain[2].hash = simpleChain.chain[2].calculateHash();
console.log("is the chain still valid? " + simpleChain.isChainValid());
console.log(JSON.stringify(simpleChain, null, 4

关于如何用JS构建你自己的区块链问题的解答就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/144828.html

(0)

相关推荐

  • 分析Oracle表数据库高水位及shrink操作

    技术分析Oracle表数据库高水位及shrink操作这篇文章主要介绍“分析Oracle表数据库高水位及shrink操作”,在日常操作中,相信很多人在分析Oracle表数据库高水位及shrink操作问题上存在疑惑,小编查阅

    攻略 2021年11月5日
  • 如何自定义 Mac 上的控制中心和菜单栏

    技术如何自定义 Mac 上的控制中心和菜单栏 如何自定义 Mac 上的控制中心和菜单栏就像在 iPhone 或 iPad 上一样,您的 Mac 也有一个控制中心,您可以使用它来控制 Wi-Fi、蓝牙、A

    礼包 2021年11月4日
  • 如何解决linux php连不上mysql数据库问题

    技术如何解决linux php连不上mysql数据库问题本篇内容主要讲解“如何解决linux php连不上mysql数据库问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如

    攻略 2021年10月26日
  • 0元免费抖音刷粉-可以刷抖音赞吗

    技术0元免费抖音刷粉-可以刷抖音赞吗0元免费抖音刷粉-可以刷抖音赞吗
    一定要持续更新内容,长期坚持,不断输出价值和塑造你的影响力,这样粉丝的粘度才会高,他们会很期待看到你的新作品。你看那些粉丝上千万的大号,他们就一直保持

    测评 2021年11月13日
  • html5的头部标记有什么(html5头部标记)

    技术html5的头部标记怎么使用这篇文章主要讲解了“html5的头部标记怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“html5的头部标记怎么使用”吧!

    攻略 2021年12月17日
  • 3元一万粉抖音自助网站,抖音刷赞的重要性!

    技术3元一万粉抖音自助网站,抖音刷赞的重要性!在抖音上发布作品,没有人点赞是一件很尴尬的事情,就相当于你的作品已经被抖音抛弃了。想要抖音点赞,可以寻找代刷抖音点赞的网址,抖音刷赞网址靠谱的有吗?这里推荐一个给大家,就这个

    测评 2021年10月26日