0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【大神课堂】关于区块链发展及数字构架的深入了解

lviY_AI_shequ 来源:未知 作者:steve 2018-04-19 15:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在前面区块链的架构部分介绍过区块链的产生过程,如下图

【大神课堂】关于区块链发展及数字构架的深入了解

简单来说,区块链就是把(加密)数据存入区块中,经“挖矿”加入整个链条,生成的永久、不可逆向修改的记录。在本节中,将从代码的角度深入理解这一过程。实践是最好的老师,下面将动手实现一个简单的区块链。

为方便讲解区块链基础,在下面开始用Python实现一个简化版的区块链。区块的数据结构包含下面几个字段:

identifier: 一个唯一的字符串作为标示

previous_hash: 前一个区块的哈希值

data:区块中的数据

nonce:随机数,用来找到正确的哈希值

其中identifier这个唯一的字符串可以用python的uuid库uuid4()生成。previous_hash是在接入区块链的时候赋值。data是区块中写入的任意数据。比较特别的是nonce,它有什么用呢?它的作用很简单,用来找到正确哈希值。

至于为什么要找正确的哈希值,就要讲到区块的有效性。由上图中可以看到,区块链中的区块不是新生成就完成,而是需要通过“挖矿”这一步骤才可以。简单来说,挖矿的本质就是找到一个合适的nonce值使得区块的哈希值有效。

【大神课堂】关于区块链发展及数字构架的深入了解

挖矿

哈希值是通过哈希算法计算得到的一段二进制值,不同的数据得到不同的哈希值。

In[1]:

# 这里举个简单的例子# 导入相关类库import hashlib# 定义数据data = "Hello World"# 计算哈希值msg = hashlib.sha256()msg.update(data.encode('utf-8')) # 主要计算前必须将数据转成utf-8msg.hexdigest()

Out[1]:

'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'

上面就一个哈希值,如果修改数据,比如添加一个nonce值就可以产生不同的哈希值

In[2]:

nonce = 0msg = hashlib.sha256()msg.update(data.encode('utf-8'))msg.update(str(nonce).encode("utf-8"))msg.hexdigest()

Out[2]:

'1370eeaaba7a6c7a234b1f82cc3b6d013a0088fd5e16408300f05b28b0015463'

在区块链中区块的哈希值必须满足一定条件才能算是有效的区块。这里设定区块的哈希值必须以0000开头才是有效的区块。为了得到以0000开头的哈希值,需要不断的修改nonce(挖矿)直到满足条件。下面定义一个函数来寻找该nonce值。

In[3]:

def mine(data): nonce = 0 # nonce初始值为0 # 寻找正确的哈希值 while True: msg = hashlib.sha256() msg.update(data.encode("utf-8")) msg.update(str(nonce).encode("utf-8")) hash_code = msg.hexdigest() # 如果满足条件,打印相应值并退出循环 if hash_code.startswith("0000"): print("nonce:{}".format(nonce)) print("hash:{}".format(hash_code)) break # 否则继续寻找 else: nonce += 1

In[4]:

mine("Hello, World")
nonce:104803hash:000022635160d3ae1c8c90261e0df5eb6538d7f6d42108d6ffdec17b585fb464

【大神课堂】关于区块链发展及数字构架的深入了解

上面只是用data和nonce来计算哈希值,实际区块链中还会包含其他字段。下面定义一个区块的数据结构。

实现区块结构

In[83]:

# block.pyimport hashlibimport uuidclass Block(object): def __init__(self, data=None, previous=None): self.identifier = uuid.uuid4().hex # 产生唯一标示 self.previous = previous # 父节点 if previous: self.previous_hash = previous.hash() # 父节点哈希值 else: self.previous_hash = None self.data = data # 区块内容 self.nonce = 0 # nonce值 def hash(self): ''' 计算区块的哈希值,包括区块的标示、数据、前一区块的哈希值和nonce值 ''' message = hashlib.sha256() message.update(self.identifier.encode('utf-8')) message.update(str(self.nonce).encode('utf-8')) message.update(str(self.data).encode('utf-8')) if self.previous: message.update(str(self.previous_hash.encode('utf-8'))) return message.hexdigest() def refresh_hash(self): if self.previous: self.previous_hash = previous.hash() # 父节点哈希值 else: self.previous_hash = None def mine(self): ''' 挖矿函数 ''' # 初始化nonce为0 cur_nonce = self.nonce or 0 # 循环直到生成一个有效的哈希值 while True: if self.hash_is_valid(): # 如果生成的哈希值有效 break # 退出 else: self.nonce += 1 # 若当前哈希值无效,更新nonce值,进行加1操作 def hash_is_valid(self): ''' 校验区块哈希值有否有效 ''' return self.hash().startswith('0000') def __repr__(self): return 'Block'.format(self.identifier)

以上就是一个区块结构,这里的区块包含一个唯一标识符、父节点的哈希值、nonce值和该区块的内容字段。其中定义一个mine函数用了寻找合适的nonce值。另外定义了一个hash_is_valid函数用来判断这个是否以0000开头,即是否有效。下面对这个区块结构进行初始化。

In[84]:

# 创建一个内容为hello world的内容块block = Block('Hello, World')

In[85]:

# 区块链的有效性block.hash_is_valid()

Out[85]:

False

In[86]:

# 挖矿,循环直至找到合适的nonceblock.mine()

In[87]:

# 再次检查区块的有效性block.hash_is_valid()

Out[87]:

True

至此,第一个有效的区块生成完成,下面开始实现区块链。

实现区块链结构

In[88]:

class BlockChain(object): def __init__(self): self.head = None # 指向最新的一个区块 self.blocks = {} # 包含所有区块的一个字典 ''' 添加区块函数 ''' def add_block(self, new_block): new_block.previous = new_block.previous new_block.mine() self.blocks[new_block.identifier] = block self.head = new_block def __repr__(self): num_existing_blocks = len(self.blocks) return 'Blockchain<{} Blocks, Head: {}>'.format( num_existing_blocks, self.head.identifier if self.head else None )

定义好区块链结构后,下面就开始初始化一条区块链。

In[89]:

# 初始化chain = BlockChain()# 打印chain

Out[89]:

Blockchain<0 Blocks, Head: None>

In[90]:

# 添加区块chain.add_block(block)# 打印chain

Out[90]:

Blockchain<1 Blocks, Head: 1294d073adf5476db720d7b2e752d62b>

In[91]:

# 添加更多的区块for i in range(6): new_block = Block(i) chain.add_block(new_block) # 打印chain

Out[91]:

Blockchain<7 Blocks, Head: 7f8291bedac845af8637112136c41fd3>

In[92]:

for i,v in chain.blocks.items(): if v.hash_is_valid(): print("{} is valid".format(k)) else: print("\033[0;31m{} is invalid\033[0m")a70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valid

以上就是一个简单区块链,可以看到当前的区块都是有效的。但是,值的注意的是,每个区块包括前一个区块的哈希值,所以,当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块。

In[93]:

# 比如改变第一个区块的内容block.data = "Modify Data"block.hash_is_valid()

Out[93]:

False

【大神课堂】关于区块链发展及数字构架的深入了解

这将使这个区块哈希值改变并导致区块无效,并且,这个修改将影响之后的区块,因为之后的区块中的previous_hash依赖于前面的区块。改变如下:

In[95]:

for k,v in chain.blocks.items(): # 更新区块 v.refresh_hash() if v.hash_is_valid(): print("{} is valid".format(k)) else: print("\033[0;31m{} is invalid\033[0m".format(k))b41171e618334412871495fb6d6f1a28 is invalid1294d073adf5476db720d7b2e752d62b is invalid97dd4e3905584c18ab2028c92b3afaad is invalid02cb150841d6420ead9388d0ecfa3eef is invalid7f8291bedac845af8637112136c41fd3 is invalid2cfe78eac1db48f099a10ea968d468dd is invalid2119e357b03442e1bbc12f355ffdf00c is invalid

可以看到由于前面区块的改变导致之后的区块也无效了。

【大神课堂】关于区块链发展及数字构架的深入了解

以上模拟了单个用户的区块链操作,在实际过程中挖矿和校验的行为由区块链中其他用户进行的,并根据挖矿产生的劳动得到对应的报酬。这样就保证了单个用户无法修改区块链中的数据。并且这个过程是通过加密算法进行的,这就实现了区块链的去信任。

【大神课堂】关于区块链发展及数字构架的深入了解


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 区块链技术
    +关注

    关注

    5

    文章

    676

    浏览量

    15087

原文标题:从零开始学区块链(3)--深入浅出区块链(四)--区块链基础

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    网络接口:数字世界的“门铃”,你了解多少?

    ;淮安移动则在某科技园区采用了FTTO(光纤到桌面)技术,使工作人员能使用高达1Gbps的专属带宽。 结语 网络接口虽小,却是连接数字世界的桥梁。了解网络接口的基础知识,不仅能帮助我们更好地使用网络设备
    发表于 11-26 18:53

    深入了解X-ray自动设备的核心优势与应用领域

    。面对复杂多变的工业环境和严格的品质标准,企业如何借助自动化X射线检测设备优化生产流程、提升检测准确度?本文将围绕X-ray自动设备的核心优势与应用领域展开详尽解读,帮助您深入了解该技术带来的变革与价值。无论您是工厂质量管
    的头像 发表于 11-04 14:34 127次阅读

    深入了解API:详解应用程序接口的作用和原理

    都是不可或缺的组成部分。本文将深入探讨API的作用和原理,帮助读者更好地理解和应用API。 淘宝/天猫获得淘宝商品详情 API 返回值说明 公共参数 ​​前往测试​​ 名称 类型 必须 描述 key
    的头像 发表于 11-03 09:37 158次阅读

    深入了解水质探头的工作原理与应用

    随着环保意识的不断增强和水资源管理需求的提升,水质监测成为各行业关注的焦点。特别是在工业生产、污水处理和饮用水安全领域,精准、实时的水质探测技术得到了快速发展。水质探头作为关键监测设备,因其高效
    的头像 发表于 10-23 14:00 186次阅读

    深入了解连接器的分类与应用

    一、连接器的基本概念 连接器,就是一种电气或者光学的零组件,能让两条或者好几条电路、光路连一块。它一般是由插头和插座组成的,能让设备之间很快地连上、断开,再连上。这连接器怎么设计、有什么功能,主要得看使的地方、要传的信号是什么样的,还有一些物理特性,像阻抗啊、频率啊、耐用不耐用等。 二、连接器 的 分类 连接器能按照不一样的标准分成好多种,咱下面就说说几个主要的分法: 1. 按结构形式分 插头连接器:这就是设计成
    的头像 发表于 08-25 08:50 463次阅读

    全球南方数字经济与绿色发展转型研修代表团参访智行者科技

    的骨干力量。此次访问旨在深入了解中国在数字经济核心领域——无人驾驶技术方面的前沿突破与创新应用,特别是其在提升公共安全、优化生活服务和推动绿色智能出行方面的落地成果。
    的头像 发表于 08-18 17:52 952次阅读

    如何为不同的电机选择合适的驱动芯片?纳芯微带你深入了解

    在现代生活中,电机广泛使用在家电产品、汽车电子、工业控制等众多应用领域,每一个电机的运转都离不开合适的驱动芯片。纳芯微提供丰富的电机驱动产品选择,本期技术分享将重点介绍常见电机种类与感性负载应用,帮助大家更深入了解如何选择合适的电机驱动芯片。
    的头像 发表于 07-17 14:00 1611次阅读
    如何为不同的电机选择合适的驱动芯片?纳芯微带你<b class='flag-5'>深入了解</b>!

    深入了解恩智浦S32E2域控制器

    恩智浦S32E2域控制器采用16nm工艺和多核异构架构,提供强劲算力,支持丰富的车载通信协议、硬件虚拟化和分区隔离,兼具高性能与安全性,是理想的汽车域控制方案。立功科技推出了S32E2评估板,为动力域控方案评估和开发提供有力支撑。
    的头像 发表于 07-15 11:11 2017次阅读
    <b class='flag-5'>深入了解</b>恩智浦S32E2域控制器

    泰克科技全路测试解决方案助力人形机器人发展

    在刚刚举办的人形机器人科技创新大会中,泰克科技(Tektronix)作为测试、测量和监测解决方案的创新者,展示了其全路测试解决方案,为与会者提供了深入了解其在人形机器人研发领域的最新进展和创新技术的机会。
    的头像 发表于 05-21 14:56 969次阅读

    深入了解气密性芯片封装,揭秘其背后的高科技

    在半导体技术日新月异的今天,芯片封装作为连接设计与制造的桥梁,其重要性日益凸显。而气密性芯片封装,作为封装技术中的一种高端形式,更是因其能够有效隔绝外界环境对芯片的干扰和损害,保障芯片性能与可靠性,而备受业界关注。本文将深入探讨气密性芯片封装的技术原理、应用场景、挑战与未来发展
    的头像 发表于 03-28 11:43 1292次阅读
    <b class='flag-5'>深入了解</b>气密性芯片封装,揭秘其背后的高科技

    深入了解U8g2与LVGL图形库

    在单片机开发领域,图形显示功能变得越来越重要。无论是工业控制界面、智能家居设备,还是手持仪器仪表,都需要一个高效且易用的图形库来实现丰富的可视化效果。U8g2 和 LVGL 就是其中两款备受关注的图形库,它们各有特点,适用于不同的应用场景。今天,我们就来深入了解这两个图形库。
    的头像 发表于 02-13 11:01 3492次阅读

    科普小课堂:噪声是什么,你“噪”吗?

    噪声是什么?纳祥科技科普小课堂Hey,各位音频发烧友们当我们沉醉于视听世界里震撼的音效时又是否深入了解过噪声是什么今天,让我们一起揭开噪声的神秘面纱探寻音频世界的无穷魅力!在音频世界里,噪声的简单
    的头像 发表于 02-05 17:29 2042次阅读
    科普小<b class='flag-5'>课堂</b>:噪声是什么,你“噪”吗?

    深入了解 PCB 制造技术:铣削

    了 PCB 铣削的复杂性、铣削工艺、其优势、挑战和应用。 了解 PCB 铣削 PCB 铣削涉及从覆铜板上机械去除材料,以创建电气隔离并形成电路图案。与使用化学溶液溶解不需要的铜的传统蚀刻方法不同,铣削使用精确控制的铣削钻头来物理雕刻出所需的痕迹。该过程通
    的头像 发表于 01-26 21:25 1113次阅读
    <b class='flag-5'>深入了解</b> PCB 制造技术:铣削

    深入了解涡街流量计 原理及内部构造

    涡街流量计是一种常用的流量测量仪表,LUB系列涡街流量计的内部构造与原理密切相关,共同构成了其高精度、宽量程比和稳定运行的基础。本文将深入介绍涡街流量计的原理及内部构造,以便更好地了解涡街流量计
    的头像 发表于 01-06 15:17 1710次阅读

    如何为不同的电机选择合适的驱动芯片?纳芯微带你深入了解

    在现代生活中,电机广泛使用在家电产品、汽车电子、工业控制等众多应用领域,每一个电机的运转都离不开合适的驱动芯片。纳芯微提供丰富的电机驱动产品选择,本期技术分享将重点介绍常见电机种类与感性负载应用,帮助大家更深入了解如何选择合适的电机驱动芯片。
    的头像 发表于 12-23 09:58 1760次阅读
    如何为不同的电机选择合适的驱动芯片?纳芯微带你<b class='flag-5'>深入了解</b>!