使用javascript实现简单的区块链(签名+工作量证明机制)(代码片段)

シ風箏 シ風箏     2022-12-16     302

关键词:

//区块链 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())

java实现简单区块链

参考地址:CreatingYourFirstBlockchainwithJava准备开发环境java1.8~maven任选IDE区块链概述顾名思义,区块链就是很多“区块”形成的“链”。每个“区块”上包含的数据有:它自身的数字指纹(digitalfingerprint) 查看详情

区块链的简单实现(代码片段)

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

区块链教程区块链信息安全3椭圆曲线加解密及签名算法的技术原理一

...之上。椭圆曲线加解密及签名算法的技术原理及其Go语言实现椭圆曲线加密算法,即:EllipticCurveCryptography,简称ECC,是基于椭圆曲线数学理 查看详情

基于指针数组实现简单的区块链day(代码片段)

基于指针数组实现简单的区块链day(1)一、比特币的基础知识1.1比特币1.2区块1.3区块链1.4记账1.5钱包1.6节点1.7挖矿1.8出块时间1.9出块奖励1.10比特币总量1.11区块容量1.12每秒成交量1.13单位二、其他基础知识2.1挖矿(工作量... 查看详情

300行abap代码实现一个最简单的区块链原型

...的这篇文章没有任何高大上的术语,就是300行ABAP代码,实现一个最简单的区块链原型。我个人觉得,同区块链本身的实现技术相比,更难的事情是如何找到一个合适的业务场景,把区块链集成到SAP产品中去,让它发挥出作用。... 查看详情

300行abap代码实现一个最简单的区块链原型

...的这篇文章没有任何高大上的术语,就是300行ABAP代码,实现一个最简单的区块链原型。我个人觉得,同区块链本身的实现技术相比,更难的事情是如何找到一个合适的业务场景,把区块链集成到SAP产品中去,让它发挥出作用。... 查看详情

使用java语言从零开始创建区块链

...不少,但是对于区块链具体的实现还不是很清楚,本文就使用Java语言来实现一个简单的 查看详情

毕业设计之---基于联盟连的区块链实现(代码片段)

简介本篇文章将向同学们介绍区块链相关知识,以及如何使用Java实现一个基于联盟链的区块链系统,你甚至可以发布属于自己的虚拟货币.阅读该文章你讲搞懂:什么是区块链区块链有哪些分类区块链实现的关键技术区块链的简单实... 查看详情

怎么用javascript写一个区块链?

... 几乎所有语言都可以编写区块链开发程序。那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的。我将会称作SavjeeCoin!  区块链是由一个个所有人能够访问的... 查看详情

区块链的简单实现(代码片段)

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

学习用python实现简单区块链(代码片段)

...ff0c;pipenv等工具环境步骤先安装一个环境pipinstallpipenvpipenv使用创建环境pipenvinstall会生成一个pipfile文件,用于管理库的依赖在虚拟环境中安装依赖pipenvinstallflask== 查看详情

:最小可行区块链(代码片段)

...据记录列表的这么一个分布式数据库。在此章节中我们将实现一个简单的玩具版的区块链。此章节结束时,我们的区块链将实现以下功能:实现区块和区块链结构定义实现可以将包含任意数据的新区块写入到区块链的方法实现可... 查看详情

rust实现简单区块链(代码片段)

...章只是把之前写的C语言区块链用Rust实现了下,并且使用了md5作为哈希函数。本文只是为了Rust练手,不得不说这语言学起来难但是用起来真爽哈哈哈区块链=由区块顺次连接形成的链Cargo.toml[dependencies]chrono="*"ru... 查看详情

zt-----用javascrip写一个区块链(代码片段)

...人懂得隐藏在它们背后的技术。在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!全文分为三个部分: 实现一个基本的区块链实现POW交易与挖矿奖励 ... 查看详情

区块链简单实现之p2p网络多节点同步(代码片段)

区块链简单实现之p2p网络多节点同步将区块保存为json文件节点不确定性区块里保存节点信息并未向所有节点广播简单模拟广播的代码:实现效果:完整的代码:承接上文:区块链的简单实现,我们已经实现了... 查看详情

基于tendermint的区块链漂流瓶简单实现(代码片段)

...递[加密]信息代码已上传至github。TendermintTendermint帮我们实现了PBFT,相当于搭了一个共识框架,包含两部分:Tendermint-core:PBFT共识算法实现;Tendermint-abci:定义了应用须实现的接口和调用规 查看详情

区块链入门到实战之区块链–非对称加密

非对称加密技术也被称为公钥密码技术(简称PKI)。它使用2个成对的密钥:公钥 对外公开私钥 必须严格保密,保管好不能弄丢密钥本质上是一个数值,使用数学算法产生。可以用公钥加密消息,然后使用私钥解密;反过来... 查看详情

区块链与加密货币

...工作量证明问题附录参考链接对区块链和加密货币做了下简单研究,这里记录下。区块链的目的区块链的实质是公共账本,目的是降低交易中的信任成本公共账本中,如何验证一笔交易是否是交易双方的真实意愿࿰... 查看详情