typeScript制作一个简单易懂的区块链(1)

这篇具有很好参考价值的文章主要介绍了typeScript制作一个简单易懂的区块链(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

区块链

区块链是一种分布式数据库,它存储在节点上,每个节点都拥有一份完整的数据库副本。当一个节点更新数据库时,其他节点会收到通知并更新自己的数据库。

代码实现

我们可以使用 CryptoJS 库来计算哈希值。
先简单的理解一下,区块链的每一个区块都包含三个字段:数据、前一个区块的哈希值和当前区块的哈希值。
代码实现如下:

// 如果是通过CDN或者全局引入CryptoJS,可以直接使用
const CryptoJS = require("crypto-js");

// 定义一个区块类
class Block {
  public data: string;
  public previousHash: string;
  public hash: string;
  constructor(data, previousHash = "") {
    this.data = data;
    this.previousHash = previousHash;
    this.hash = this.calculateHash();
  }
  calculateHash() {
    return CryptoJS.SHA256(this.previousHash + this.data).toString();
  }
}
// 创建一个区块链
const block1 = new Block("Hello World", "0");
console.log(block1);

我们可以看到,block1 为:
typeScript制作一个简单易懂的区块链(1),区块链,typescript,区块链

接下来,我们要理解一下链的存在.
你可以把它想成是一个列表,列表中的每一个元素都包含一个指向前一个元素的哈希指针,以及通过哈希函数计算自己的内容和前一个元素的哈希值计算出的哈希值。
这个区块链一开始就有一个初始的区块(创世区块),这个区块的哈希值为 0。
可以使用以下代码来实现:

// 定义一个区块链类
class Blockchain {
  public chain: Block[];
  constructor() {
    this.chain = [this.createGenesisBlock()];
  }
  //获取最后一个区块
    getLastBlock(){
        return this.chain[this.chain.length - 1];
    };
    // 区块的追加
    pushLatestBlock(newBlock: Block){
        newBlock.previousHash = this.getLastBlock().hash;
        newBlock.hash = newBlock.calculateHash();
        this.chain.push(newBlock);
    }
}

可以看到,我们创建了一个区块链类,其中包含一个链,这个链是一个数组,数组中的每一个元素都是区块。
我们可以创建一个区块链实例,然后向区块链中添加区块。

// 创建一个区块
const block1 = new Block("Hello World", "0");
// console.log(block1);
// 创建一个区块链,并将block1加入到区块链中
const blockchain = new Blockchain();
blockchain.pushLatestBlock(block1);
console.log(blockchain);

结果如下:
typeScript制作一个简单易懂的区块链(1),区块链,typescript,区块链

验证

在区块链中,如果一个节点篡改了数据,那么其他节点就会收到通知,并更新自己的数据库。我们不希望这样的情况出现,因为这会导致整个区块链的 integrity 被破坏。
所以我们需要验证区块。
首先,我们先验证当前的区块的信息是否已经被篡改过。

校验区块的hash值

// 如果是通过CDN或者全局引入CryptoJS,可以直接使用
const CryptoJS = require("crypto-js");


// 定义一个区块类
class Block{
    public data: string;
    public previousHash: string;
    public hash: string;
    constructor( data: string, previousHash: string ){
        this.data = data;
        this.previousHash = previousHash;
        this.hash = this.calculateHash();
    }
    calculateHash(){
        return CryptoJS.SHA256(this.previousHash + this.data).toString();
    }
}
// 定义一个区块链类
class Blockchain{
    public chain: Block[];
    constructor(){
        this.chain = [this.createGenesisBlock()];
    }
    // 创世区块的创建
    createGenesisBlock(){
        return new Block('Genesis Block','');
    }
    //获取最后一个区块
    getLastBlock(){
        return this.chain[this.chain.length - 1];
    };
    // 区块的追加
    pushLatestBlock(newBlock: Block){
        newBlock.previousHash = this.getLastBlock().hash;
        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值
            if(currentBlock.hash !== currentBlock.calculateHash()){
                console.log('当前区块的哈希值与计算出的哈希值不一致');
                return false;
            }
            return true;
       }
   }
}
// 创建一个区块
const block1 = new Block('Hello World',"1");
const blockchain1 = new Blockchain();
blockchain1.pushLatestBlock(block1);
console.log(blockchain1.isChainValid());
// 修改已经上链的值
blockchain1.chain[1].data = 'Hello java';
console.log(blockchain1.isChainValid());

结果如下
typeScript制作一个简单易懂的区块链(1),区块链,typescript,区块链

校验区块链接是否正常

// 如果是通过CDN或者全局引入CryptoJS,可以直接使用
const CryptoJS = require("crypto-js");


// 定义一个区块类
class Block{
    public data: string;
    public previousHash: string;
    public hash: string;
    constructor( data: string, previousHash: string ){
        this.data = data;
        this.previousHash = previousHash;
        this.hash = this.calculateHash();
    }
    calculateHash(){
        return CryptoJS.SHA256(this.previousHash + this.data).toString();
    }
}
// 定义一个区块链类
class Blockchain{
    public chain: Block[];
    constructor(){
        this.chain = [this.createGenesisBlock()];
    }
    // 创世区块的创建
    createGenesisBlock(){
        return new Block('Genesis Block','');
    }
    //获取最后一个区块
    getLastBlock(){
        return this.chain[this.chain.length - 1];
    };
    // 区块的追加
    pushLatestBlock(newBlock: Block){
        newBlock.previousHash = this.getLastBlock().hash;
        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值
            if(currentBlock.hash !== currentBlock.calculateHash()){
                console.log('当前区块的哈希值与计算出的哈希值不一致');
                return false;
            }
            // 校验区块链接是否正常
            if(currentBlock.previousHash !== previousBlock.hash){
                console.log('当前区块的previousHash与前一个区块的hash不一致');
                return false;
            }
            return true;
       }
   }
}
// 创建一个区块
const block1 = new Block('Hello World',"1");
const blockchain1 = new Blockchain();
blockchain1.pushLatestBlock(block1);
console.log(blockchain1.isChainValid());
// 修改已经上链的值
blockchain1.chain[1].data = 'Hello java';
console.log(blockchain1.isChainValid());
const blockchain2 = new Blockchain();
blockchain1.pushLatestBlock(block1);
const block2 = new Block('Hello ts',"2");
blockchain2.pushLatestBlock(block2);
// 修改已经上链的区块的值和哈希值
blockchain1.chain[1].data = 'Hello java';
blockchain1.chain[1].hash = blockchain1.chain[1].calculateHash();
console.log(blockchain1.isChainValid());

typeScript制作一个简单易懂的区块链(1),区块链,typescript,区块链文章来源地址https://www.toymoban.com/news/detail-860829.html

到了这里,关于typeScript制作一个简单易懂的区块链(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TypeScript -类型断言的简单理解

    类型断言 : 是手动的给某个变量 指定类型,从而可以方便操作该类型的属性和方法。 方式一 : 变量名 as 类型 方式二 :类型 变量名 注意 : 1、类型断言只是为了方便明确变量的类型,而不是将变量的类型进行改变!!! 2、因此,类型断言在使用的时候,建议 在我们已

    2024年02月08日
    浏览(41)
  • 创建一个 React+Typescript 项目

    接下来 我们来一起探索一下用TypeScript 来编写react 这也是一个非常好的趋势,目前也非常多人使用 那么 我们就先从创建项目开始 首先 我们先找一个 或者 之前创建一个目录 用来放我们的项目 然后 在这个目录下直接输入 例如 这里 我想创建一个叫 tsReApp 的项目就可以输入

    2024年02月13日
    浏览(42)
  • TypeScript实现一个贪吃蛇小游戏

    游戏效果 文件目录 准备1 :新建index.html,编写游戏静态页面 准备2 :使用less,修改样式,编写CSS 准备3: 创建4个类:食物类-Food、记分牌等级类-ScorePanel、蛇类-Snake、操控类-GameControl 准备4 :创建index.ts文件,执行游戏

    2024年01月19日
    浏览(57)
  • 如何优雅的发布一个 TypeScript 软件包?

    向 NPM 发布软件包本身并不是一个特别困难的挑战。但是,配置你的 TypeScript 项目以取得成功可能是一个挑战。你的软件包能在大多数项目上运行吗?用户能否使用类型提示和自动完成功能?它能与 ES Modules (ESM) 和 CommonJS (CJS) 风格的导入一起使用吗? 阅读完本篇文章后,你将

    2024年01月23日
    浏览(43)
  • Naive UI:一个 Vue 3 组件库,比较完整,主题可调,使用 TypeScript,快有点意思。

    在当今的前端开发领域,Vue 3已成为中后台应用的首选框架。为了满足开发者的需求,各种组件库如雨后春笋般涌现。其中,Naive UI以其独特的优势,成为了Vue 3开发者的得力助手。本文将深入探讨Naive UI的特性、优势以及如何使用它来提高开发效率。 一、Naive UI的特性 组件丰

    2024年04月22日
    浏览(44)
  • vane 一个适用于前端打工人的全栈框架,nodejs+vue3+typescript

    写这个的初衷是因为每次用node写接口的时候总是需要一些写大一堆的东西, 也有些人把很多接口都放在一个js文件内, 看起来很是杂乱, 后来用到nuxt写的时候, 感觉用文件名来命名接口路径很是方便, 无论是query参数还是params参数,都可以通过文件名来命名, 也可以通过文件夹层级

    2024年02月11日
    浏览(47)
  • 【Docker】部署和运行青龙面板:一个支持python3、javaScript、shell、typescript 的定时任务管理面板

    青龙面板是一个支持python3、javaScript、shell、typescript 的定时任务管理面板。 拉取镜像 从 Docker Hub 上拉取最新的 “qinglong” 镜像。 启动容器 使用刚刚拉取的镜像来启动一个新的 Docker 容器。 这个命令中的各个组成部分的含义如下: docker run : 这是 Docker 的一个命令,用于创建

    2024年01月22日
    浏览(60)
  • chatgpt赋能python:Python本地安装库:一个简单易懂的指南

    Python是一种高级的编程语言,它拥有庞大的社区支持和无数的第三方库。如果你在使用Python时需要一些额外的功能,那么你可能需要安装一些库。本文将介绍如何在本地安装库,以及一些需要注意的事项。 Python库是一组已经编写好的Python代码,用于完成一些特定的任务。这些

    2024年02月08日
    浏览(50)
  • 创造你的第一个微信小程序:简单易懂的入门指南

    1.1 介绍 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。可以在微信内被便捷地获取和传播,同时具有出色的使用体验。 官方网址 :https://mp.weixin.qq.com/cgi-bin/wx?token=lang=zh_CN 小程序主要运行微信内部,可通过上述网站来整体了解微信小程序的开发。 首先 ,

    2024年02月05日
    浏览(101)
  • 【TypeScript】TypeScript中的泛型

    定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定),此时泛型便能够发挥作用。 举个例子: 上例中,test函数有一个参数类型不确定,但是能确定的时其返回值的类型和参数的类型是相同的,由于类型不确定所以参数和

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包