基于区块链的物流信息存储系统
一、介绍:
区块链(不是比特币,请大家辩证看待)是一种数据结构
介绍视频 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,最终产品溯源信息: