专栏首页友弟技术工作室通过一个App Demo的演示深入理解区块链运行原理

通过一个App Demo的演示深入理解区块链运行原理

什么是区块链?

从字面上看:区块链是由一个个记录着各种信息的小区块链接起来组成的一个链条,类似于我们将一块块砖头叠起来,而且叠起来后是没办法拆掉的,每个砖头上面还写着各种信息,包括:谁叠的,什么时候叠的,砖头用了什么材质等等,这些信息你也没办法修改。

从计算机上看:区块链是一种比较特殊的分布式数据库。分布式数据库就是将数据信息单独放在每台计算机,且存储的信息的一致的,如果有一两台计算机坏掉了,信息也不会丢失,你还可以在其他计算机上查看到。

区块链是一种分布式的,所以它是没有中心点的,信息存储在所有加入到区块链网络的节点当中,节点的数据是同步的。节点可以是一台服务器,笔记本电脑,手机等。

你要知道的是这些节点的存储的数据都是一模一样。

区块链特性

去中心化:因为它是分布式存储的,所以不存在中心点,也可以说各个节点都是中心点,生活中应用就是不需要第三方系统了(银行、支付宝、房产中介等都属于第三方)。

开放性:区块链的系统数据是公开透明的,每个人都可以参与进来,比如租房子,你可以知道这个房子以前的出租信息,有没出现过问题,当然这里头的一些个人私有信息是加密的。

自治性:区块链采用基于协商一致的规范和协议(比如一套公开透明的算法),然后各个节点就按照这个规范来操作,这样就是所有的东西都有机器完成,就没有人情成分。 使得对"人"的信任改成了对机器的信任,任何人为的干预不起作用。

信息不可篡改:如果信息存储到区块链中就被永久保存,是没办法去改变,至于 51% 攻击,基本不可能实现。

匿名性:区块链上面没有个人的信息,因为这些都是加密的,是一堆数字字母组成的字符串,这样就不会出现你的各种身份证信息、电话号码被倒卖的现象。

区块结构

区块包含两个部分:

1、区块头(Head):记录当前区块的元信息

2、区块体(Body):实际数据

包含数据如下图所示:

image

安装命令行工具

  • 打开终端,输入npm install blockchain-cli -g
 youdi@MacbookPro > ~ > npm install blockchain-cli -g
/usr/local/bin/blockchain -> /usr/local/lib/node_modules/blockchain-cli/main.js
+ blockchain-cli@1.0.5
updated 1 package in 28.438s
  • 终端输入blockchain
 youdi@MacbookPro  ~  blockchain
?  Welcome to Blockchain CLI!

  Commands:

    help [command...]      Provides help for a given command.
    exit                   Exits application.
    blockchain             See the current state of the blockchain.
    mine <data>            Mine a new block. Eg: mine hello!
    open <port>            Open port to accept incoming connections. Eg: open 2727
    connect <host> <port>  Connect to a new peer. Eg: connect localhost 2727
    peers                  Get the list of connected peers.
    discover               Discover new peers from your connected peers.

blockchain →
blockchain →
blockchain →

区块(block)长什么样子?

blockchian ->后面输入blockchain或者bc(简写)查看创始区块结构。

image

  • Index (Block #): 第几个区块? (创世区块链的索引为0)
  • Hash: 当前区块的hash值
  • Previous Hash: 上一个区块的hash值
  • Timestamp:当前区块创建时的时间戳
  • Data: 存储在当前区块上的交易信息
  • Nonce: 在找到有效区块之前,我们经历的迭代次数

创世区块(Genesis Block)

每个区块链都是由一个创始区块「? Genesis Block」开始。后面你所看到的区块都依赖于上一个区块。因此,创始区块是我们挖取第一个区块的基础。

当一个区块挖矿时都发生了什么?

我们在blockchain →中输入`mine youdi,挖取我们的第一个区块。

image

  • Index: o+1 = 1
  • Previous Hash: 0000018035a828da0…
  • Timestamp: 这个区块创建的时间
  • Data:youdi
  • Hash: 00006c10b10baee43
  • Nonce: 22269

Hash是怎么计算的?

Hash值是一个十六进制固定长度为64位的唯一的标识。

hash值是由index, previous block hash, timestamp, block data, 和 nonce 作为输入数据计算而得。

CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)

The SHA256 algorithm will calculate a unique hash, given those inputs. The same inputs will always return the same hash.

SHA256算法将根据给出的输入数据计算出一个唯一的hash值,只要输入值不变,永远返回相同的结果。 [图片上传失败...(image-4bbdb0-1527433012786)] http://p3ipoi9q3.bkt.clouddn.com/2018-05-22-2018-05-22%2023.13.31.gif 输入数据为youdi时,它的hash值永远为2e4f702517a39db2c3614921b136d05b0bde291b0c5720cc899f6091668599fd

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

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

下面的方法验证hash难度是否有效。

function isValidHashDifficulty(hash, difficulty) {
  for (var i = 0, b = hash.length; i < b; i ++) {
      if (hash[i] !== '0') {
          break;
      }
  }
  return i >= difficulty;
}

import hashlib

"""
工作量证明
"""


class ProofofWork():
    """
    pow
    """

    def __init__(self, block):
        self.block = block

    def mine(self):
        """
        挖矿函数
        :return:
        """
        i = 0
        prefix = '0000'

        while True:
            nonce = str(i)
            message = hashlib.sha256()
            message.update(str(self.block.data).encode('utf-8'))
            message.update(nonce.encode("utf-8"))
            digest = message.hexdigest()
            if digest.startswith(prefix):
                return nonce, digest
            i += 1

这就是我们所熟知的POW工作量证明系统 - Proof-of-Work system

什么是nonce

nonce是一个用来找到满足条件的hash值的数字。

[图片上传失败...(image-77a54f-1527433012786)] http://p3ipoi9q3.bkt.clouddn.com/2018-05-22-2018-05-22%2023.17.04.gif

let nonce = 0;
let hash;
let input;
while(!isValidHashDifficulty(hash)) {     
  nonce = nonce + 1;
  input = index + previousHash + timestamp + data + nonce;
  hash = CryptoJS.SHA256(input)
}

nonce值一直迭代,直到hash值有效为止。在我们案例中一个有效的hash值是最少有4个前导0。找到nonce值以满足合适条件的hash值的过程就叫做挖矿。

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

Hash为什么如此重要?

hash散列很重要是因为它可以使区块链不能被改变。

如果我们有三个区块链1 -> 2 -> 3 -> 4 -> 5,当某个人想要试图修改区块A时,下面几点将是会发生的几种情况。 [图片上传失败...(image-ded8b8-1527433012786)] http://p3ipoi9q3.bkt.clouddn.com/2018-05-22-2018-05-22%2023.17.04.gif

  • 区块3上的区块链被修改。
  • 区块3上的hash值将发生改变,因为hash值是通过数据计算而得。
  • 区块3变得无效,因为它的hash值不再具备4个前导0的条件。
  • 区块4的hash值将发生改变,因为区块3的hash值用来参与计算区块4的hash值。
  • 区块4变得无效,因为它的hash值不再具备4个前导0的条件。
  • 区块5的hash值将发生改变,因为区块4的hash值用来参与计算区块5的hash值。
  • 区块5变得无效,因为它的hash值不再具备4个前导0的条件。

如果想要无效的区块3、4、5变得有效,必须从区块3开始再一次重新依次挖矿,当你的区块链足够长,节点足够多时,就算你将这条链上的区块链改变并且重新挖矿成功,但是因为超过50%的节点的数据和你的节点的数据不一致,你这个被改变的节点的数据也依然无效。 [图片上传失败...(image-6a1484-1527433012786)]

http://p3ipoi9q3.bkt.clouddn.com/2018-05-22-2018-05-22%2023.17.53.gif这个demo的演示中,一共有三个节点,我修改了节点2的区块链3并且重新挖矿取得合法的hash值,但是因为节点B节点C中区块3的hash值和A的不同,所以,我为了改变数据,必须超过51%的节点,这样会消耗很多的资源,从而保证数据的安全,分布式保证数据的安全可靠。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 通过一个App Demo的演示深入理解区块链运行原理

    从字面上看:区块链是由一个个记录着各种信息的小区块链接起来组成的一个链条,类似于我们将一块块砖头叠起来,而且叠起来后是没办法拆掉的,每个砖头上面还写着各种信息,...

    若与
  • 区块链 价值互联网的基石

    这是我很久之前看的一本书,对区块链的概念解释简单易懂,适合入门, 好久没有写区块链的开发,所以现在重拾起。这本书也推荐给想要入门的朋友。

    若与
  • 区块链比特币入门详解

    比特币和区块链技术的发展非常迅速,即使那些没有听说过加密货币或了解其工作的人也在寻求投资和探索这个领域。区块链技术和加密货币今天已经成为人们开始执行标准交易的平...

    若与
  • 通过一个App Demo的演示深入理解区块链运行原理

    从字面上看:区块链是由一个个记录着各种信息的小区块链接起来组成的一个链条,类似于我们将一块块砖头叠起来,而且叠起来后是没办法拆掉的,每个砖头上面还写着各种信息,...

    若与
  • 迪拜启动区块链战略

    GSI按 迪拜于2016年启动了城市区块链战略,2017年开始试点。其目标是通过探索利用区块链技术在政府服务上的应用,到2020年将所有政务服务实现在线提供,改...

    企鹅号小编
  • Facebook借稳定币取代美元?比特大陆8000万美元的矿机已就位;深圳千余家企业接入区块链发票 | 一分钟链圈

    据CCN消息,Vitalik Buterin表示,考虑到以太坊引导协议通过的问题,目前的以太坊治理模型工作得相当好。但他认为以太坊的治理在这一点上被低估了。此外...

    区块链大本营
  • 比特币造富神话倒塌 脱去虚拟经济外衣的区块链迎3.0时代

    网上最近有个段子:“我有个币圈的朋友,去年和我聊买二环(北京)哪个楼盘。今天我们晚饭的时候偶然相遇,他对我说:您好,这是您的外卖……”

    KuPay
  • 1分钟链圈 | 越来越多律师接受加密货币付费,称“没有选择余地”;日本将在3月份推出虚拟货币自动兑换机,方便虚拟货币兑换成日元

    区块链大本营
  • 从数字货币辨别区块链游戏,诈骗防不胜防

    提到挖矿类游戏,在区块链火热的当下,轻而易举地想到区块链游戏。现阶段,区块链挖矿游戏已经泛滥,游戏产品有元链星系、宝石星球,等等。但随着Steam游戏平台上...

    陌上花开2018
  • 银行只是开始:区块链技术将改变这20个产业

    银行和支付并不是区块链技术改变的唯一行业,网络安全,音乐和汽车等行业也将被区块链改变。 ? 比特币作为一种去中心化的数字货币,其发展的重要基础在于区块链技术,...

    点滴科技资讯

扫码关注云+社区

领取腾讯云代金券