IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> WDK学习笔记第四周_区块链总体简述 -> 正文阅读

[区块链]WDK学习笔记第四周_区块链总体简述

摘要

区块链是一个单向链式存储结构,区块中存储了前一个区块的hash值,交易数据等,区块间通过区块中存储的“前一个区块的hash值”连接,当链中某个区块数据被删除或者修改,其hash值改变,随后区块无法再通过之前的hash值与之连接,区块链就会断掉。所以区块链中的数据是可以做到不可篡改,永久追溯的。比特币根据这一思路,将所有区块链分布式存储在各个节点中,并在其基础上引如了工作量证明机智和共识协议,工作量证明机制使得篡改数据要大量算力消耗大量成本,共识机制使得攻击者算力只有大于诚信节点算力时,才可能攻击成功。两者结合使得其中存储数据是非常安全可靠的。但比特币由于其脚本语言的限制,不具备图灵完整性,在其上面扩展有一定局限性。于是发展出了以太坊,以太坊的采用的脚本语言具有图灵完整性,在设计时就将其作为一个开发平台,开发者可以在此基础上创建任意的基于共识的、可扩展的、标准化的、特性完备的、易于开发的和协同的应用。同时以太坊改善了工作量证明机制,降低了算力对挖矿的影响,防止大矿池导致的中心化。但是在比特币和以太坊中,存储的数据人人都可查询,数据没有隐私,不适合企业开发,为了解决该问题,出现了超级账本,超级账本引入了联盟链的概念,不属于联盟链的成员无法访问链中的数据或者访问数据有限,从而保证了数据的隐私性,为了降低维护成本,取消了挖矿机制(工作量证明机制),用背书策略和改善的共识协议产生新块。


一、区块链简述

如下图,区块链是一个链式的存储结构,区块链是由区块首尾相连形成的单向链式结构,区块是链式存储结构中的最小单元,其中第一个区块称为创始区块。区块又分为区块头和区块体,其中:

  1. 区块头记录了区块头版本号(Version)、上一个区块的Hash值(PrevHash)、该区块所有交易数据的Hash值(MerkleRoot)、该区块生成的时间(Timestamp)等。
  2. 区块体中存储着交易数据。

在这里插入图片描述

二、比特币简述

2.1 比特币的安全性

比特币是通过区块链技术实现的电子现金系统,它是完全去中心化的,就算交易信道和交易节点不可信的情况下,仍能保证交易的安全性。这是怎么做的的呢?
我们知道在区块链中,若其中某个区块中数据被篡改,那么该区块hash值就会发生变化,就无法通过hash值和下一个区块相连,区块链就会断掉。所以我们可能会以此觉得区块链中的数据是不可篡改的,但是这并不是真正的不可篡改,因为攻击者可以更新后面所有区块中的“上一个区块的Hash值(PrevHash)”使得区块链再次连接起来,为了解决这个问题,中本聪引入了工作量证明机制与共识机制:

  1. 工作量证明机制:在区块头中加入一个工作量证明机制的可变数(nonce),每生成一个新区块时,要求其hash值要满足特定要求(难度与全网当前算力有关),如要求其hash值以“0000”开头,通过暴力穷举nonce使得新区块的hash值满足要求。
  2. 共识机制:最先找到该nonce的节点就成为该区块的记账人,它需要将它找到的可变数广播给其他节点,当有一半以上的节点确认其没问题,它才可在区块链上创建该区块,其他节点也跟随它在自己的链上创建该区块(在比特币系统中每个节点都有一条完整的区块链)。

于是,若某个攻击者要篡改区块链中间某个区块的数据,它需要将该区块及后面所有区块的工作量全做一遍,该代价是巨大的,在没有巨大算力突破下也是不可能的。为了防止被攻击,中本聪还引入了奖励机制,在创建新区块时,最先找到nonce值的记账人可以获得50比特币的奖励(奖励从2008年起每四年减少一半),这就使得维护区块链的收益远远大于攻击区块链的收益,实现了真正点对点的安全。可以发现,和传统的数据库相比,区块链存储数据的效率很低(大约10分钟一次),但其正是用数据的存储效率换来了数据的安全。

2.2 带工作量证明的区块链实践

用python简单实现带工作量证明的区块链:

import time
import hashlib

class Proofofwork: #工作量证明函数
    def __init__(self, block):
        self.block = block
    
    def mine(self):
        i = 0
        prefix = "00000"
        while True:
            random = str(i)
            obj = hashlib.sha256()
            obj.update(self.block.data.encode('utf-8'))
            obj.update(random.encode('utf-8'))
            digest = obj.hexdigest()
            if digest.startswith(prefix):
                return random,digest
            i += 1

class Block:
    def __init__(self, data, pre_hash):
        self.pre_hash = pre_hash
        self.data = data
        self.time = time.strftime("%Y-%m-%d-%H-%M_%S", time.localtime())
        self.random = 0
        
    @property
    def hash(self):
#         obj = hashlib.sha256()
#         obj.update(self.data.encode('utf-8'))
#         obj.update(self.random.encode('utf-8'))
        proof = Proofofwork(self)
        self.random, digest = proof.mine()
        return digest
    
# def gethash(data):   
#         obj = hashlib.sha256()
#         obj.update(str(data).encode('utf-8'))
#         return obj.hexdigest()

def orblock(data): #初始块的创建
#     block = Block(data, pre_hash="")
#     proof = Proofofwork(block)
    
    return Block(data, pre_hash="")

class add_block: #新增块的函数
    def __init__(self):
        self.block = [orblock("Number one Bloce")]
    
    def add(self, data):
        pre_block = self.block[ len(self.block)-1 ]
        new_block = Block(data, pre_block.hash)
        self.block.append(new_block)
        return new_block
    
bc = add_block()    


while True:
    for n,i in enumerate(bc.block):
        print(n)
        print("pre_hash:{0}".format(bc.block[n].pre_hash))
        print("data: {}".format(bc.block[n].data))
        print("hash: {}".format(bc.block[n].hash))
        print("time: {}".format(bc.block[n].time))
        if(bc.block[n].pre_hash and bc.block[n].pre_hash != bc.block[n-1].hash):
            print("InValid Block")
    #         print("\n i.hash:{}".format(i.pre_hash))
    #         print("上一个的hash:{} \n".format(bc.block[n-1].hash))
        else:
            print("Valid Block")
        print("\n")
        bc.add(input("请输入要加入新区块中的数据: "))

输出结果:
在这里插入图片描述

三、以太坊简述

比特币使用了一套基于堆栈的脚本语言,这语言虽然具有一定灵活性,使得像多重签名这样的功能得以实现,然而却不足以构建更高级的应用。
为了解决比特币扩展性不足的问题,创建了以太坊。以太坊不单单是电子货币交易系统,它是一个平台,提供各种模块来让用户搭建应用,开发者可以在此基础上创建任意的基于共识的、可扩展的、标准化的、特性完备的、易于开发的和协同的应用。因为以太坊内部数据是以区块链方式存储的,所以我们创建的系统中的数据也是不可篡改,可追溯的。与比特币相比:

  1. 以太坊平台对底层区块链进行了封装,让区块链开发着可以直面上层应用进行开发,大大降低了开发难度。
  2. 以太坊采用的是账户模型,不再使用UTXO,每笔交易只有一个输入,一个输出,一个签名。
  3. 以太坊采用改进POW,避免了能耗问题。
  4. 引入了图灵完备的智能合约开发语言。

智能合约是在区块链上保存的代码,一旦保存不可撤销不可更改。智能合约部署成功后会返回一个地址,可以通过该地址访问智能合约。

四、超级账本简述

比特币和以太坊都是公链,所有人都可参与,所有人都可查阅,数据是公开透明的,数据的隐私得不到保证。超级账本就是为了解决该问题的。
超级账本是针对企业级用户进行开发的,它引入了联盟链的概念,不在许可中的用户无法访问链中的区块从而保证了数据的隐私性,为了提高数据的存储效率,它取消了交易量证明机制,采用了背书策略改善了共识系统,创建新区块不需要消耗大量算力,降低了维护成本。

总结

区块链中数据可以通过工作量证明机制,共识协议,数据分布式存储等方法,使其变的基本上不可篡改,且可永久追溯。在某些应用领域具有天然的优势。若想要做数据安全性高的系统开发,我们可在以太坊和超级账本的平台上进行开发,但在以坊公网中,部署智能合约及发送交易时需要支付一定以太币(目前约2万一枚)作为工资给矿工,成本高。所以最好的是用超级账本进行开发,其成本低,参与成员越多,通道越多,安全性越高。

参考

部署以太坊智能合约-初级篇(1).
以太坊白皮书(中文版).
以太坊白皮书解读.
超级账本(中文版).

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:30:16  更:2021-10-12 23:30:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:40:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码