typesScript 制作一个简易的区块链(2)

news2024/11/14 12:01:43

pow 机制

1.哈希函数的特点

说到 pow 机制,就离不开哈希函数,哈希函数具有以下特点:

  • 输入长度不固定,输出长度固定
  • 输入不同,输出不同
  • 输入相同,输出相同
  • 不可逆
  • 雪崩效应

    雪崩效应:输入变量中只要有一点变化,输出就会发生巨大变化

const CryptoJS = require("crypto-js");
let mseeage1 = "heibaihui";
let mseeage2 = "heibaihu1";
console.log("mseeage1的哈希:" + CryptoJS.SHA256(mseeage1));
console.log("mseeage2的哈希:" + CryptoJS.SHA256(mseeage2));

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

我们可以看到我们只是修改了 mseeage2 的最后一个字符,但是哈希值却发生了巨大变化,这就是哈希函数的雪崩效应

2.实现 pow 机制

pow 机制就是通过哈希函数来生成一个哈希值,这个哈希值需要满足以下条件:

  • 哈希值的前 n 位为 0
  • 哈希值需要通过不断尝试来生成,直到满足条件为止

注意:哈希函数的输入是任意的,所以我们可以通过改变输入来生成不同的哈希值,直到满足条件为止
同时,比特币的 pow 机制中,n 的值是动态变化的,真正的挖矿就是通过不断尝试来生成满足条件的哈希值,然后通过这个哈希值来生成新的区块,而我们为了简化,n 的值是固定的

现在我们有一个需求,我们需要生成一个哈希值,这个哈希值的前 n 位为 0,n 的值为 3,计算出来的就可以获得计账权.

const CryptoJS = require("crypto-js");

const message = "heibaihui";
const logo = "0000";

const pow = (logo, message) => {
  let nonce = 0;
  const start = Date.now();
  while (true) {
    const hash = CryptoJS.SHA256(message + nonce).toString();
    if (hash.startsWith(logo)) {
      const end = Date.now();
      console.log(`找到满足条件的 nonce:${nonce}`);
      console.log(`对应的哈希值:${hash}`);
      console.log(`耗时:${(end - start) / 1000}`);
      break;
    }
    nonce++;
  }
};

pow(logo, message);

运行结果如下:

在这里插入图片描述

在这里我们通过不断尝试来生成满足条件的哈希值,直到找到满足条件的哈希值为止,然后输出这个哈希值和对应的 nonce 值,以及计算出来的时间,这就是 pow 机制的基本原理.
在比特币中,平均每 10 分钟产生一个新区块。
比特币网络通过调整挖矿难度来维持这个平均出块时间。如果全网算力增加,挖矿难度会相应提高,使得找到有效区块的时间仍然保持在大约 10 分钟左右;如果算力减少,难度会降低,以确保出块时间不会过长。
这个相对稳定的出块时间对于比特币网络的安全性和一致性非常重要。它既保证了交易的确认速度不会太慢,又使得攻击者难以篡改区块链,因为要重新计算一个区块以及后续的所有区块需要巨大的算力和时间。

接下来,我们就要修改 Block 类和 BlockChain 类,让他们可以保证新区块的创建有条件.确保出块时间.

修改 Block 类和 BlockChain 类

Block 类

// 定义一个区块类
export class Block {
  public data: string;
  public previousHash: string;
  public hash: string;
  public nonce: number;

  constructor(data: string, previousHash: string) {
    this.data = data;
    this.previousHash = previousHash;
    this.nonce = 0;
    this.hash = this.calculateHash();
  }

  // 计算哈希
  calculateHash(): string {
    return CryptoJS.SHA256(
      this.previousHash + this.data + this.nonce
    ).toString();
  }

  getAnswer(difficulty: number): string {
    let answer = "";
    for (let i = 0; i < difficulty; i++) {
      answer += "0";
    }
    return answer;
  }

  mine(difficulty: number): void {
    const start = Date.now();
    while (true) {
      this.hash = this.calculateHash();
      if (this.hash.substring(0, difficulty) !== this.getAnswer(difficulty)) {
        this.nonce++;
        this.hash = this.calculateHash();
      } else {
        const end = Date.now();
        console.log("挖矿成功,区块哈希值为:" + this.hash);
        console.log(`一共计算了: ${this.nonce}`);
        console.log(`耗时:${(end - start) / 1000}`);
        break;
      }
    }
  }
}

BlockChain 类

// 定义一个区块链类
export class Blockchain {
  public chain: Block[];
  public difficulty: number;

  constructor() {
    this.chain = [this.createGenesisBlock()];
    // 设置挖矿难度
    this.difficulty = 4;
  }

  // 创世区块的创建
  createGenesisBlock(): Block {
    return new Block("创世区块", "");
  }

  // 获取最后一个区块
  getLastBlock(): Block {
    return this.chain[this.chain.length - 1];
  }

  // 区块的追加
  pushLatestBlock(newBlock: Block): void {
    newBlock.previousHash = this.getLastBlock().hash;
    // newBlock.hash = newBlock.calculateHash();
    newBlock.mine(this.difficulty);
    this.chain.push(newBlock);
  }

  // 链的校验
  isChainValid(): boolean {
    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;
  }
}

main.ts

// 创建一个区块
const block1 = new Block("转账10个代币给张三", "1");
// 创建一个区块链
const blockchain1 = new Blockchain();
// 将区块添加到区块链中
blockchain1.pushLatestBlock(block1);
console.log(blockchain1.isChainValid());
console.log(blockchain1);

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

如图所示,我们成功创建了一个区块,并将其添加到区块链中,同时校验了区块链的完整性。并且,我们还实现了简易区块的哈希值计算和pow机制,使得区块链更加安全可靠。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明 功能说明 参数 类型 功能 pbyDataSrcPOINTER TO BYTE指向源数组指针uiSizeUINT要移动数据的BYTE数pbyDataDesPOINTER TO BYTE指向目标数组指针 实例应用-ST IF SYSTEM_CLOCK.AlwaysTrue THENCASE iAutoState OF0: //读写完成信号在下次读写信号的上升沿或复位信号…

【树莓派raspberrypi烧录Ubuntu远程桌面登入树莓派】

提示&#xff1a;本文利用的是Ubuntu主机和树莓派4B开发板&#xff0c;示例仅供参考 文章目录 一、树莓派系统安装下载前准备工作下载安装树莓派的官方烧录软件imagerimager的使用方法 二、主机与树莓SSH连接查看数梅派IP地址建立ssh连接更新树莓派源地址 三、主机端远程桌面配…

Linux权限和开发工具(3)

文章目录 1. 简单理解版本控制器Git1. 如何理解版本控制 2. Git的操作2.1 Git安装2.2 Git提交身份2.3 Git提交命令2.4 Git版本管理2.5 Git下的同步 3. gdb命令3.1解决gdb的难用问题3.2 gdb/cgdb的使用 1. 简单理解版本控制器Git 1. 如何理解版本控制 我们在做项目的时候可能会…

如何在 Django 中生成 Excel 文件并上传至 FastDFS

文章目录 如何在 Django 中生成 Excel 文件并上传至 FastDFS需求背景主要任务 实现步骤 创建 Excel 文件上传 Excel 文件到 FastDFSclient.conf 保存文件 URL 到数据库组合完整的流程总结 如何在 Django 中生成 Excel 文件并上传至 FastDFS 在很多实际应用场景中&#xff0c;我…

电子应用产品设计方案-3:插座式自动温控器设计

一、设计 插座式自动温控器作为一种便捷的温度控制设备&#xff0c;在日常生活和工业应用中发挥着重要作用。它能够根据环境温度的变化自动控制连接设备的电源通断&#xff0c;实现对温度的精确调节和节能控制。本设计旨在提供一种功能强大、易于使用、安全可靠的插座式自动温控…

Redis的常用命令大全

目录 一、Redis简介 1.键值型 2.NoSQL 2.1关联和非关联 2.2查询方式 2.3事务 2.4总结 二、Redis常见命令 2.1 通用命令 2.2 String 命令 2.3 Hash类型 2.4 List类 2.5 Set集合 2.6 SortedSet类型 一、Redis简介 Redis是一种键值型的NoSql数据库&#xff0c;这里…

浅谈PostGIS中的抽稀技术——实现高效空间数据可视化的关键

目录 前言 一、原始数据介绍 1、原始完整数据 2、Qgis中展示原始数据 二、减少数据精度 1、查询函数简介 2、减少精度实战 三、ST_Simplify抽稀实现 1、ST_Simplify函数介绍 2、ST_Simplify抽稀结果 四、ST_SimplifyPreserveTopology抽稀 1、函数介绍 2、抽稀结果 …

网约车管理:规范发展,保障安全与便捷

在数字化时代&#xff0c;网约车已成为城市出行的重要组成部分&#xff0c;为公众提供了前所未有的便捷性。然而&#xff0c;随着网约车行业的迅猛发展&#xff0c;一系列管理问题也随之浮现&#xff0c;如司机资质审核不严、车辆安全标准不一、乘客权益保护不足等。这些问题不…

vue3入门和实战-vue3项目布局

文章目录 前言一、项目目标二、页面布局1.首页布局分析2. 首页布局实现App.vueLayoutIndex.vueLayoutLeft.vueHome.vueHome/components/Header.vueHome/components/Footer.vue3.首页路由4.首页效果显示总结前言 上一节,部署了vue3官方案例,我们需要结合自身项目页面的布局改…

深度学习经典模型之VGGNet

1 VGGNet 1.1 模型介绍 ​ VGGNet是由牛津大学视觉几何小组&#xff08;Visual Geometry Group, VGG&#xff09;提出的一种深层卷积网络结构&#xff0c;他们以7.32%的错误率赢得了2014年ILSVRC分类任务的亚军&#xff08;冠军由GoogLeNet以6.65%的错误率夺得&#xff09;和…

【364】基于springboot的高校科研信息管理系统

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【Windows】CMD命令学习——系统命令

CMD&#xff08;命令提示符&#xff09;是Windows操作系统中的一个命令行解释器&#xff0c;允许用户通过输入命令来执行各种系统操作。 系统命令 systeminfo - 显示计算机的详细配置信息。 tasklist - 显示当前正在运行的进程列表。 taskkill - 终止正在运行的进程。例如&am…

深入探索Waymo自动驾驶技术发展:从DARPA挑战赛到第五代系统的突破

引言 自动驾驶技术正引领着未来出行方式的革命&#xff0c;而Waymo作为全球自动驾驶领域的先锋&#xff0c;始终走在技术发展的最前沿。本文基于Waymo联席CEO德米特里多尔戈夫&#xff08;Dmitri Dolgov&#xff09;在No Priors节目中的访谈&#xff0c;全面介绍Waymo的技术发展…

泷羽sec学习打卡-Windows基础virus

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows virus的那些事儿 一、Windows-Virus资源耗尽之无限弹窗cmd-virus测试锁机virus测试无限重启…

python机器人Agent编程——实现一个本地大模型和爬虫结合的手机号归属地天气查询Agent

目录 一、前言二、准备工作三、Agent结构四、python模块实现4.1 实现手机号归属地查询工具4.2实现天气查询工具4.3定义创建Agent主体4.4创建聊天界面 五、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源ps3.wifi小车控制相关…

如何线程安全的使用HashMap

前言 Map一直是面试中经常被问到的问题。博主在找工作的过程中&#xff0c;就被问到了这样一个问题&#xff1a; Map是线程安全的吗&#xff1f;我不考虑使用线程安全的Map(eg&#xff1a;ConcurrentHashMap) 。如何在多线程/高并发下安全使用 HashMap&#xff1f; 当时博主…

基于MATLAB+opencv人脸疲劳检测

我们可以通过多种方式从现实世界中获取数字图像&#xff0c;比如&#xff1a;数码相机、扫描仪、计算机扫描和磁共振成像等等。在这些情况中&#xff0c;虽然我们肉眼看到的是图像&#xff0c;但是当需要将图像在数字设备中变换传输时&#xff0c;图像的每个像素则对应一个数值…

区块链技术在知识产权保护中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 引言 区块链技术概述 …

交友系统app源码优势,怎么去开发一个交友系统,它适合的场景

https://gitee.com/fantnerd/hunlian.githttps://gitee.com/fantnerd/hunlian.git 语音交友app源码技术优势&#xff1a; 1、语音交友app源码服务端开发语言采用PHP。 2、服务端开发框架主要TP6 3、开发环境&#xff1a;Nginx或者Apache 数据库mysql5.6。 交友程序源码的开发…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量&#xff08;我的是在~/.bash.profile&#xff09; export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…