第一章问答题
区块链是通过哪些机制实现信任的?
答:区块链是通过
块链式数据结构
来验证和存储数据
,利用分布式节点共识算法
来生成和更新数据
,使用密码学
的方式来保证数据传输和访问的安全性
,利用自动化脚本代码组成的智能合约
来编程和操作数据
实现信任的。- 块链式数据结构
=>
验证和存储数据 - 分布式节点共识算法
=>
生成和更新数据 - 密码学
=>
保证数据传输和访问的安全性 - 自动化脚本代码组成的智能合约
=>
编程和操作数据
- 块链式数据结构
区块链为什么能够保证链上数据的不可篡改
答:这是因为构成区块链的核心技术中的哈希函数具有
单向性
、抗碰撞性
、可验证性
等特点。单向性:它是指已知道函数的输入x,容易求出其输出
H(x)
,反之,如果已经知道输出H(x)
,要求出x在计算上是不可行的抗碰撞性:想要找到
输出相同的两个不同输入
是非常困难的可验证性:它是指杂凑函数非常灵敏,如果输入发生一点变化,那么其输出都会发生明显的变化。
以上性质决定了:如果修改了某个区块中的内容,那么其哈希值就会发生变化,而哈希值包含在子区块的区块头部,因此该子区块的值也会发生变化,以此类推,从修改的区块开始,区块链的后续所有区块都会有所变化。
区块链的主要特点有哪些?
- 对等性:整个区块链网络采用无中心或者弱中心的架构,采用分布式存储、传输、验证等方式
- 开放性:在去中心的区块链系统中(常见于共有链),节点可以随时加入和退出区块链,系统具有最大限度的开放性,在私有链和联盟链中,其开放性体现了节点之间的数据共享
- 可信性:区块链的可信性是由共识、杂凑、非对称密码几乎是、分布式记账等多重技术配合的结果
- 可靠性:使用分布式高冗余的架构保证数据安全和可靠性,以增加系统存储空间和通信复杂度为代价
- 功能性:智能合约的可编程性为上层应用提供灵活的开发空间,开源的区块链系统使其为各种应用提供适合的功能
- 匿名性:公钥作为用户地址在一定程度上保护了用户的隐私,但是并不完全
以太坊的燃料有什么作用?
答:
为了防止出现无限循环等故障,任何代码的运行都需要进行计费
,计费机制以燃料Gas
为单位,每执行一条合约指令就会消耗固定的燃料。例如创建智能合约,调用消息,访问账户数据等,虚拟机上的所有运行操作都会花费一定的燃料。燃料可以控制合约代码指令执行的上限
。燃料会有价格,GasPrice
是运行每一步需要支付矿工的费用,用以太币计费。每笔交易运行前会对执行代码所引发的计算步骤
(包括初始消息和所有执行中引发的消息)
用StartGas做出限制。StartGas
是整个交易中所使用的最大燃料量。StartGas*GasPrice
得到的值就是交易方法需要预先支付的以太币。
第二章&第三章问答题
在区块链中,哪些环节使用了非对称算法
在区块链系统中,使用非对称加密算法用于用户表示
、操作权限检验
、数字资产地址的生成
、资产所有权的标识
和数字资产的流转
等诸多功能。
在非对称加密算法中,公钥和私钥都需要保密吗?为什么?
非对称加密算法中有公钥和私钥两种密钥,公钥是公开的,不需要保密而且他人可获取,私钥一般通过随机数算法生成模,由个人持有,是必须妥善保管和注意保密,公钥和私钥是成对出现的,也就是每个公钥对应于一个私钥,如果用其中一个密钥对数据进行加密,则只有对应的密钥才能解密,反之亦然。
简述用
Merkle
数进行区块链交易验证的过程以及由此带来的好处
交易验证的过程
Merkle
树通过生成整个交易集的数字制指纹来存储块中的所有交易,允许用户验证交易是否包含在块中,通过重复计算节点的散列对来创建Merkle
树,直到只剩下一个散列,该散列被称为Merkle Root
或者Root Hash
。Merkle
被采用自上而下的方式进行构建,每个叶子节点都是事务数据的散列,非叶子节点的散列是其先前散列的散列,Merkle
树是二进制的,因此它需要偶数个事务, 如果存在奇数个事务,那么最后一个哈希被复制一次,以创建偶数个叶子节点
由此带来的好处
有了Merkel
树,一个节点能够只下载区块头,然后通过从一个满节点回溯一条小的Merkle
路径就能够认证一笔交易的存在,而不需要存储或者传输大量区块链中大多数内容,这种不需要维护一条完整区块链的节点有被称为简单支付验证节点。不保存所有交易也不会下载整个区块,而是仅仅保存区块头,使用认证连接或者Merkle
路径验证交易存在于区块中。
简述P2P网络中基于泛洪的资源搜索过程
- 生成一个查询请求,包含查询的文件名或者关键字,查询将该请求发送给与自己直接相连的节点
- 收到请求的节点检查自己的存储空间是否有请求的文件,如果发现文件则响应请求与查询节点建立连接,否则将该查询转发给自己邻居节点
- 每个收到查询到的节点重复这个过程,直到找到文件为止。
第四章问答题
简述比特币的PoW机制中的难题计算方式以及如何进行难度调整的
难题计算方式:
- 生成
coinbase
交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree
算法生成Merkle Root Hash
- 把
Merkle Root Hash
及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入 - 不停变更区块头中的随机数的值,并对每次变更后的区块头做双重
SHA-256
运算,将结果值和当前网络的目标值比较,如果小于目标值,那么解题成功,工作量证明完成
难度的调整是在每个完整节点中独立自动发生的,每2016个区块,所有节点都会按照统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长期望时长是20160分钟
,也就是两种的时间,是按照每10分钟出一个区块的产生速率计算出来到的总时长得出的。根据实际时长与期望时长的比值进行调整。
新难度值= 旧难度值*(过去2016个区块花费总时长/20160分钟)得出的。
概述PBFT的主要工作流程并简要分析为为什么PBFT的扩展性不佳
PBFT
的主要工作流程是基于三阶段协议的:pre-prepare、prepare、commit
第一阶段:pre-prepare
阶段:主节点将请求广播发送给其他备份阶段
第二阶段:prepare
阶段:所有备份节点将请求广播发送给其他节点,并收到2f个prepare认证
第三节点:commit
阶段:所有节点将请求广播发送给其他节点,并且收到2f+1
个commit认证,回复发送给用户端,用户端就会收到2f+1
个结果 ,结束
扩展性不佳的问题
PBFT
的通信量是O(n^2)
,是强一致性算法,在可用性上进行了让步,当有1/3
或者以上的记账人停止工作的时候,系统将无法提供服务,虽然PBFT
算法性能比原有的拜占庭算法提高了很多,但是其性能会随着节点个数的增加而急剧下降
第六章问答题
简述比特币脚本的执行过程
矿工收到Bob
的交易Tx2
的时候,为了验证交易的合法性,也就是为了确认Bob
是否真正拥有他想要支付的0.1btc
,按照如下步骤执行:
- 找到
Bob
获得这0.1btc
的交易Tx1
,将Tx2
的解锁脚本和Tx1
的锁定脚本进行连接。
这个所谓的连接就是将解锁脚本和锁定脚本进行拼接。
- 将sig
(Bob在Tx2用自己的私钥生成的签名)
入栈
- 将
PubK(Bob在Tx2中出示自己的公钥入栈)
OP_DUP(是操作符)
它将复制栈顶元素,也就是复制一份PubK
并压入栈中。
OP_HASH160(是哈希操作)
,它将计算栈顶元素(PubK)
的哈希值,并对计算出来的结果进行压栈操作
- 将
Alice
在Tx1
指定的接收人公钥的哈希值放入放栈顶
- 然后执行
OP_EQALVERIFY(对比是否相等的)操作
,验证栈顶两个元素是否相等,Bob
出示公钥的哈希值与Alice
给出的公钥哈希值是否一致,如果一致,那么就从堆栈中移除这两个元素,并且执行下面的脚本
- 最终执行
OP_CHECKING
,验证Bob
给出的签名sign
是否由公钥PubK
对应的私钥的产生的,如果验证通过,那么就在栈顶放入TRUE
以太坊用于创建智能合约的交易,其主要字段内容是什么?
字段内容 | 转账(与比特币相同) | 创建智能合约 | 调用智能合约 |
---|---|---|---|
to | 接收账户的地址 | 空(作为创建智能合约的触发条件) | 智能合约账户地址 |
data | 空或者自定义的附加信息 | 编译后的字节码(智能合约代码) | 调用智能合约函数名称及其参数 |
from | 转账发起者 | 智能合约创建者 | 合约调用者账户 |
amount | 转账金额 | 或者合约创建者放在智能合约账户的金额 | 0或者任意数量的金额,支付给智能合约用于购买商品或者服务 |
链码的生存周期
- 安装:链码在编写完成后,需要部署在
Fabric
网络中的Peer
节点上,同时注明版本号,完成安装过程 - 实例化:在
Peer
节点上安装的链码需要经过实例化才能被真正激活可用,实例化的过程包括链码编译、打包、封装Docker
容器镜像等步骤 - 调用:实例化后的链码可以被用户在
Peer
外部进行远程调用,充当用户与账本之间的桥梁,进行查询、写入等操作,调用包括Invoke()或者Query()
查询等操作 - 升级:
Peer
节点上的链码具有可升级的特点,可以把更新版本的链码通过install
操作,安装到当前运行链码的Peer
节点上。
第八章问答题
针对区块链数据的交易聚类分析攻击是一种威胁用户身份隐私的攻击方式,请列举集中本章提到的可以抵抗这种攻击的安全技术,并分别分析原因
- 混币技术:混币能够割裂输入地址和输出地址之间的关系。混币可以让交易者快速、高效地与其他交易者的资金进行混合,在现有的交易账户和混币后的新账户之间建立一种随机的映射关系,从而实现完全匿名
- 环签名技术:环签名方案由群签名演化而来,通过区块链系统中无关节点无法追查到交易的发送方,当其他节点验证交易的时候,只能确定签名是诸多公钥中的一个,却无从定位到哪个公钥才是具体的发送方
- 零知识证明:证明者能够在不向验证者提供任何有用信息的情况下使验证者相信某一论断是正确的,以货币交易为例,就是在不告诉他人付款人、收款人是谁,也不告诉他人金额的前提下,设法证明这笔交易是合法
第九章问答题
比特币系统中,全节点与钱包节点的区别是什么?分别有什么作用?
全节点:维持包含有全部交易信息的完整区块链节点,为完整区块节点,保存有全部的交易数据
钱包节点:为用户提供交互界面,不同平台有不同的钱包,用户通过钱包进行交易和查询自己的比特币数量,钱包是用户操作比特币的接口
第十章问答题
简述以太坊外部账户与合约账户的定义与异同点
外部账户:由私钥控制,没有与之关联的代码
合约账户:由合约代码控制,有与之关联的代码
通过创建并使用私钥签名一个交易,外部账户能够给其他外部账户或者其他合约账户发送消息,两个外部账户之间的消息只是简单的价值传输,但从外部账户发送到合约账户的消息可以激活合约账户的代码,允许它执行各种操作。
与外部账户不同的是,合约账户无法自行启动新的交易,相反,合约账户仅能够通过响应它们收到的交易来触发自身的交易。任何以太坊上发生的操作失踪都是由外部账户所触发的交易来启动的。
为了让交易能够更快地执行,交易发送者应该设置较高的燃料价格还是较低的燃料价格?为什么?
交易发送者愿意支付燃料价格越高,则矿工从交易中获得的价值越大,矿工会选择价格高的交易,则交易发送者应该设置较高的燃料价格。
如果发送者没有提供足够哦的gas
来执行交易,那么交易执行就会出现gas
不足,然后被认为是无效的
在这种情况下,交易处理就会被终止以及所有已改变的状态将会被恢复,最后又变为交易之前的状态。
第十一章问答题
Fabric具有哪些类型的节点?分别具有什么功能?
- 客户端用户:创建交易并且提交交易到背书节点中
- Peer节点:接收客户端的交易请求,提交交易到排序节点中,
Peer
节点之间通过gRPC
消息进行通信,按照实际功能,可以分为背书节点、记账节点、锚节点、主节点 - 排序节点:在区块链网络中的作用是原子广播和全排序,也就是对全网的所有的交易进行排序后打包。
什么是通道?其主要作用是什么?
通道:满足数据的安全性和访问控制要求,通道由成员(组织)、组织锚节点、账本、链码应用程序和排序服务节点所定义。
作用:每一方必须经过身份验证和授权,才能在该通道上进行交易,同一通道的节点共享一条完整的区块链,该通道上的所有配置和交易、账本、身份、链码实例都是共享的,这些数据在不同的通道节点上是相互隔离的。
简述Fabric的交易流程