JavaScript【代码】使用JS实现简单的区块链(签名+工作量证明机制)

简介: JavaScript【代码】使用JS实现简单的区块链(签名+工作量证明机制)
//区块链 block chain
//data 之前区块的哈希值 当前区块的哈希值:是由存储在区块里的信息算出来的(data + 之前区块的哈希值)
const sha256 = require('./crypto-js/sha256')
//区块
class Block{
    constructor(data){
        this.data = data
        this.previousHash = ''
        this.nonce = 1
        this.hash = this.computeHash()
    }
    computeHash(){
        return sha256(this.data + this.previousHash + this.nonce).toString()
    }
    // 计算符合区块链难度的hash值
    mine(difficulty){
        while(true){
            this.hash = this.computeHash()
            if(this.hash.substring(0, difficulty) !== this.getAnswer(difficulty)){
                this.nonce++
            }else{
                break
            }
        }
    }
    getAnswer(difficulty){
        // 开头前n位为0的hash
        let answer = ''
        while(difficulty-- !== 0){
            answer += '0'
        }
        return answer
    }
}
//区块 的 链 
//生成祖先区块
class Chain{
    constructor(){
        this.chain = [this.bigBang()]
        this.difficulty = 4
    }
    bigBang(){
        const genesisBlock = new Block('祖先区块')
        return genesisBlock
    }
    //获取最新一个区块
    getLatestBlock(){
        return this.chain[this.chain.length-1]
    }
    //添加新区块
    addBlockToChain(newBlock){
        // 1、data 2、previousHash
        newBlock.previousHash = this.getLatestBlock().hash
        newBlock.hash = newBlock.computeHash()
        // 进行挖矿
        newBlock.mine(this.difficulty)
        this.chain.push(newBlock)
    }
    //区块链验证 当前数据是否被篡改 当前区块的previousHash是否等于它的previous的hash值
    validateChain(){
        // 验证祖先区块数据是否被篡改
        if(this.chain.length===1){
            if(this.chain[0].hash !== this.chain[0].computeHash()){
                return false
            }
            return true
        }
        // 验证其他区块
        for(let i = 1, len = this.chain.length-1; i <= len; i++){
            const blockToValidate = this.chain[i]
            // 验证数据是否被篡改
            if(blockToValidate.hash !== blockToValidate.computeHash()){
                console.log("数据被篡改!")
                return false
            }
            // 验证hash值
            if(blockToValidate.previousHash !== this.chain[i-1].hash){
                console.log("前后区块断裂!")
                return false
            }
        }
        return true
    }
}
const zzBlock = new Block('转账1000')
const zzBlock2 = new Block('转账3210')
const zzBlock3 = new Block('转账210')
const blockChain = new Chain()
blockChain.addBlockToChain(zzBlock)
blockChain.addBlockToChain(zzBlock2)
blockChain.addBlockToChain(zzBlock3)
console.log(blockChain.chain.length)
//尝试篡改数据
blockChain.chain[1].data = '转账10W'
blockChain.chain[1].mine(4)
console.log(blockChain)
console.log(blockChain.validateChain())
目录
相关文章
|
资源调度 JavaScript 前端开发
Day.js极简轻易快速2kB的JavaScript库-替代Moment.js
dayjs是一个极简快速2kB的JavaScript库,可以为浏览器处理解析、验证、操作和显示日期和时间,它的设计目标是提供一个简单、快速且功能强大的日期处理工具,同时保持极小的体积(仅 2KB 左右)。
928 24
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
344 32
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
426 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
JavaScript 前端开发
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
Web App开发 JavaScript 前端开发
Node.js:JavaScript世界的全能工具
Node.js:JavaScript世界的全能工具