区块链的简单实现

2023-11-17

什么是区块链

一个维护着一个持续增长的有序数据记录列表的这么一个分布式数据库

下面我将简单用nodejs实现一个简单的区块链,它具有区块链的基本特性,但没有涉及PoS of PoW。

块结构

在这里插入图片描述
一个块Block一般有:

  • index 块号
  • previousHash 上一个区块的hash值
  • timestamp 时间戳
  • data 存放的数据
  • hash 区块的hash值
class Block {
    constructor(index, previousHash, timestamp, data, hash) {
        this.index = index;
        this.previousHash = previousHash;
        this.timestamp = timestamp;
        this.data = data;
        this.hash = hash.toString();
    }
    toString(){
        return "\n{\nindex:"+this.index+",\npreviousHash:'"+this.previousHash+"',\ntimestamp:"+this.timestamp+",\ndata:'"+this.data+"',\nhash:'"+this.hash+"'\n}\n"
    }
}

我们每生成一个区块,我们都会给这个区块按照特定的hash算法,来得到一个hash值,一般来说,只要这个区块的index,previoushash,timestamp,data有改动,那么它所算出的hash值也会改变,所以当你想要篡改某个区块的数据时,你需要将后面所有的区块的previoushash都进行篡改。

创世区块

第一个区块是没有前置hash的,是特殊的一个区块,我们用代码将这个区块写死

const genesisBlock = new Block.Block(
    0, null, 1619079309.946, "genesis block", '80dea37cccca5fb56b9b78dbe2733fb19e8ee2aa7bb03d4ac1e361fe3fad7b51'
);

hash

本文采用sha256来求得hash值

exports.caHash=function (index, previousHash, timestamp, data){
   	return sha256(index + previousHash + timestamp + data).toString();
}

验证块的有效性

下面是验证单个块是否有效,可以根据下面遍历整个链是否有效。

vaildBlock(block,lastBlock) {
        if (!Block.isValidBlockStructure(block))
            return false;
        if (
            (block.index==lastBlock.index+1)
            &&(block.previousHash==lastBlock.hash)
            &&Block.caHash(block.index,block.previousHash,block.timestamp,block.data)
        )
            return true;
        return false;
    }

记录数据

creatBlock(data){
        var lastBlock=this.getLastBlock();
        var newIndex=lastBlock.index+1;
        var newTime=new Date().getTime()/1000;
        var newPreHash=lastBlock.hash;
        var newhash=Block.caHash(newIndex,newPreHash,newTime,data.toString());
        return this.blocks[this.blocks.length]= new Block.Block(
            newIndex, newPreHash, newTime, data, newhash
        );

    }

从其他节点接收一个块

addBlock(block){
        if (validBlock(block,this.getLastBlock())){
            blocks.push(block);
            return true;
        }
        return false;
    }

编写测试代码

var Chain=require("./Chain");
var BlockChain=new Chain.BlockChain();
var http=require('http');
var fs=require('fs');
var querystring=require('querystring');

var server=http.createServer(function (req,res) {
    var url=req.url;
    if (url=="/get"){
        res.writeHead(200,{'content-type':'text/plain'+'charset=UTF8'});
        var str=BlockChain.blocks;
        res.end(str.toString());
    }else if (url=="/creat"){
        var data=[];
        req.on('data',function (chunk) {
            data.push(chunk);
        })
        req.on('end',function (chunk){
            var dataObj=querystring.parse(data.toString())
            BlockChain.creatBlock(dataObj["data"]);
            var lastblock=BlockChain.getLastBlock();
            res.setHeader('content-type','text/plain;charset=UTF8');
            res.write(lastblock.toString());
            res.end("生成区块"+lastblock.index+"号成功!");
        })

    }else {
        res.setHeader('content-type','text/html;charset=UTF8');
        fs.readFile('./client.html',function (err,data) {
            res.write(data);
            res.end();
        })
    }

});
server.listen(2345);

测试结果

在这里插入图片描述
输入一些数据,然后点击生成区块:
在这里插入图片描述
点击获取区块链:
在这里插入图片描述

完整代码

你可以从仓库里获取完整代码:

github: https://github.com/Lixingwei0623/ablockchain.
gitee: https://gitee.com/li-xingwei/simple-block-chain.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链的简单实现 的相关文章

  • hashlib 和 urandom 哪个更随机?

    我正在和一个朋友一起开发一个项目 我们需要生成随机哈希 在我们有时间讨论之前 我们都提出了不同的方法 并且因为他们使用不同的模块 我想问你们大家什么会更好 如果有这样的事情的话 hashlib sha1 str random random
  • 如何按值降序对哈希进行排序并在 ruby​​ 中输出哈希?

    output sort by k v v reverse 和钥匙 h a gt 1 c gt 3 b gt 2 d gt 4 gt a gt 1 c gt 3 b gt 2 d gt 4 Hash h sort 现在我有这两个 但我试图按值
  • 使用javascript向url添加哈希而不滚动页面?

    在不滚动页面的情况下向 url 添加哈希 使用 JavaScript 我打开页面 我向下滚动 我单击添加哈希的链接 可能带有值 test 示例 http www example com test http www example com t
  • 哈希表的空间复杂度是多少?

    具有 32 位键和指向单独存储的值的 32 位指针的哈希表的大小是多少 是 2 32 个槽 4 字节 键 4 字节 指向值的指针 4 10 9 4 4 32GB 我想了解哈希表的空间复杂度 我认为你问错了问题 数据结构的空间复杂度表示它占用
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 从哈希中删除 nil 值

    我希望从哈希中删除具有nil value article是一个存储每篇文章的类 并且attributes方法将文章存储为散列 预期结果 articles results author null title Former bar manage
  • 如何使用“子例程引用”作为哈希键

    在 Perl 中 我正在学习如何取消引用 子例程引用 但我似乎无法使用子例程引用作为哈希 键 在下面的示例代码中 我可以创建对子例程 subref 的引用 然后取消引用它以运行子例程 subref 我可以使用引用作为哈希 值 然后轻松取消引
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • c# AudioFingerprinting 和局部敏感哈希

    我之前发现过类似的帖子 但没有真正回答这个问题 在我的指纹识别中 我生成了一个包含 5 个整数的记录集 例如 33 42 88 121 194 这些对应于特定音乐样本的最高幅度的频率 例如 对于 30ms 的音频样本 我有以下频率的桶 0
  • 与 6 位随机字母数字代码发生冲突的概率是多少?

    我使用以下 Perl 代码生成随机字母数字字符串 仅限大写字母和数字 用作 MySQL 数据库中记录的唯一标识符 数据库的行数可能会保持在 1 000 000 行以下 但实际的绝对最大值约为 3 000 000 行 我是否有 2 条记录具有
  • 直接对文件的哈希值进行数字签名,而不是对文件进行签名

    我的问题是 是否可以直接对文件的哈希值而不是文件进行数字签名 我必须通过电子令牌在 Web 环境中对 xml 文件进行数字签名 所以我必须将文件从服务器下载到客户端 然后从客户端计算机上的电子令牌 USB 获取证书并对文件进行签名并将其上传
  • 160 位 SHA1 哈希值的前 32 位是否可以替代 CRC32 哈希值?

    我正在开发一个 NET 3 5 项目 我需要一个 32 位哈希值 NET 加密类中似乎没有任何方法返回 32 位哈希 MD5 是 128 位 SHA1 是 160 位等 我实现了一个 CRC32 类 但我发现现有的 SHA1 和 MD5 哈
  • 在 Perl 中将整个文件读入哈希值

    我在 Perl 中将文件读入哈希时遇到一些问题 Chr1 supercontig 000000000 1 500 PILOT21 588 1 3 14602 59349 1 Chr1 supercontig 000000001 5 100
  • 使用 openssl 库获取 x509 证书哈希

    我目前正在开发一个应用程序 它使用 openssl 库 libcrypto 来生成证书 现在我必须获取现有证书的哈希值 当我使用终端时 我可以使用以下命令生成哈希值 openssl x509 hash in cert pem noout 输
  • 如何在没有循环的情况下初始化哈希中的值?

    我正在尝试找出一种无需经过循环即可初始化哈希的方法 我希望使用切片来实现这一点 但它似乎没有产生预期的结果 考虑以下代码 usr bin perl use Data Dumper my hash hash currency symbol B
  • 四个无符号整数的哈希函数 (C++)

    我现在正在编写一个程序 它生成四个无符号 32 位整数作为某个函数的输出 我想对这四个整数进行哈希处理 这样我就可以将该函数的输出与未来的输出进行比较 不过 我在编写一个像样的哈希函数时遇到了麻烦 当我最初编写这段代码时 我对四个整数分别进
  • 如何在没有 __hash__ 的情况下删除对象列表中的重复项

    我有一个自定义对象列表 我想从中删除重复项 通常 您可以通过定义两者来做到这一点 eq and hash 为你的对象 然后采取set的对象列表 我已经定义了 eq 但我想不出一个好的实现方法 hash 这样它对于相等的对象返回相同的值 更具
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 迭代法求解线性方程组(C++实现)

    本系列是数值分析相关算法的文章 这次用迭代法求解线性方程组 不同于上次用高斯消元法之类的求解 迭代法对于稀疏矩阵方程组的运算 会大大提高 而如果用高斯相关的算法求解 会浪费大量资源计算无用的东西 所以有必要研究此算法 本文章主要使用了3个算
  • android之service

    Service的启动有两种方式 context startService 和 context bindService 通过startService 启动的服务处于 启动的 状态 一旦启动 service就在后台运行 即使启动它的应用组件已经
  • Matlab2023a最新详解

    MATLAB 2023版的深度学习工具箱 提供了完整的工具链 使您能够在一个集成的环境中进行深度学习的建模 训练和部署 与Python相比 MATLAB的语法简洁 易于上手 无需繁琐的配置和安装 让您能够更快地实现深度学习的任务 MATLA
  • 【CTF/MISC】图片隐写题(binwalk/foremost/010editer配合使用)

    图片隐写 题目 解题思路 binwalk工具查看是否有隐藏文件 foremost工具分离文件 010editer查看二进制数据 寻找解压密码 解题心得 题目连接 题目 题目是一张图片 寻找题目中隐藏的flag 解题思路 一般来说我碰到图片隐
  • SSM框架下实现简单增删查改的具体细节(代码)

    UserInfo public class UserInfo private int id private String username private String password public int getId return id
  • 电子检测报告如何盖骑缝章?

    检测评估报告通常有多页 几十页的报告也不少见 文件中除了要在检测机构盖公章处盖章 还需要盖骑缝章 为了防范风险 防止报告内容被更换的情况 就需要骑缝章的加盖来保证检测报告的整体性 下面以微签为例 展示一下电子检测报告如何盖骑缝章 微签在检测
  • Java线程池面试题整理总结【实习打卡01】

    ThreadLocal GC 之后 key 是否为 null 不一定 1 当使用new ThreadLocal lt gt set s 定义threadlocal时 没有在栈中声明一个变量指向他 那他就是只被弱引用 在gc后 那这个thre
  • 获取微信小程序码实例,建议拿到字节流后可以base64编码再上传图片,得到图片地址进行使用

    接口调用凭证 access token public static String postToken String appId String appKey throws Exception String requestUrl https a
  • 【无人车】用于无人地面车辆的路径跟踪算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 无人驾驶技术是当前社会的热门技术之一 无人
  • 【Unity&UGUI&Shader】创建材质球Material&代码控制更换物体材质球

    UGUI Unity Graphical User Interface 简称 UGUI 又称图形用户接口 如何创建材质球 NGUI Next generation GUI 下一代图形用户接口 Assets Create Material如下
  • 泛型,序列化

    何为泛型 1 JDK1 5以后推出的一种新的参数化的类型 2 通常可以理解为一种一种编译类型 在运行时无效 3 类型生活中的标签 为什么使用泛型 1 约束类中属性类型 方法参数类型 方法返回值类型 2 提高运行时性能 List s new
  • 西门子PLC的TCP通讯(不同项目下)②--TRCV_C指令

    西门子PLC的TCP通讯 不同项目下 TRCV C指令 上期主要了解了TSEND C指令的各项参数的意义 隐藏参数LEN等可以默认 本期将了解另一个配套组合指令块TRCV C 这是个接收指令块 大概呢跟发送指令TSEND C差不多 1 0
  • pinia的基本使用

    npm install pinia 安装pinia import createPinia from pinia app use createPinia main js中使用pinia 新建一个store文件夹 类似于vuex src sto
  • 前端技术搭建扫雷小游戏(内含源码)

    The sand accumulates to form a pagoda 写在前面 功能介绍 页面搭建 样式设置 逻辑部分 写在前面 上周我们实通过前端基础实现了贪吃蛇游戏 今天还是继续按照我们原定的节奏来带领大家完成一个游戏 功能也比较
  • Python机器学习笔记:深入理解Keras中序贯模型和函数模型

    先从sklearn说起吧 如果学习了sklearn的话 那么学习Keras相对来说比较容易 为什么这样说呢 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程 sklearn的机器学习使用流程 from skle
  • Linux下minicom的配置和使用方法

    安装配置minicom lsmod grep usbserial 如果直接使用串口线 而没有用到USB转串口设备 此步可以跳过 如果有usbserial 说明系统支持USB转串口 安装minicom Fedora自带有minicom 此步可
  • shell 守护进程之 mongodb

    场景 因为某些原因 mongodb 挂掉了 需要重启 思路 写个守护进程脚本 每分钟查看mongodb状态 这里查看mongodb进程是否存在 如果挂掉就重启 执行 1 创建sh文件 mkdir p data wwww guard mong
  • it技术交流社区与学习资料的网站大全

    点击上方蓝字 优派编程 选择 加为星标 第一时间关注原创干货 对国内技术社区 博客园 https www cnblogs com 掘金 https juejin cn 思否 https segmentfault com 开源中国 https
  • Ubuntu18.04升级到20.04

    升级方式 命令行升级 正常情况下使用如下命令即可 sudo do release upgrade 当提示如下错误信息时 得先升级本地软件包 Please install all available updates for your rele
  • 区块链的简单实现

    区块链的简单实现 什么是区块链 块结构 创世区块 hash 验证块的有效性 记录数据 从其他节点接收一个块 编写测试代码 测试结果 完整代码 什么是区块链 一个维护着一个持续增长的有序数据记录列表的这么一个分布式数据库 下面我将简单用nod