Node实现简易区块链,助你了解区块链运行原理

简介: 前言 正式了解比特币是在17年的时候,在那个闭着眼睛都能赚到钱的年代,我也跟绝大多数人一样,进入了这场声势浩大的"赌博"。“赌博”过程中让我对区块链产生了兴趣,我很好奇,他们经常提到的挖矿是什么?挖矿为啥就费电,费CPU? 所谓的挖矿 后来查资料才了解到,挖矿就是不断的计算,并且是毫无道理的“瞎算”,只要达到一个很“傻”的条件就表示你挖矿成功。
+关注继续查看

前言

正式了解比特币是在17年的时候,在那个闭着眼睛都能赚到钱的年代,我也跟绝大多数人一样,进入了这场声势浩大的"赌博"。
“赌博”过程中让我对区块链产生了兴趣,我很好奇,他们经常提到的挖矿是什么?挖矿为啥就费电,费CPU?

所谓的挖矿

后来查资料才了解到,挖矿就是不断的计算,并且是毫无道理的“瞎算”,只要达到一个很“傻”的条件就表示你挖矿成功。

Node实现简单的挖矿

const crypto = require('crypto');
//创世区块 这是第一次挖矿生成的数据
const initBlock ={ 
    index: 0,
    nonce: 1307,
    data: '我是创世区块',
    prevHash: 0,
    timestamp: 1551248147024,
    hash:
     '00e275e4946f0fdf672be32fd4dfeaae0b7efd8d9f377c48ac510efe79d6a814' 
    };
class Blockchain{
    constructor(){
        this.blockchain = [
            initBlock //默认有一个创世区块
        ];
        this.data= [];
        this.difficulty = 2; //难度
        
    }
    //挖矿
    min(){
        const index = this.blockchain.length; //索引.也就是现在区块的长度
        let nonce = 0; //随机数
        const data = this.data;
        const prevHash= this.getLastChain();// 上一个区块的hash值
        let timestamp = new Date().getTime(); //时间戳
        let hash = this.computeHash(index,prevHash,timestamp,data, nonce);
        //判断得到的hash的前 几位 是否为 0~
        while(hash.slice(0, this.difficulty) !== "0".repeat( this.difficulty ))
        {
            nonce+=1;
            hash = this.computeHash(index,prevHash,timestamp,data, nonce);
            console.log(`正在进行第${nonce}次挖矿:${hash}`);
        }
        this.blockchain.push({
            index,
            nonce,
            data,
            prevHash,
            timestamp,
            hash
        })
        console.log(this.blockchain);
            
    }   
    //获取最后一个区块的数据
    getLastChain(){
        return this.blockchain[this.blockchain.length-1].hash;
    }
    //计算哈希
    computeHash(index, prevHash, timestamp, data, nonce){
        return crypto
                .createHash('sha256')
                .update( index + prevHash + timestamp + data + nonce)
                .digest('hex');
    }
}
var chain = new Blockchain();
chain.min();

运行效果如下:

Snipaste_2019_03_05_21_34_30

难度越大,所需要的计算能力也就越高,所以也就越费电,虽然这并没有必然的联系,不过,目前来说确实如此

阿里云优惠劵福利领取

目录
相关文章
|
1月前
|
前端开发 JavaScript
前端学习笔记202306学习笔记第四十三天-在node版本中运行js之1
前端学习笔记202306学习笔记第四十三天-在node版本中运行js之1
21 0
|
1月前
|
前端开发 JavaScript
前端学习笔记202306学习笔记第四十三天-在node版本中运行js之2
前端学习笔记202306学习笔记第四十三天-在node版本中运行js之2
28 0
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js -- Node.js概述与安装和运行
Node.js -- Node.js概述与安装和运行
|
1月前
webstorm命令行提示‘node‘ 或‘npm‘不是内部或外部命令,也不是可运行的程序
webstorm命令行提示‘node‘ 或‘npm‘不是内部或外部命令,也不是可运行的程序
|
3月前
|
JavaScript 安全 Windows
‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。解决办法
‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。解决办法
|
3月前
|
JavaScript 前端开发 Shell
如何运行Node.js脚本及读取环境变量
如何运行Node.js脚本及读取环境变量
|
3月前
|
资源调度 JavaScript 安全
可以在浏览器页面运行 node 代码了!webContainer 发布 1.0
可以在浏览器页面运行 node 代码了!webContainer 发布 1.0
66 0
|
6月前
|
Web App开发 存储 JavaScript
什么是 Node.js?初学者对 JavaScript 运行时的介绍
什么是 Node.js?初学者对 JavaScript 运行时的介绍
181 0
|
9月前
|
JavaScript
Sublime Text3运行node.js
Sublime Text3运行node.js
|
10月前
|
JavaScript
‘node‘ 不是内部或外部命令,也不是可运行的程序
‘node‘ 不是内部或外部命令,也不是可运行的程序
731 0
‘node‘ 不是内部或外部命令,也不是可运行的程序
推荐文章
更多