草庐IT

C++实现基于区块链的物流信息存储系统

biyezuopinvip 2024-01-17 原文

基于区块链的物流信息存储系统

一、介绍:

区块链(不是比特币,请大家辩证看待)是一种数据结构

介绍视频 1

介绍视频 2

如果有时间,也可系统性学习北大课程:

二、任务:

1~2 人一组(在本文档顶部注明分工)

完成基于区块链的物流信息存储系统(下图为示意图,仅供参考)

参考链接 1

完成本文档后面的项目说明

课程期间全程参加钉钉会议,不定时随机点名共享屏幕讲解进度 12 日 24:00 前将整个项目代码和本文档提交至钉钉群

思考下列开放式问题,形成自己的观点,并写在文档末尾:

是不是万物皆可区块链,区块链到底能用来做什么?

◆ 参考链接 1

区块链能真正做到去中心化吗?

区块链能真正做到不可篡改吗?

更多问题可自行发挥 …

项目说明

功能/特性说明分值备注(请在此备注是否完成,及其他信息)
基础必选
文档内容充实、排版美观5完成
无编译错误,可顺利运行5完成
C++必选
多文件结构10完成
面向对象(类和继承)10完成
设计合理(需在文档中说明)10完成
区块链必选
具备区块链基础功能10完成
对区块链的思考10完成
区块链++可选30
去中心化完成(分布式账本)
数据安全完成(挖矿机制)
不可篡改完成(GHOST 协议)
可溯源完成
轻节点完成
汇报在线做演示和汇报10完成

C++学期

简介

模型说明挖矿机制

GHOST协议主要构成帐户账户状态世界状态物品费区块

轻量级区块

作量证明挖矿挖矿作为安全机制

挖矿作为财富分配机制系统测试思考问题区块链能真正做到去中化吗?区块链是分布式数据库吗?区块链真的不可篡改吗?

三、模型说明

该项本质就是个基于交易的状态机(transaction-based state machine)。在计算机科学中,个状态机是指可以读取系列的输,然后根据这些输,会转换成个新的状态出来的东。该状态机如下:

根据该项的状态机,我们从创世纪状态开始,当交易被执后,这个创世纪状态就会转变成最终状态。在任何时刻,这个最终状态都代表着当前的状态,在项中指针 Bptr永远指向最新的状态。每个状态可能包含数个物流信息。这些信息都被“组团”到个区块中。个区块包含了系列的物流信息,每个区块都与它的前个区块链接起来。

3.1 挖矿机制

为了让个状态转换成下个状态,交易必须是有效的。为了让个交易被认为是有效的,它必须要经过个验证过程,此过程也就是挖矿。挖矿就是组节点它们的计算资源来创建个包含有效交易的区块出来。

任何在络上宣称是矿的节点都可以尝试创建和验证区块。很多矿都在同时间创建和验证区块。每个矿在提交个区块到区块链上的时候都会提供个数学机制的“证明”,这个证明就像个保证:如果这个证明存在,那么这个区块定是有效的。为了让个区块添加到主链上,个矿必须要其他矿更快的提供出这个“证明”。通过矿提供的个数学机制的“证明”来证实每个区块的过程称之为作量证明(proof of work)。

证实了个新区块的矿都会被奖励定价值的奖赏该项使种内在数字代币作为奖赏。每次矿证明了个新区块,那么就会产个新的货币并被奖励给矿。

3.2 GHOST协议

为了保障数据的安全性以及可靠性,本项也采了GHOST协议(Greedy Heaviest Observed Subtree)。简单来说,GHOST协议就是让我们必须选择个在其上完成计算最多的路径。个法确定路径就是使最近个区块的区块号,区块号代表着当前路径上总的区块数。区块号越,路径就会越,就说明越多的挖矿算被消耗在此路径上以达到叶区块。使这种推理就可以允许我们赞同当前状态的权威版本。

3.2.1 主要构成

该项主要有以下的部分组成:

  • 账户(accounts)

  • 状态(state)

  • 费(gas)

  • 交易(transactions)

  • 区块(blocks)

  • 交易执(transaction execution)

  • 挖矿(mining)

  • 作量证明(proof of work)

四、帐户

该项的全局“共享状态”是有很多对象来组成的,这些账户可以通过消息传递架构来与对进交互。其中分为普通帐户和矿,普通帐户只具备交易功能,矿户可以挖矿获得报酬。另外,在普通户中分为全节点户和轻节点户,全节点户是将所有的区块链进存储,轻节点户只将Merkle树的头节点哈希值进存储,为什么只存储哈希值呢?这会在后的部分进详细讲解。

4.1 账户状态

账户状态有三个组成部分,不论账户类型是什么,都存在这三个组成部分:

  • nonce:从此账户地址发送的交易序号。

  • balance: 此地址拥有货币的数量。

  • storageRoot: Merkle树的根节点Hash值。

4.2 世界状态

Merkle Tree(也被叫做Merkle trie)是种由系列节点组成的叉树,这些节点包括:

在树的最底层的包含了源数据的量叶节点系列的中间的节点,这些节点是两个节点的Hash值几个根节点,同样是两个节点的Hash值,代表着整棵树

同样的树结构也来存储交易和物品信息。更具体的说,每个块都保存了三个不同

Merkle树结构的根节点的Hash,包括:

  • 状态树
  • 物品树
  • 交易树

在Merkle树中存储所有信息的效性在轻节点中相当的有。区块链就是群节点来维持的。泛的说,有两种节点类型:全节点和轻节点。

全节点通过下载整条链来进同步,从创世纪块到当前块,执其中包含的所有交易。矿会存储全节点,因为他们在挖矿过程中需要全节点。也有可能下载个全节点不执所有的交易。论如何,个全节点包含了整个链。

不过除个节点需要执所有的交易或轻松访问历史数据,不然没必要保存整条链。这就是轻节点概念的来源。起下载和存储整个链以及执其中所有的交易,轻节点仅仅下载链的头,从创世纪块到当前块的头,不执任何的交易或检索任何相关联的状态。由于轻节点可以访问块的头,头中包含了3个树的Hash,所有轻节点依然可以很容易成和接收关于交易、事件、余额等可验证的答案。

这个可以的通是因为在Merkle树中hash值是向上传播的—如果个恶意户试图个假交易来交换Merkle树底的交易,这个会改变它上节点的hash值,它上节点的值的改变也会导致上上个节点Hash值的改变,以此类推,直到树的根节点。

物品物品的设计结构如下:

户可以创建物品、对物品进加,同时户可以交易该物品到其他户,在该项中每步操作都会被记录到产品信息中,同时会保存在区块链之中,这确保了物品的可溯源性。

五、费用

区块链可以运作的个重要就是每个络执的操作同时也被全节点所影响。然,计算的操是常昂贵的。因此,最好是来执最简单的任务,如运个简单的业务逻辑或者验证签名和其他密码对象,不是于复杂的操作,如件存储,电邮件,或机器学习,这些会给络造成压。施加费防户使络超负荷。

六、区块

所有的交易都被组成个”块”。个区块链包含了系列这样的链在起区块。

在该项中,个区块包含:

区块头

关于包含在此区块中交易集的信息轻量级区块轻节点中只存储了三个Merkle树的哈希值,这样可以缩减存储空间。

七、作量证明挖矿

作量证明(Proof-of-Work)是种对应服务与资源滥、或是拒绝服务攻击的经济对策。

般要求户进些耗时适当的复杂运算,并且答案能被服务快速验算,以此耗的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使。此概念最早由Cynthia Dwork和Moni Naor于1993年的学术论提出,作量证明词则是在1999年由Markus Jakobsson与Ari Juels所发表。现时此技术成为了加密货币的主流共识机制之,如特币所采的技术。

作量证明最常的技术原理是散列函数。由于输散列函数h的任意值n,会对应到一个结果h(n),h(n)只要变动个特,就会引起雪崩效应,所以乎法从h(n)反推回n,因此借由指定查找n的特征,让户进量的穷举运算,就可以达成作量证明。

本项并没有真正的进求解MD5哈希的运算,是使了模拟的法。创建若个数的矿,每个矿都有的算,使随机法,算的矿有更的可能求解出答案。

7.1 挖矿作为安全机制

总的来说,PoW的的就是以加密安全的式证明成的些输出是经过了定量的计算的。因为除了列举所有的可能性,没有更好的其他法来找到个低于要求阈值的nonce。重复应Hash函数的输出均匀分布,所以我们可以确保,在平均值上,找到满要求的nonce所需时间取决于难度阈值。难度系数越,所需时间越。这样的话,PoW算法就给予难度这个概念的意义了:来加强区块链的安全。

我们所说的区块链的安全是什么意思?这常简单:我们想要创造个每个都信任的区块链。如果存在超过1条以上的链,户的信任就会消失,因为他们没有能合理的确认哪条链才是“有效的”。为了让群户接受存储在区块链中的潜在状态,我们需要有群信任的个权威区块链。

这完完全全就是Pow算法所做的事情:它确保特定的区块链直到未来都直保持着权威性,让攻击者创造个新区块来重写某个历史部分(例如清除个交易或者创建个假的交易)或者保持个分叉变得常困难。为了先让他们的区块被验证,攻击者需要总是络上的其他要更快的解决掉nonce问题,这样络就会相信他们的链是最重的链(基于提到的GHOST协议原则)。除攻击者拥有超过半的络挖矿能,要不然这基本上是不可能的。

7.2 挖矿作为财富分配机制

除了提供个安全的区块链,PoW同样也是分配财富给那些为提供这个安全花费

计算的的种法。个矿挖出个区块的时候会获得奖励,包括:

为“获胜”区块提供的静态区块奖励

区块中的交易在区块内所消耗的gas 系统测试创建两个户Jack和Tom:

系统信息:

户Tom创建个物品Book:

户Tom加物品Book,查看产品信息:

户Tom以0.5gas交易产品Jack,交易之后户的信息:

此时的区块信息:

加10个随机矿:

户Jack加产品Book,最终产品溯源信息:

有关C++实现基于区块链的物流信息存储系统的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  7. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐