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 为:
在这里插入图片描述

接下来,我们要理解一下链的存在.
你可以把它想成是一个列表,列表中的每一个元素都包含一个指向前一个元素的哈希指针,以及通过哈希函数计算自己的内容和前一个元素的哈希值计算出的哈希值。
这个区块链一开始就有一个初始的区块(创世区块),这个区块的哈希值为 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);

结果如下:
在这里插入图片描述

验证

在区块链中,如果一个节点篡改了数据,那么其他节点就会收到通知,并更新自己的数据库。我们不希望这样的情况出现,因为这会导致整个区块链的 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());

结果如下
在这里插入图片描述

校验区块链接是否正常

// 如果是通过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());

在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,首先您需要安装 TypeScript。您可以通过 npm 命令来进行安装: ``` npm install -g typescript ``` 安装完成后,您可以在终端中输入以下命令来检查 TypeScript 是否已经正确安装: ``` tsc -v ``` 接下来,您可以创建一个 TypeScript 项目。假设您已经有一个项目目录,您可以在该目录下创建一个 `tsconfig.json` 文件,该文件用于配置 TypeScript 项目的编译选项。下面是一个示例 `tsconfig.json` 文件: ```json { "compilerOptions": { "target": "es5", "module": "commonjs", "outDir": "dist", "strict": true, "esModuleInterop": true }, "include": [ "src/**/*" ], "exclude": [ "node_modules" ] } ``` 在上面的配置文件中,我们指定了编译目标为 ES5,模块系统为 CommonJS,输出目录为 `dist`,启用了严格模式和 ES 模块的互操作性。 接下来,您可以在 `src` 目录下创建 TypeScript 源代码文件。例如,您可以创建一个 `index.ts` 文件,该文件包含一个简单TypeScript 类: ```typescript class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() { return `Hello, ${this.greeting}!`; } } let greeter = new Greeter('world'); console.log(greeter.greet()); ``` 最后,您可以在终端中使用以下命令来编译 TypeScript 代码: ``` tsc ``` 编译完成后,您可以在 `dist` 目录下找到编译后的 JavaScript 代码。您可以使用 Node.js 来运行该代码: ``` node dist/index.js ``` 以上就是使用 TypeScript 编写一个简单项目的基本步骤。当然,在实际项目中,还需要更多的配置和工具支持来提高开发效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值