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())
目录
相关文章
|
30天前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
73 15
在 golang 中执行 javascript 代码的方案详解
|
8天前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
2月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
2月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
48 3
|
2月前
|
JavaScript 前端开发
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
|
2月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
2月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
219 1
|
2月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
17天前
|
供应链 安全 分布式数据库
探索区块链技术在供应链管理中的应用
【10月更文挑战第21天】 本文深入探讨了区块链技术如何在供应链管理中发挥关键作用,通过具体案例分析,揭示了区块链提高透明度、降低成本和增强安全性的潜力。文章首先概述了区块链技术的基本原理及其对传统供应链模式的挑战,接着详细讨论了区块链如何在不同供应链环节中实施,并分析了其带来的变革。最后,文章提出了企业在采纳区块链技术时可能面临的挑战和应对策略,为供应链管理者提供了宝贵的参考。