前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我编写了一个应用程序来告诉你区块链是如何运作的

我编写了一个应用程序来告诉你区块链是如何运作的

作者头像
FesonX
发布2018-03-20 18:14:11
2.9K0
发布2018-03-20 18:14:11

我编写了一个应用程序来告诉你区块链是如何运作的

根据维基百科的描述, 区块链是:

一个分布式数据库, 用于维护不断增长的记录列表, 这个列表称作

听起来挺棒的, 但它是如何运作的?

为了演示一个区块链, 我们将使用一个名为Blockchain CLI的开源命令行界面.

我在这里也构建了一个基于浏览器的版本.

安装命令行界面版本

如果你还没有准备好, 请先安装Node.js.

然后在终端中运行以下命令:

代码语言:txt
复制
npm install blockchain - cli - g
blockchain

你应该可以看到👋 Welcome to Blockchain CLI以及!blockchain →提示你命令行准备好接收命令了.

一个区块是什么样的?

要查看你当前的区块链, 请输入blockchainbc至命令提示符. 你应该会看到一个区块如下图所示.

区块链上的一个区块
区块链上的一个区块
  • 索引(块号, Block#): 它是哪个块? (起始块(Genesis Block)有一个索引0)
  • 哈希值(Hash): 块是否有效?
  • 前一个哈希值(Previous Hash): 前面的块是否有效?
  • 时间戳(Timestamp): 块是什么时候添加的?
  • 数据(Data): 块中存储了什么信息?
  • 随机数(Nonce): 在我们找到一个有效的块之前, 经历了多少次迭代?

起始块(Genesis Block)

每个区块链都会以🏆 Genesis Block开始. 正如你稍后会看到的, 区块链上的每个区块都依赖于前一个区块. 所以, 我们需要起始块来挖掘我们的第一个区块.

当一个新的区块被挖掘时会发生什么?

让我们来挖掘我们的第一个区块. 命令提示符中键入 mine freeCodeCamp♥︎

区块链会查看区块链上最新区块的索引和它的前一个哈希值. 在现在的情况下, 起始块是最新的块.

  • 索引: o + 1 = 1
  • 前一个哈希值 0000018035a828da0 ...
  • 时间戳: 块的添加时间
  • 数据: freeCodeCamp❤
  • 哈希: ??
  • 随机数: ??

哈希值是如何计算的?

哈希值是唯一标识数据的固定长度的数值.

哈希值是由索引,先前区块的散列值,时间戳,数据块和随机数作为输入数据计算所得的.

代码语言:txt
复制
CryptoJS.SHA256 ( index + previousHash + timestamp + data + nonce )

SHA256算法将根据给出的输入数据计算出一个唯一的哈希值,相同的输入将始终返回相同的哈希值.

你是否注意到区块哈希值的四个前导0?

四个前导0是一个有效散列值的最低要求. 前导0所需的数量被称为难度.

代码语言:txt
复制
function isValidHashDifficulty (hash, difficulty) {
    for(var i =  0,  b = hash.length; i < b; i++ { 
      if (hash[i]  !== '0') {
           break;
      }
    }
    return i >= difficulty;
}

这就是我们熟知的工作量证明(Proof-of-Work)系统.

什么是随机数(Nonce)?

随机数是一个用于查找有效散列的数字.

代码语言:txt
复制
let nonce = 0;
let hash;
let input;
代码语言:txt
复制
while(!isValidHashDifficulty(hash)) {
    nonce = nonce + 1;
    input = index + previousHash + timestamp + data + nonce;
    hash = CryptoJS.SHA256(input)
}

随机数会持续迭代直到散列值有效. 在我们的例子中, 一个有效的散列值至少有四个前导0. 寻找与有效散列值相对应的随机数的过程就是挖矿.

随着难度的增加, 可能的有效散列值数量会减少. 使用较少可能的有效散列, 意味着需要更多的处理能力才能找到有效的散列值.

哈希值为什么如此重要?

这很重要,因为它使区块链不可变.

如果我们有以下区块链A→B→C, 当有人想要更改区块A上的数据, 会发生以下情况:

  1. 区块A上的数据更改
  2. 区块A的哈希值变化, 因为数据用于计算哈希值.
  3. 区块A失效, 因为它的哈希值不再具有四个前导0.
  4. 区块B的哈希值将发生变化,因为区块A的哈希值用来参与计算区块B的哈希值.
  5. 区块B失效, 因为它的哈希值不再具有四个前导0.
  6. 区块C的哈希值将发生改变,因为区块B的哈希值用来参与计算区块C的哈希值.
  7. 区块C变得无效, 因为它的哈希值不再具有四个前导0.

让区块变异的唯一方法是再次挖出该块, 然后再挖掘所有块. 因为新的区块总是被添加, 因此几乎不可能改变区块链.

希望本教程对你有用.

如果你想查看一个该演示的网页版本, 请移步http://blockchaindemo.io

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我编写了一个应用程序来告诉你区块链是如何运作的
    • 安装命令行界面版本
      • 一个区块是什么样的?
        • 起始块(Genesis Block)
      • 当一个新的区块被挖掘时会发生什么?
        • 哈希值是如何计算的?
          • 你是否注意到区块哈希值的四个前导0?
        • 什么是随机数(Nonce)?
          • 哈希值为什么如此重要?
          相关产品与服务
          区块链
          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档